| 112 | | static void expando_signals_add_hash(const char *key, SV *signals) | | 113 | | { | | 114 | | HV *hv; | | 115 | | HE *he; | | 116 | | I32 len; | | 117 | | const char *argstr; | | 118 | | ExpandoArg arg; | | 119 | | | | 120 | | if (!is_hvref(signals)) {
| | 121 | | croak("Usage: ::expando_create(key, func, hash)");
| | 122 | | return; | | 123 | | } | | 124 | | | | 125 | | hv = hvref(signals);
| | 126 | | hv_iterinit(hv);
| | 127 | | while ((he = hv_iternext(hv)) != NULL) {
| | 128 | | SV *argsv = HeVAL(he);
| | 129 | | argstr = SvPV(argsv, PL_na);
| | 130 | | | | 131 | | if (g_ascii_strcasecmp(argstr, "none") == 0) | | 132 | | arg = EXPANDO_ARG_NONE; | | 133 | | else if (g_ascii_strcasecmp(argstr, "server") == 0) | | 134 | | arg = EXPANDO_ARG_SERVER; | | 135 | | else if (g_ascii_strcasecmp(argstr, "window") == 0) | | 136 | | arg = EXPANDO_ARG_WINDOW; | | 137 | | else if (g_ascii_strcasecmp(argstr, "windowitem") == 0) | | 138 | | arg = EXPANDO_ARG_WINDOW_ITEM; | | 139 | | else if (g_ascii_strcasecmp(argstr, "never") == 0) | | 140 | | arg = EXPANDO_NEVER; | | 141 | | else { | | 142 | | croak("Unknown signal type: %s", argstr);
| | 143 | | break; | | 144 | | } | | 145 | | expando_add_signal(key, hv_iterkey(he, &len), arg);
| | 146 | | } | | 147 | | } |
|