PyObject *ekg_config_set(ekg_configObj * self, PyObject * key, PyObject * value) { char *name = PyString_AsString(key); variable_t *v; debug("[python] Setting '%s' config option to '%s'\n", name, PyString_AsString(value)); v = variable_find(name); if (!v) { PyErr_SetString(PyExc_LookupError, "unknown variable"); return NULL; } if (v->type == VAR_INT || v->type == VAR_BOOL || v->type == VAR_MAP) { if (!PyInt_Check(value)) { PyErr_SetString(PyExc_TypeError, "invalid type"); return NULL; } variable_set(name, ekg_itoa(PyInt_AsLong(value))); } else { if (!PyString_Check(value)) { PyErr_SetString(PyExc_TypeError, "invalid type"); return NULL; } variable_set(name, PyString_AsString(value)); } Py_INCREF(Py_None); return Py_None; }
static PyObject *ekg_config_getattr(PyObject *o, char *name) { struct variable *v = variable_find(name); if (!v) { PyErr_SetString(PyExc_LookupError, "unknown variable"); return NULL; } if (v->type == VAR_BOOL || v->type == VAR_INT || v->type == VAR_MAP) return Py_BuildValue("i", *(int*)(v->ptr)); else return Py_BuildValue("s", *(char**)(v->ptr)); }
static inline struct variable *cfnc_find2(struct context *context, bool has) { struct variable *args = (struct variable*)stack_pop(context->operand_stack); struct variable *self = (struct variable*)array_get(args->list.ordered, 0); struct variable *sought = (struct variable*)array_get(args->list.ordered, 1); struct variable *start = args->list.ordered->length > 2 ? (struct variable*)array_get(args->list.ordered, 2) : NULL; null_check(self); null_check(sought); struct variable *result = variable_find(context, self, sought, start); if (has) return variable_new_bool(context, result->integer != -1); return result; }
static int ekg_config_setattr(PyObject *o, char *name, PyObject *value) { struct variable *v = variable_find(name); if (!v) { PyErr_SetString(PyExc_LookupError, "unknown variable"); return -1; } if (value == NULL) { PyErr_SetString(PyExc_TypeError, "can't delete config variables"); return -1; } if (v->type == VAR_INT || v->type == VAR_BOOL || v->type == VAR_MAP) { if (!PyInt_Check(value)) { PyErr_SetString(PyExc_TypeError, "invalid type"); return -1; } if (variable_set(name, itoa(PyInt_AsLong(value)), 0)) { PyErr_SetString(PyExc_ValueError, "invalid value"); return -1; } } else { if (!PyString_Check(value)) { PyErr_SetString(PyExc_TypeError, "invalid type"); return -1; } if (variable_set(name, PyString_AsString(value), 0)) { PyErr_SetString(PyExc_ValueError, "invalid value"); return -1; } } return 0; }
/* * variable_set() * * ustawia warto¶æ podanej zmiennej. je¶li to zmienna liczbowa lub boolowska, * zmienia ci±g na liczbê. w przypadku boolowskich, rozumie zwroty typu `on', * `off', `yes', `no' itp. je¶li dana zmienna jest bitmap±, akceptuje warto¶æ * w postaci listy flag oraz konstrukcje `+flaga' i `-flaga'. * * - name - nazwa zmiennej, * - value - nowa warto¶æ, * - allow_foreign - czy ma pozwalaæ dopisywaæ obce zmienne. */ int variable_set(const char *name, const char *value, int allow_foreign) { struct variable *v = variable_find(name); if (!v && allow_foreign) { variable_add(name, "##", VAR_FOREIGN, 2, xstrdup(value), NULL, NULL, NULL); return -1; } if (!v && !allow_foreign) return -1; switch (v->type) { case VAR_INT: case VAR_MAP: { const char *p = value; int hex, tmp; if (!value) return -2; if (v->map && v->type == VAR_INT && !xisdigit(*p)) { int i; for (i = 0; v->map[i].label; i++) if (!strcasecmp(v->map[i].label, value)) value = itoa(v->map[i].value); } if (v->map && v->type == VAR_MAP && !xisdigit(*p)) { int i, k = *(int*)(v->ptr); int mode = 0; /* 0 set, 1 add, 2 remove */ char **args; if (*p == '+') { mode = 1; p++; } else if (*p == '-') { mode = 2; p++; } if (!mode) k = 0; args = array_make(p, ",", 0, 1, 0); for (i = 0; args[i]; i++) { int j, found = 0; for (j = 0; v->map[j].label; j++) { if (!strcasecmp(args[i], v->map[j].label)) { found = 1; if (mode == 2) k &= ~(v->map[j].value); if (mode == 1) k &= ~(v->map[j].conflicts); if (mode == 1 || !mode) k |= v->map[j].value; } } if (!found) { array_free(args); return -2; } } array_free(args); value = itoa(k); } p = value; if ((hex = !strncasecmp(p, "0x", 2))) p += 2; while (*p && *p != ' ') { if (hex && !xisxdigit(*p)) return -2; if (!hex && !xisdigit(*p)) return -2; p++; } tmp = strtol(value, NULL, 0); if (v->map) { int i; for (i = 0; v->map[i].label; i++) { if ((tmp & v->map[i].value) && (tmp & v->map[i].conflicts)) return -2; } } *(int*)(v->ptr) = tmp; if (v->notify) (v->notify)(v->name); if (ui_event) ui_event("variable_changed", v->name); return 0; } case VAR_BOOL: { int tmp; if (!value) return -2; if ((tmp = on_off(value)) == -1) return -2; *(int*)(v->ptr) = tmp; if (v->notify) (v->notify)(v->name); if (ui_event) ui_event("variable_changed", v->name); return 0; } case VAR_STR: { char **tmp = (char**)(v->ptr); xfree(*tmp); if (value) { if (*value == 1) *tmp = base64_decode(value + 1); else *tmp = xstrdup(value); } else *tmp = NULL; if (v->notify) (v->notify)(v->name); if (ui_event) ui_event("variable_changed", v->name); return 0; } } return -1; }
/* * variable_help() * * it shows help about variable from file ${datadir}/ekg/vars.txt * or ${datadir}/ekg/plugins/{plugin_name}/vars.txt * * name - name of the variable */ void variable_help(const char *name) { GIOChannel *f; gchar *type = NULL, *def = NULL, *tmp; const gchar *line, *seeking_name; string_t s; int found = 0; variable_t *v = variable_find(name); if (!v) { print("variable_not_found", name); return; } if (v->plugin && v->plugin->name) { char *tmp2; if (!(f = help_open("vars", v->plugin->name))) { print("help_set_file_not_found_plugin", v->plugin->name); return; } tmp2 = xstrchr(name, ':'); if (tmp2) seeking_name = tmp2+1; else seeking_name = name; } else { if (!(f = help_open("vars", NULL))) { print("help_set_file_not_found"); return; } seeking_name = name; } while ((line = read_line(f))) { if (!xstrcasecmp(line, seeking_name)) { found = 1; break; } } if (!found) { g_io_channel_unref(f); print("help_set_var_not_found", name); return; } line = read_line(f); if ((tmp = xstrstr(line, (": ")))) type = xstrdup(tmp + 2); else type = xstrdup(("?")); line = read_line(f); if ((tmp = xstrstr(line, (": ")))) def = xstrdup(tmp + 2); else def = xstrdup(("?")); print("help_set_header", name, type, def); xfree(type); xfree(def); if (tmp) /* je¶li nie jest to ukryta zmienna... */ read_line(f); /* ... pomijamy liniê */ s = string_init(NULL); while ((line = read_line(f))) { if (line[0] != '\t') break; if (!xstrncmp(line, ("\t- "), 3) && xstrcmp(s->str, (""))) { print("help_set_body", s->str); string_clear(s); } if (!xstrncmp(line, ("\t"), 1) && xstrlen(line) == 1) { string_append(s, ("\n\r")); continue; } string_append(s, line + 1); if (line[xstrlen(line) - 1] != ' ') string_append_c(s, ' '); } if (xstrcmp(s->str, (""))) print("help_set_body", s->str); string_free(s, 1); if (format_exists("help_set_footer")) print("help_set_footer", name); g_io_channel_unref(f); }
/* * variable_set() * * ustawia warto¶æ podanej zmiennej. je¶li to zmienna liczbowa lub boolowska, * zmienia ci±g na liczbê. w przypadku boolowskich, rozumie zwroty typu `on', * `off', `yes', `no' itp. je¶li dana zmienna jest bitmap±, akceptuje warto¶æ * w postaci listy flag oraz konstrukcje `+flaga' i `-flaga'. * * - name - nazwa zmiennej, * - value - nowa warto¶æ, */ int variable_set(const char *name, const char *value) { variable_t *v = variable_find(name); char *tmpname; int changed = 0; if (!v) return -1; switch (v->type) { case VAR_INT: case VAR_MAP: { const char *p = value; int hex, tmp; if (!value) return -2; if (v->map && v->type == VAR_INT && !xisdigit(*p)) { int i; for (i = 0; v->map[i].label; i++) if (!xstrcasecmp(v->map[i].label, value)) value = ekg_itoa(v->map[i].value); } if (v->map && v->type == VAR_MAP && !xisdigit(*p)) { int i, k = *(int*)(v->ptr); int mode = 0; /* 0 set, 1 add, 2 remove */ char **args; if (*p == '+') { mode = 1; p++; } else if (*p == '-') { mode = 2; p++; } if (!mode) k = 0; args = array_make(p, ",", 0, 1, 0); for (i = 0; args[i]; i++) { int j, found = 0; for (j = 0; v->map[j].label; j++) { if (!xstrcasecmp(args[i], v->map[j].label)) { found = 1; if (mode == 2) k &= ~(v->map[j].value); if (mode == 1) k &= ~(v->map[j].conflicts); if (mode == 1 || !mode) k |= v->map[j].value; } } if (!found) { g_strfreev(args); return -2; } } g_strfreev(args); value = ekg_itoa(k); } p = value; if ((hex = !xstrncasecmp(p, "0x", 2))) p += 2; while (*p && *p != ' ') { if (hex && !xisxdigit(*p)) return -2; if (!hex && !xisdigit(*p)) return -2; p++; } tmp = strtol(value, NULL, 0); if (v->map) { int i; for (i = 0; v->map[i].label; i++) { if ((tmp & v->map[i].value) && (tmp & v->map[i].conflicts)) return -2; } } changed = (*(int*)(v->ptr) != tmp); *(int*)(v->ptr) = tmp; break; } case VAR_BOOL: { int tmp; if (!value) return -2; if ((tmp = on_off(value)) == -1) return -2; changed = (*(int*)(v->ptr) != tmp); *(int*)(v->ptr) = tmp; break; } case VAR_THEME: case VAR_FILE: case VAR_DIR: case VAR_STR: { char **tmp = (char**)(v->ptr); char *oldval = *tmp; if (value) { if (*value == 1) *tmp = base64_decode(value + 1); else *tmp = xstrdup(value); } else *tmp = NULL; changed = xstrcmp(oldval, *tmp); xfree(oldval); break; } default: return -1; } if (v->notify) (v->notify)(v->name); if (!changed) return 1; tmpname = xstrdup(v->name); query_emit(NULL, "variable-changed", &tmpname); xfree(tmpname); return 0; }