Ich brauche mal ein wenig C-Nachhilfe ;)
Folgende Funktion ersetzt offenbar 'selected="$&(*)"' durch 'selected="selected"'
oder durch '', soweit OK. Ich brauche aber eine Erweiterung der Funktion zum
Ersetzen von 'checked="$&(*)' nach gleichem Muster.
Code: Select all
static size_t PrintTagTemplate(UDM_AGENT *Agent,FILE *stream,
char *dst,size_t dst_len,
UDM_VARLIST *vars,const char *tok,
const char *HlBeg,
const char *HlEnd)
{
char * opt;
UDM_HTMLTOK ltag, *tag = <ag;
const char *last;
UDM_VAR * var=NULL;
char * vname = NULL, *value = NULL;
size_t i, res = 0;
opt = (char*)UdmMalloc(strlen(tok) + 200);
UdmHTMLTOKInit(tag);
UdmHTMLToken(tok, &last, tag);
sprintf(opt, "<");
for (i = 0; i < ltag.ntoks; i++)
{
const char *space= (i == 0) ? "" : " ";
if (ISTAG(i, "selected") && ltag.toks[i].vlen)
{
vname = UdmStrndup(ltag.toks[i].val, ltag.toks[i].vlen);
}
else if (ISTAG(i, "value"))
{
value = UdmStrndup(ltag.toks[i].val, ltag.toks[i].vlen);
sprintf(UDM_STREND(opt), "%svalue=\"%s\"", space, value);
}
else
{
char *tname = UdmStrndup(ltag.toks[i].name, ltag.toks[i].nlen);
if (ltag.toks[i].vlen)
{
char *tval = UdmStrndup(ltag.toks[i].val, ltag.toks[i].vlen);
sprintf(UDM_STREND(opt), "%s%s=\"%s\"", space, tname, tval);
UDM_FREE(tval);
}
else
{
sprintf(UDM_STREND(opt), "%s%s", space, tname);
}
UDM_FREE(tname);
}
}
if(vname)
{
var= UdmVarListFindWithValue(vars, UdmTrim(vname, "$&()"), value ? value:"");
}
sprintf(UDM_STREND(opt), "%s>", var ? " selected=\"selected\"":"");
if (vname) { UDM_FREE(vname); }
if (value) { UDM_FREE(value); }
res = PrintTextTemplate(Agent, stream, dst, dst_len, vars, opt, HlBeg, HlEnd);
UDM_FREE(opt);
return res;
}
Das if..else im for-Loop bekomme ich ja noch selbst erweitert, aber beim letzten sprintf muss ich dann doch passen :/
Vermutlich sehr primitiv und ich stehe momentan nur gewaltig auf dem Schlauch, aber ich bekomme es gerade ums Verrecken nicht gebacken.
BTW: Wie schiebe ich dem FreeBSD-Port den Patch am Geschicktesten unter, ohne es bei jedem Portupdate manuell wiederholen zu müssen?