… | |
… | |
136 | inline SV *to_sv (unsigned long v) { return newSVuv (v); } |
136 | inline SV *to_sv (unsigned long v) { return newSVuv (v); } |
137 | inline SV *to_sv ( signed long long v) { return newSVval64 (v); } |
137 | inline SV *to_sv ( signed long long v) { return newSVval64 (v); } |
138 | inline SV *to_sv (unsigned long long v) { return newSVval64 (v); } |
138 | inline SV *to_sv (unsigned long long v) { return newSVval64 (v); } |
139 | inline SV *to_sv (float v) { return newSVnv (v); } |
139 | inline SV *to_sv (float v) { return newSVnv (v); } |
140 | inline SV *to_sv (double v) { return newSVnv (v); } |
140 | inline SV *to_sv (double v) { return newSVnv (v); } |
141 | inline SV *to_sv (client_socket *v) { return newSVattachable (v, "cf::client_socket::wrap"); } |
141 | inline SV *to_sv (client * v) { return newSVattachable (v, "cf::client::wrap"); } |
142 | inline SV *to_sv (player * v) { return newSVattachable (v, "cf::player::wrap"); } |
142 | inline SV *to_sv (player * v) { return newSVattachable (v, "cf::player::wrap"); } |
143 | inline SV *to_sv (object * v) { return newSVattachable (v, v && v->type == PLAYER ? "cf::object::player::wrap" : "cf::object::wrap"); } |
143 | inline SV *to_sv (object * v) { return newSVattachable (v, v && v->type == PLAYER ? "cf::object::player::wrap" : "cf::object::wrap"); } |
144 | inline SV *to_sv (maptile * v) { return newSVattachable (v, "cf::map::wrap"); } |
144 | inline SV *to_sv (maptile * v) { return newSVattachable (v, "cf::map::wrap"); } |
145 | inline SV *to_sv (archetype * v) { return newSVptr (v, "cf::arch::wrap"); } |
145 | inline SV *to_sv (archetype * v) { return newSVptr (v, "cf::arch::wrap"); } |
146 | inline SV *to_sv (partylist * v) { return newSVptr (v, "cf::party::wrap"); } |
146 | inline SV *to_sv (partylist * v) { return newSVptr (v, "cf::party::wrap"); } |
… | |
… | |
174 | inline void sv_to (SV *sv, unsigned long &v) { v = SvUV (sv); } |
174 | inline void sv_to (SV *sv, unsigned long &v) { v = SvUV (sv); } |
175 | inline void sv_to (SV *sv, signed long long &v) { v = ( signed long long)SvVAL64 (sv); } |
175 | inline void sv_to (SV *sv, signed long long &v) { v = ( signed long long)SvVAL64 (sv); } |
176 | inline void sv_to (SV *sv, unsigned long long &v) { v = (unsigned long long)SvVAL64 (sv); } |
176 | inline void sv_to (SV *sv, unsigned long long &v) { v = (unsigned long long)SvVAL64 (sv); } |
177 | inline void sv_to (SV *sv, float &v) { v = SvNV (sv); } |
177 | inline void sv_to (SV *sv, float &v) { v = SvNV (sv); } |
178 | inline void sv_to (SV *sv, double &v) { v = SvNV (sv); } |
178 | inline void sv_to (SV *sv, double &v) { v = SvNV (sv); } |
179 | inline void sv_to (SV *sv, client_socket *&v) { v = (client_socket *)SvPTR_ornull (sv, "cf::client_socket"); } |
179 | inline void sv_to (SV *sv, client * &v) { v = (client *)SvPTR_ornull (sv, "cf::client"); } |
180 | inline void sv_to (SV *sv, player * &v) { v = (player *)SvPTR_ornull (sv, "cf::player"); } |
180 | inline void sv_to (SV *sv, player * &v) { v = (player *)SvPTR_ornull (sv, "cf::player"); } |
181 | inline void sv_to (SV *sv, object * &v) { v = (object *)SvPTR_ornull (sv, "cf::object"); } |
181 | inline void sv_to (SV *sv, object * &v) { v = (object *)SvPTR_ornull (sv, "cf::object"); } |
182 | inline void sv_to (SV *sv, archetype * &v) { v = (archetype *)SvPTR_ornull (sv, "cf::arch"); } |
182 | inline void sv_to (SV *sv, archetype * &v) { v = (archetype *)SvPTR_ornull (sv, "cf::arch"); } |
183 | inline void sv_to (SV *sv, maptile * &v) { v = (maptile *)SvPTR_ornull (sv, "cf::map"); } |
183 | inline void sv_to (SV *sv, maptile * &v) { v = (maptile *)SvPTR_ornull (sv, "cf::map"); } |
184 | inline void sv_to (SV *sv, partylist * &v) { v = (partylist *)SvPTR_ornull (sv, "cf::party"); } |
184 | inline void sv_to (SV *sv, partylist * &v) { v = (partylist *)SvPTR_ornull (sv, "cf::party"); } |
… | |
… | |
244 | // va_arg (object *) when void * is passed is an XSI extension |
244 | // va_arg (object *) when void * is passed is an XSI extension |
245 | sv = to_sv (va_arg (ap, maptile *)); |
245 | sv = to_sv (va_arg (ap, maptile *)); |
246 | break; |
246 | break; |
247 | |
247 | |
248 | case DT_SOCKET: |
248 | case DT_SOCKET: |
249 | sv = to_sv (va_arg (ap, client_socket *)); |
249 | sv = to_sv (va_arg (ap, client *)); |
250 | break; |
250 | break; |
251 | |
251 | |
252 | case DT_PLAYER: |
252 | case DT_PLAYER: |
253 | sv = to_sv (va_arg (ap, player *)); |
253 | sv = to_sv (va_arg (ap, player *)); |
254 | break; |
254 | break; |
… | |
… | |
835 | |
835 | |
836 | char *argv[] = { |
836 | char *argv[] = { |
837 | "", |
837 | "", |
838 | "-e" |
838 | "-e" |
839 | "use Event;" // required for bootstrap |
839 | "use Event;" // required for bootstrap |
840 | "cf->bootstrap;" // requiored for datadir :*> |
840 | "cf->bootstrap;" // required for datadir :*> |
841 | "unshift @INC, cf::datadir ();" |
841 | "unshift @INC, cf::datadir ();" |
842 | "require cf;" |
842 | "require cf;" |
843 | }; |
843 | }; |
844 | |
844 | |
845 | if (perl_parse (perl, xs_init, 2, argv, (char **)NULL) || perl_run (perl)) |
845 | if (perl_parse (perl, xs_init, 2, argv, (char **)NULL) || perl_run (perl)) |
… | |
… | |
1060 | |
1060 | |
1061 | ///////////////////////////////////////////////////////////////////////////// |
1061 | ///////////////////////////////////////////////////////////////////////////// |
1062 | |
1062 | |
1063 | struct EventAPI *watcher_base::GEventAPI; |
1063 | struct EventAPI *watcher_base::GEventAPI; |
1064 | |
1064 | |
|
|
1065 | static void iw_dispatch (pe_event *ev) |
|
|
1066 | { |
|
|
1067 | iw *w = (iw *)ev->ext_data; |
|
|
1068 | w->call (*w); |
|
|
1069 | } |
|
|
1070 | |
|
|
1071 | void |
|
|
1072 | iw::alloc () |
|
|
1073 | { |
|
|
1074 | pe = GEventAPI->new_idle (0, 0); |
|
|
1075 | |
|
|
1076 | pe->base.callback = (void *)iw_dispatch; |
|
|
1077 | pe->base.ext_data = (void *)this; |
|
|
1078 | } |
|
|
1079 | |
1065 | static void iow_dispatch (pe_event *ev) |
1080 | static void iow_dispatch (pe_event *ev) |
1066 | { |
1081 | { |
1067 | iow *w = (iow *)ev->ext_data; |
1082 | iow *w = (iow *)ev->ext_data; |
1068 | w->call (*w, ((pe_ioevent *)ev)->got); |
1083 | w->call (*w, ((pe_ioevent *)ev)->got); |
1069 | } |
1084 | } |
… | |
… | |
1078 | |
1093 | |
1079 | pe->fd = -1; |
1094 | pe->fd = -1; |
1080 | pe->poll = 0; |
1095 | pe->poll = 0; |
1081 | } |
1096 | } |
1082 | |
1097 | |
1083 | iow & |
1098 | void |
1084 | iow::fd (int fd) |
1099 | iow::fd (int fd) |
1085 | { |
1100 | { |
1086 | pe->fd = fd; |
1101 | pe->fd = fd; |
1087 | |
|
|
1088 | return *this; |
|
|
1089 | } |
1102 | } |
1090 | |
1103 | |
1091 | int |
1104 | int |
1092 | iow::poll () |
1105 | iow::poll () |
1093 | { |
1106 | { |
1094 | return pe->poll; |
1107 | return pe->poll; |
1095 | } |
1108 | } |
1096 | |
1109 | |
1097 | iow & |
1110 | void |
1098 | iow::poll (int events) |
1111 | iow::poll (int events) |
1099 | { |
1112 | { |
1100 | if (pe->poll != events) |
1113 | if (pe->poll != events) |
1101 | { |
1114 | { |
1102 | if (pe->poll) stop (); |
1115 | if (pe->poll) stop (); |
1103 | pe->poll = events; |
1116 | pe->poll = events; |
1104 | if (pe->poll) start (); |
1117 | if (pe->poll) start (); |
1105 | } |
1118 | } |
1106 | |
|
|
1107 | return *this; |
|
|
1108 | } |
1119 | } |
1109 | |
1120 | |
1110 | MODULE = cf PACKAGE = cf PREFIX = cf_ |
1121 | MODULE = cf PACKAGE = cf PREFIX = cf_ |
1111 | |
1122 | |
1112 | BOOT: |
1123 | BOOT: |
… | |
… | |
1658 | for (object *op = object::first; op; op = op->next) |
1669 | for (object *op = object::first; op; op = op->next) |
1659 | reattach (op); |
1670 | reattach (op); |
1660 | } |
1671 | } |
1661 | |
1672 | |
1662 | bool |
1673 | bool |
1663 | add_client_socket (int fd, const char *peername) |
1674 | add_client (int fd, const char *peername) |
1664 | |
1675 | |
1665 | NV floor (NV x) |
1676 | NV floor (NV x) |
1666 | |
1677 | |
1667 | NV ceil (NV x) |
1678 | NV ceil (NV x) |
1668 | |
1679 | |
… | |
… | |
2422 | |
2433 | |
2423 | MODULE = cf PACKAGE = cf::settings |
2434 | MODULE = cf PACKAGE = cf::settings |
2424 | |
2435 | |
2425 | INCLUDE: $PERL genacc Settings ../include/global.h | |
2436 | INCLUDE: $PERL genacc Settings ../include/global.h | |
2426 | |
2437 | |
2427 | MODULE = cf PACKAGE = cf::client_socket |
2438 | MODULE = cf PACKAGE = cf::client |
2428 | |
2439 | |
2429 | INCLUDE: $PERL genacc client_socket ../include/newserver.h | |
2440 | INCLUDE: $PERL genacc client ../include/client.h | |
2430 | |
2441 | |
2431 | int invoke (client_socket *ns, int event, ...) |
2442 | int invoke (client *ns, int event, ...) |
2432 | CODE: |
2443 | CODE: |
2433 | if (KLASS_OF (event) != KLASS_SOCKET) croak ("event class must be SOCKET"); |
2444 | if (KLASS_OF (event) != KLASS_SOCKET) croak ("event class must be SOCKET"); |
2434 | AV *av = (AV *)sv_2mortal ((SV *)newAV ()); |
2445 | AV *av = (AV *)sv_2mortal ((SV *)newAV ()); |
2435 | for (int i = 2; i < items; i++) av_push (av, SvREFCNT_inc (ST (i))); |
2446 | for (int i = 2; i < items; i++) av_push (av, SvREFCNT_inc (ST (i))); |
2436 | RETVAL = INVOKE_((event_type)event, ARG_SOCKET (ns), ARG_AV (av)); |
2447 | RETVAL = INVOKE_((event_type)event, ARG_SOCKET (ns), ARG_AV (av)); |
2437 | OUTPUT: RETVAL |
2448 | OUTPUT: RETVAL |
2438 | |
2449 | |
2439 | SV *registry (client_socket *ns) |
2450 | SV *registry (client *ns) |
2440 | |
2451 | |