static int rule_add(char *lhs, char *rhs) { int err= 0; if(lhs && *lhs) { int c; rule_t **R; for(R=&rules[0], c= (int)(unsigned char)*lhs; c && (err==0); c= (int)(unsigned char)*++lhs) { if( !R[c] ) R[c]= rule_new(); if(R[c]) { if(lhs[1]) R= R[c]->rules; else R[c]->rhs= (rhs ? rhs : ""); /* Fri Feb 24 18:20:39 1995 */ } else err= 2; } } else err= 1; return err; }
rule_t *rule_first(xmlDocPtr doc) { xmlNodePtr curNode; curNode = xmlDocGetRootElement(doc); if(curNode == NULL) return NULL; curNode = curNode->xmlChildrenNode; if(curNode == NULL) return NULL; curNode = curNode->next; // because curNode is text node \r\t return rule_new(curNode); }
rule_t *rule_findby(xmlDocPtr doc,const char *name) { xmlXPathContextPtr context; xmlXPathObjectPtr xpathObj; context = xmlXPathNewContext(doc); char path[PATH_SIZE]; snprintf(path, PATH_SIZE, "//rule[@name='%s']", name); xpathObj = xmlXPathEvalExpression((xmlChar *)path, context); xmlXPathFreeContext(context); if(xpathObj == NULL) return NULL; xmlNodePtr node = xpathObj->nodesetval->nodeTab[0]; return rule_new(node); }
void itemset_add_rule (itemSetPtr itemSet, const gchar *ruleId, const gchar *value, gboolean additive) { rulePtr rule; rule = rule_new (ruleId, value, additive); if (rule) itemSet->rules = g_slist_append (itemSet->rules, rule); else g_warning ("unknown search folder rule id: \"%s\"", ruleId); }
static void do_ruletype_changed (struct changeRequest *changeRequest) { ruleInfoPtr ruleInfo; rulePtr rule; rule = g_object_get_data (G_OBJECT (changeRequest->paramHBox), "rule"); if (rule) { changeRequest->editor->priv->newRules = g_slist_remove (changeRequest->editor->priv->newRules, rule); rule_free (rule); } ruleInfo = g_slist_nth_data (rule_get_available_rules (), changeRequest->rule); rule = rule_new (ruleInfo->ruleId, "", TRUE); changeRequest->editor->priv->newRules = g_slist_append (changeRequest->editor->priv->newRules, rule); rule_editor_setup_widgets (changeRequest, rule); }
void rule_editor_add_rule (RuleEditor *re, rulePtr rule) { GSList *ruleIter; GtkWidget *hbox, *hbox2, *widget; GtkListStore *store; struct changeRequest *changeRequest, *selected = NULL; gint i = 0, active = 0; hbox = gtk_hbox_new (FALSE, 2); /* hbox to contain all rule widgets */ hbox2 = gtk_hbox_new (FALSE, 2); /* another hbox where the rule specific widgets are added */ /* set up the rule type selection popup */ store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); ruleIter = rule_get_available_rules (); while (ruleIter) { ruleInfoPtr ruleInfo = (ruleInfoPtr)ruleIter->data; GtkTreeIter iter; /* we add a change request to each popup option */ changeRequest = g_new0 (struct changeRequest, 1); changeRequest->paramHBox = hbox2; changeRequest->rule = i; changeRequest->editor = re; if (0 == i) selected = changeRequest; /* build the menu option */ gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, ruleInfo->title, 1, changeRequest, -1); if (rule) { if (ruleInfo == rule->ruleInfo) { selected = changeRequest; active = i; } } ruleIter = g_slist_next (ruleIter); i++; } widget = gtk_combo_box_new (); ui_common_setup_combo_text (GTK_COMBO_BOX (widget), 0); gtk_combo_box_set_model (GTK_COMBO_BOX (widget), GTK_TREE_MODEL (store)); gtk_combo_box_set_active (GTK_COMBO_BOX (widget), active); g_signal_connect (G_OBJECT (widget), "changed", G_CALLBACK (on_ruletype_changed), NULL); gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), hbox2, FALSE, FALSE, 0); if (!rule) { /* fake a rule type change to initialize parameter widgets */ do_ruletype_changed (selected); } else { rulePtr newRule = rule_new (rule->ruleInfo->ruleId, rule->value, rule->additive); /* set up widgets with existing rule type and value */ rule_editor_setup_widgets (selected, newRule); /* add the rule to the list of new rules */ re->priv->newRules = g_slist_append (re->priv->newRules, newRule); } /* add remove button */ changeRequest = g_new0 (struct changeRequest, 1); changeRequest->hbox = hbox; changeRequest->paramHBox = hbox2; changeRequest->editor = re; widget = gtk_button_new_from_stock ("gtk-remove"); gtk_box_pack_end (GTK_BOX (hbox), widget, FALSE, FALSE, 0); g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (on_ruleremove_clicked), changeRequest); /* and insert everything in the dialog */ gtk_widget_show_all (hbox); gtk_box_pack_start (GTK_BOX (re->priv->root), hbox, FALSE, TRUE, 0); }