static void set_cset_var_value(CSetList *tmp, int var_index, char *value) { char *rest; CSetArray *var; var = &(cset_array[var_index]); switch (var->type) { case BOOL_TYPE_VAR: if (value && *value && (value = next_arg(value, &rest))) { if (do_boolean(value, (int *)get_cset_int_var_address(tmp, var_index))) { say("Value must be either ON, OFF, or TOGGLE"); break; } if (var->func) var->func(var, tmp); put_it("%s", convert_output_format(fget_string_var(FORMAT_CSET_FSET), "%s %s %s", var->name, tmp->channel, get_cset_int_var(tmp, var_index)?var_settings[ON] : var_settings[OFF])); } else put_it("%s", convert_output_format(fget_string_var(FORMAT_CSET_FSET), "%s %s %s", var->name, tmp->channel, get_cset_int_var(tmp, var_index)?var_settings[ON] : var_settings[OFF])); break; case INT_TYPE_VAR: if (value && *value && (value = next_arg(value, &rest))) { int val; if (!is_number(value)) { say("Value of %s must be numeric!", var->name); break; } if ((val = atoi(value)) < 0) { say("Value of %s must be greater than 0", var->name); break; } set_cset_int_var(tmp, var_index, val); if (var->func) var->func(var, tmp); put_it("%s", convert_output_format(fget_string_var(FORMAT_CSET_FSET), "%s %s %d", var->name, tmp->channel, get_cset_int_var(tmp, var_index))); } else put_it("%s", convert_output_format(fget_string_var(FORMAT_CSET_FSET), "%s %s %d", var->name, tmp->channel, get_cset_int_var(tmp, var_index))); break; case STR_TYPE_VAR: if (value && *value) { set_cset_str_var(tmp, var_index, value); if (var->func) var->func(var, tmp); put_it("%s", convert_output_format(fget_string_var(FORMAT_CSET_FSET), "%s %s %s", var->name, tmp->channel, get_cset_str_var(tmp, var_index) )); } else put_it("%s", convert_output_format(fget_string_var(FORMAT_CSET_FSET), "%s %s %s", var->name, tmp->channel, (char *)get_cset_str_var(tmp, var_index))); } }
/* * set_var_value: Given the variable structure and the string representation * of the value, this sets the value in the most verbose and error checking * of manors. It displays the results of the set and executes the function * defined in the var structure */ int set_variable (const char *name, IrcVariable *var, const char *orig_value, int noisy) { char *rest; int changed = 0; unsigned char *value; int retval = 0; if (orig_value) value = LOCAL_COPY(orig_value); else value = NULL; switch (var->type) { case BOOL_VAR: { if (value && *value && (value = next_arg(value, &rest))) { if (do_boolean(value, &(var->data->integer))) { say("Value must be either ON, OFF, or TOGGLE"); retval = -1; } else changed = 1; } break; } case CHAR_VAR: { int codepoint; if (!value || !*value) { var->data->integer = ' '; changed = 1; break; } if ((codepoint = next_code_point((const unsigned char **)&value, 0)) == -1) { say("New value of %s could not be determined", name); retval = -1; break; } if (codepoint_numcolumns(codepoint) != 1) { say("New value of %s must be exactly 1 column wide", name); retval = -1; break; } var->data->integer = codepoint; changed = 1; break; } case INT_VAR: { if (value && *value && (value = next_arg(value, &rest))) { int val; if (!is_number(value)) { say("Value of %s must be numeric!", name); retval = -1; } else if ((val = my_atol(value)) < 0) { say("Value of %s must be a non-negative number", name); retval = -1; } else { var->data->integer = val; changed = 1; } } break; } case STR_VAR: { if (!value) { new_free(&(var->data->string)); changed = 1; } else if (*value) { malloc_strcpy(&(var->data->string), value); changed = 1; } } } if (changed) { if ((var->func || var->script) && !(var->flags & VIF_PENDING)) { var->flags |= VIF_PENDING; if (var->func) (var->func)(var->data); if (var->script) { char *s; int owd = window_display; s = make_string_var_bydata(var->type, (void *)var->data); window_display = 0; call_lambda_command("SET", var->script, s); window_display = owd; new_free(&s); } var->flags &= ~VIF_PENDING; } } if (noisy) show_var_value(name, var, changed); return retval; }
void set_var_value(int var_index, char *value, IrcVariable *dll) { char *rest; IrcVariable *var; int old; var = &(irc_variable[var_index]); switch (var->type) { case BOOL_TYPE_VAR: if (value && *value && (value = next_arg(value, &rest))) { old = var->integer; if (do_boolean(value, &(var->integer))) { say("Value must be either ON, OFF, or TOGGLE"); break; } if (!(var->int_flags & VIF_CHANGED)) { if (old != var->integer) var->int_flags |= VIF_CHANGED; } if (var->func) (var->func) (current_window, NULL, var->integer); say("Value of %s set to %s", var->name, var->integer ? var_settings[ON] : var_settings[OFF]); } else say("Value of %s -> %s", var->name, var->integer?var_settings[ON] : var_settings[OFF]); break; case CHAR_TYPE_VAR: if (!value) { if (!(var->int_flags & VIF_CHANGED)) { if (var->integer) var->int_flags |= VIF_CHANGED; } var->integer = ' '; if (var->func) (var->func) (current_window, NULL, var->integer); say("Value of %s set to '%c'", var->name, var->integer); } else if (value && *value && (value = next_arg(value, &rest))) { if (strlen(value) > 1) say("Value of %s must be a single character", var->name); else { if (!(var->int_flags & VIF_CHANGED)) { if (var->integer != *value) var->int_flags |= VIF_CHANGED; } var->integer = *value; if (var->func) (var->func) (current_window, NULL, var->integer); say("Value of %s set to '%c'", var->name, var->integer); } } else say("Value of %s -> %c", var->name, var->integer); break; case INT_TYPE_VAR: if (value && *value && (value = next_arg(value, &rest))) { int val; if (!is_number(value)) { say("Value of %s must be numeric!", var->name); break; } if ((val = my_atol(value)) < 0) { say("Value of %s must be greater than 0", var->name); break; } if (!(var->int_flags & VIF_CHANGED)) { if (var->integer != val) var->int_flags |= VIF_CHANGED; } var->integer = val; if (var->func) (var->func) (current_window, NULL, var->integer); say("Value of %s set to %d", var->name, var->integer); } else say("Value of %s -> %d", var->name, var->integer); break; case STR_TYPE_VAR: if (value) { if (*value) { char *temp = NULL; if (var->flags & VF_EXPAND_PATH) { temp = expand_twiddle(value); if (temp) value = temp; else say("SET: no such user"); } if ((!var->int_flags & VIF_CHANGED)) { if ((var->string && ! value) || (! var->string && value) || my_stricmp(var->string, value)) var->int_flags |= VIF_CHANGED; } malloc_strcpy(&(var->string), value); if (temp) new_free(&temp); } else { say("Value of %s -> %s", var->name, var->string ? var->string : "<null>"); return; } } else new_free(&(var->string)); if (var->func && !(var->int_flags & VIF_PENDING)) { var->int_flags |= VIF_PENDING; (var->func) (current_window, var->string, 0); var->int_flags &= ~VIF_PENDING; } say("Value of %s set to %s", var->name, var->string ? var->string : "<EMPTY>"); break; } }