summaryrefslogtreecommitdiff
path: root/libtk/parse.c
diff options
context:
space:
mode:
authorforsyth <forsyth@vitanuova.com>2010-04-02 20:48:59 +0100
committerforsyth <forsyth@vitanuova.com>2010-04-02 20:48:59 +0100
commitf94b359d339cfcefb3725fe7c0e78211443815b4 (patch)
tree4aa4684087ca68a91457ba0d3c633cada5c76fb9 /libtk/parse.c
parent1b078c23175db54397bc01f26f2456b729db9c4b (diff)
20100402-2048
Diffstat (limited to 'libtk/parse.c')
-rw-r--r--libtk/parse.c63
1 files changed, 51 insertions, 12 deletions
diff --git a/libtk/parse.c b/libtk/parse.c
index 32f9194a..57a1a651 100644
--- a/libtk/parse.c
+++ b/libtk/parse.c
@@ -47,6 +47,7 @@ static char* (*oparse[])(TkTop*, TkOption*, void*, char**, char*, char*) =
/* OPTignore */ pignore,
/* OPTsticky */ psticky,
/* OPTlist */ plist,
+ /* OPTflags */ pstab,
};
char*
@@ -290,7 +291,7 @@ tkgencget(TkOptab *ft, char *arg, char **val, TkTop *t)
TkStab *s;
TkOption *o;
int wh, con, i, n, flag, *v;
- char *r, *buf, *fmt;
+ char *r, *buf, *fmt, *out;
buf = mallocz(Tkmaxitem, 0);
if(buf == nil)
@@ -381,6 +382,23 @@ tkgencget(TkOptab *ft, char *arg, char **val, TkTop *t)
}
free(buf);
return tkvalue(val, "%s", c);
+ case OPTflags:
+ con = OPTION(ft->ptr, int, o->offset);
+ out = mallocz(Tkmaxitem, 0);
+ if(out == nil) {
+ free(buf);
+ return TkNomem;
+ }
+ c = out;
+ for (s = o->aux; s->val != nil; s++) {
+ if (con & s->con)
+ c = seprint(c, out+Tkmaxitem, " %s", s->val); /* should this be quoted? */
+ }
+ free(buf);
+ *c = 0;
+ r = tkvalue(val, "%s", out);
+ free(out);
+ return r;
case OPTfont:
e = OPTION(ft->ptr, TkEnv*, o->offset);
free(buf);
@@ -411,8 +429,10 @@ tkgencget(TkOptab *ft, char *arg, char **val, TkTop *t)
free(buf);
return nil;
case OPTbmap:
+ //free(buf);
return tkvalue(val, "%d", OPTION(ft->ptr, Image*, o->offset) != nil);
case OPTimag:
+ //free(buf);
return tkvalue(val, "%d", OPTION(ft->ptr, TkImg*, o->offset) != nil);
}
}
@@ -518,41 +538,60 @@ psize(TkTop *t, TkOption *o, void *place, char **str, char *buf, char *ebuf)
return nil;
}
+static TkStab*
+lookstab(TkStab *s, char *word)
+{
+ for(; s->val != nil; s++)
+ if(strcmp(s->val, word) == 0)
+ return s;
+ return nil;
+}
+
static char*
pstab(TkTop *t, TkOption *o, void *place, char **str, char *buf, char *ebuf)
{
- char *p;
- int mask;
+ char *p, *fields[8];
+ int mask, val, nf;
TkStab *s, *c;
p = tkword(t, *str, buf, ebuf, nil);
if(*buf == '\0')
return TkOparg;
- for(s = o->aux; s->val; s++)
- if(strcmp(s->val, buf) == 0)
- break;
- if(s->val == nil)
- return TkBadvl;
-
- *str = p;
if(o->type == OPTstab) {
+ s = lookstab(o->aux, buf);
+ if(s == nil)
+ return TkBadvl;
+ *str = p;
OPTION(place, int, o->offset) = s->con;
return nil;
}
+ nf = getfields(buf, fields, nelem(fields), 1, " \t,");
+ if(nf < 1 || nf > 1 && o->type != OPTflags)
+ return TkBadvl;
+
mask = 0;
for(c = o->aux; c->val; c++)
mask |= c->con;
+ val = 0;
+ while(--nf >= 0) {
+ s = lookstab(o->aux, fields[nf]);
+ if(s == nil)
+ return TkBadvl;
+ val |= s->con;
+ }
+ *str = p;
+
OPTION(place, int, o->offset) &= ~mask;
- OPTION(place, int, o->offset) |= s->con;
+ OPTION(place, int, o->offset) |= val;
/*
* a hack, but otherwise we have to dirty the focus order
* every time any command is executed on a widget
*/
- if (!strcmp(o->o, "takefocus"))
+ if(strcmp(o->o, "takefocus") == 0)
tkdirtyfocusorder(t);
return nil;
}