diff options
author | reinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f> | 2005-05-08 04:32:45 +0000 |
---|---|---|
committer | reinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f> | 2005-05-08 04:32:45 +0000 |
commit | dbf5d92605a9db10e3e3cb154d03a515c5d5c5af (patch) | |
tree | 501d5dda3ce90fe924b893e487d9ef9f0683382b /widget_text.c | |
parent | a1c471e9fb7cadb68bb182ab2e9715a0aa092386 (diff) | |
download | lcd4linux-dbf5d92605a9db10e3e3cb154d03a515c5d5c5af.tar.gz |
[lcd4linux @ 2005-05-08 04:32:43 by reinelt]
CodingStyle added and applied
git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@547 3ae390bd-cb1e-0410-b409-cd5a39f66f1f
Diffstat (limited to 'widget_text.c')
-rw-r--r-- | widget_text.c | 601 |
1 files changed, 311 insertions, 290 deletions
diff --git a/widget_text.c b/widget_text.c index 4275e99..f205a59 100644 --- a/widget_text.c +++ b/widget_text.c @@ -1,4 +1,4 @@ -/* $Id: widget_text.c,v 1.21 2005/01/18 06:30:24 reinelt Exp $ +/* $Id: widget_text.c,v 1.22 2005/05/08 04:32:45 reinelt Exp $ * * simple text widget handling * @@ -21,6 +21,9 @@ * * * $Log: widget_text.c,v $ + * Revision 1.22 2005/05/08 04:32:45 reinelt + * CodingStyle added and applied + * * Revision 1.21 2005/01/18 06:30:24 reinelt * added (C) to all copyright statements * @@ -147,317 +150,335 @@ #endif -void widget_text_scroll (void *Self) +void widget_text_scroll(void *Self) { - WIDGET *W = (WIDGET*)Self; - WIDGET_TEXT *T = W->data; - - int num, len, width, pad; - char *src, *dst; - - num = 0; - len = strlen(T->value); - width = T->width-strlen(T->preval)-strlen(T->postval); - if (width<0) width=0; - - switch (T->align) { - case ALIGN_LEFT: - pad=0; - break; - case ALIGN_CENTER: - pad=(width - len)/2; - if (pad<0) pad=0; - break; - case ALIGN_RIGHT: - pad=width - len; - if (pad<0) pad=0; - break; - case ALIGN_MARQUEE: - pad=width - T->scroll; - T->scroll++; - if (T->scroll >= width+len) T->scroll=0; - break; - default: /* not reached */ - pad=0; - } - - dst=T->buffer; - - /* process prefix */ - src=T->preval; - while (num < T->width) { - if (*src=='\0') break; - *(dst++)=*(src++); - num++; - } - - src=T->value; - - /* pad blanks on the beginning */ - while (pad > 0 && num < T->width) { - *(dst++)=' '; - num++; - pad--; - } - - /* skip src chars (marquee) */ - while (pad<0) { - src++; - pad++; - } - - /* copy content */ - while (num < T->width) { - if (*src=='\0') break; - *(dst++)=*(src++); - num++; - } - - /* pad blanks on the end */ - src=T->postval; - len=strlen(src); - while (num < T->width-len) { - *(dst++)=' '; - num++; - } - - /* process postfix */ - while (num < T->width) { - if (*src=='\0') break; - *(dst++)=*(src++); - num++; - } - - *dst='\0'; - - /* finally, draw it! */ - if (W->class->draw) - W->class->draw(W); + WIDGET *W = (WIDGET *) Self; + WIDGET_TEXT *T = W->data; + + int num, len, width, pad; + char *src, *dst; + + num = 0; + len = strlen(T->value); + width = T->width - strlen(T->preval) - strlen(T->postval); + if (width < 0) + width = 0; + + switch (T->align) { + case ALIGN_LEFT: + pad = 0; + break; + case ALIGN_CENTER: + pad = (width - len) / 2; + if (pad < 0) + pad = 0; + break; + case ALIGN_RIGHT: + pad = width - len; + if (pad < 0) + pad = 0; + break; + case ALIGN_MARQUEE: + pad = width - T->scroll; + T->scroll++; + if (T->scroll >= width + len) + T->scroll = 0; + break; + default: /* not reached */ + pad = 0; + } + + dst = T->buffer; + + /* process prefix */ + src = T->preval; + while (num < T->width) { + if (*src == '\0') + break; + *(dst++) = *(src++); + num++; + } + + src = T->value; + + /* pad blanks on the beginning */ + while (pad > 0 && num < T->width) { + *(dst++) = ' '; + num++; + pad--; + } + + /* skip src chars (marquee) */ + while (pad < 0) { + src++; + pad++; + } + + /* copy content */ + while (num < T->width) { + if (*src == '\0') + break; + *(dst++) = *(src++); + num++; + } + + /* pad blanks on the end */ + src = T->postval; + len = strlen(src); + while (num < T->width - len) { + *(dst++) = ' '; + num++; + } + + /* process postfix */ + while (num < T->width) { + if (*src == '\0') + break; + *(dst++) = *(src++); + num++; + } + + *dst = '\0'; + + /* finally, draw it! */ + if (W->class->draw) + W->class->draw(W); } -void widget_text_update (void *Self) +void widget_text_update(void *Self) { - WIDGET *W = (WIDGET*)Self; - WIDGET_TEXT *T = W->data; - RESULT result = {0, 0, 0, NULL}; - char *preval, *postval, *value; - int update; - - /* evaluate prefix */ - if (T->pretree!=NULL) { - Eval(T->pretree, &result); - preval=strdup(R2S(&result)); - DelResult (&result); - } else { - preval=strdup(""); - } - - /* evaluate postfix */ - if (T->posttree!=NULL) { - Eval(T->posttree, &result); - postval=strdup(R2S(&result)); - DelResult (&result); - } else { - postval=strdup(""); - } - - /* evaluate expression */ - Eval(T->tree, &result); - - /* string or number? */ - if (T->precision==0xC0DE) { - value=strdup(R2S(&result)); - } else { - double number=R2N(&result); - int width=T->width-strlen(preval)-strlen(postval); - int precision=T->precision; - /* print zero bytes so we can specify NULL as target */ - /* and get the length of the resulting string */ - int size=snprintf (NULL, 0, "%.*f", precision, number); - /* number does not fit into field width: try to reduce precision */ - if (width<0) width=0; - if (size>width && precision>0) { - int delta=size-width; - if (delta>precision) delta=precision; - precision-=delta; - size-=delta; - /* zero precision: omit decimal point, too */ - if (precision==0) size--; + WIDGET *W = (WIDGET *) Self; + WIDGET_TEXT *T = W->data; + RESULT result = { 0, 0, 0, NULL }; + char *preval, *postval, *value; + int update; + + /* evaluate prefix */ + if (T->pretree != NULL) { + Eval(T->pretree, &result); + preval = strdup(R2S(&result)); + DelResult(&result); + } else { + preval = strdup(""); + } + + /* evaluate postfix */ + if (T->posttree != NULL) { + Eval(T->posttree, &result); + postval = strdup(R2S(&result)); + DelResult(&result); + } else { + postval = strdup(""); } - /* number still doesn't fit: display '*****' */ - if (size>width) { - value=malloc(width+1); - memset (value, '*', width); - *(value+width)='\0'; + + /* evaluate expression */ + Eval(T->tree, &result); + + /* string or number? */ + if (T->precision == 0xC0DE) { + value = strdup(R2S(&result)); } else { - value=malloc(size+1); - snprintf (value, size+1, "%.*f", precision, number); + double number = R2N(&result); + int width = T->width - strlen(preval) - strlen(postval); + int precision = T->precision; + /* print zero bytes so we can specify NULL as target */ + /* and get the length of the resulting string */ + int size = snprintf(NULL, 0, "%.*f", precision, number); + /* number does not fit into field width: try to reduce precision */ + if (width < 0) + width = 0; + if (size > width && precision > 0) { + int delta = size - width; + if (delta > precision) + delta = precision; + precision -= delta; + size -= delta; + /* zero precision: omit decimal point, too */ + if (precision == 0) + size--; + } + /* number still doesn't fit: display '*****' */ + if (size > width) { + value = malloc(width + 1); + memset(value, '*', width); + *(value + width) = '\0'; + } else { + value = malloc(size + 1); + snprintf(value, size + 1, "%.*f", precision, number); + } } - } - - DelResult (&result); - - update=0; - - /* prefix changed? */ - if (T->preval == NULL || strcmp(T->preval, preval)!=0) { - update=1; - if (T->preval) free (T->preval); - T->preval=preval; - T->scroll=0; /* reset marquee counter */ - } else { - free (preval); - } - - /* postfix changed? */ - if (T->postval == NULL || strcmp(T->postval, postval)!=0) { - update=1; - if (T->postval) free (T->postval); - T->postval=postval; - T->scroll=0; /* reset marquee counter */ - } else { - free (postval); - } - - /* value changed? */ - if (T->value == NULL || strcmp(T->value, value)!=0) { - update=1; - if (T->value) free (T->value); - T->value=value; - T->scroll=0; /* reset marquee counter */ - } else { - free (value); - } - - /* something has changed and should be updated */ - if (update) { - /* if there's a marquee scroller active, it has its own */ - /* update callback timer, so we do nothing here; otherwise */ - /* we simply call this scroll callback directly */ - if (T->align!=ALIGN_MARQUEE) { - widget_text_scroll (Self); + + DelResult(&result); + + update = 0; + + /* prefix changed? */ + if (T->preval == NULL || strcmp(T->preval, preval) != 0) { + update = 1; + if (T->preval) + free(T->preval); + T->preval = preval; + T->scroll = 0; /* reset marquee counter */ + } else { + free(preval); + } + + /* postfix changed? */ + if (T->postval == NULL || strcmp(T->postval, postval) != 0) { + update = 1; + if (T->postval) + free(T->postval); + T->postval = postval; + T->scroll = 0; /* reset marquee counter */ + } else { + free(postval); + } + + /* value changed? */ + if (T->value == NULL || strcmp(T->value, value) != 0) { + update = 1; + if (T->value) + free(T->value); + T->value = value; + T->scroll = 0; /* reset marquee counter */ + } else { + free(value); + } + + /* something has changed and should be updated */ + if (update) { + /* if there's a marquee scroller active, it has its own */ + /* update callback timer, so we do nothing here; otherwise */ + /* we simply call this scroll callback directly */ + if (T->align != ALIGN_MARQUEE) { + widget_text_scroll(Self); + } } - } } -int widget_text_init (WIDGET *Self) +int widget_text_init(WIDGET * Self) { - char *section; char *c; - WIDGET_TEXT *Text; - - /* prepare config section */ - /* strlen("Widget:")=7 */ - section=malloc(strlen(Self->name)+8); - strcpy(section, "Widget:"); - strcat(section, Self->name); - - Text=malloc(sizeof(WIDGET_TEXT)); - memset (Text, 0, sizeof(WIDGET_TEXT)); - - /* get raw pre- and postfix (we evaluate it ourselves) */ - Text->prefix = cfg_get_raw (section, "prefix", NULL); - Text->postfix = cfg_get_raw (section, "postfix", NULL); - - /* compile pre- and postfix */ - Compile (Text->prefix, &Text->pretree); - Compile (Text->postfix, &Text->posttree); - - /* get raw expression (we evaluate it ourselves) */ - Text->expression = cfg_get_raw (section, "expression", "''"); - Compile (Text->expression, &Text->tree); - - /* field width, default 10 */ - cfg_number (section, "width", 10, 0, -1, &(Text->width)); - - /* precision: number of digits after the decimal point (default: none) */ - /* Note: this is the *maximum* precision on small values, */ - /* for larger values the precision may be reduced to fit into the field width. */ - /* The default value 0xC0DE is used to distinguish between numbers and strings: */ - /* if no precision is given, the result is always treated as a string. If a */ - /* precision is specified, the result is treated as a number. */ - cfg_number (section, "precision", 0xC0DE, 0, 80, &(Text->precision)); - - /* field alignment: Left (default), Center, Right or Marquee */ - c = cfg_get (section, "align", "L"); - switch (toupper(*c)) { - case 'L': - Text->align=ALIGN_LEFT; - break; - case 'C': - Text->align=ALIGN_CENTER; - break; - case 'R': - Text->align=ALIGN_RIGHT; - break; - case 'M': - Text->align=ALIGN_MARQUEE; - break; - default: - error ("widget %s has unknown alignment '%s', using 'Left'", section, c); - Text->align=ALIGN_LEFT; - } - free (c); - - /* update interval (msec), default 1 sec, 0 stands for never */ - cfg_number (section, "update", 1000, 0, -1, &(Text->update)); - /* limit update interval to min 10 msec */ - if (Text->update > 0 && Text->update < 10) Text->update = 10; - - /* marquee scroller speed: interval (msec), default 500msec */ - if (Text->align==ALIGN_MARQUEE) { - cfg_number (section, "speed", 500, 10, -1, &(Text->speed)); - } - - /* buffer */ - Text->buffer=malloc(Text->width+1); - - free (section); - Self->data=Text; - - /* add update timer, use one-shot if 'update' is zero */ - timer_add (widget_text_update, Self, Text->update, Text->update==0); - - /* a marquee scroller has its own timer and callback */ - if (Text->align==ALIGN_MARQUEE) { - timer_add (widget_text_scroll, Self, Text->speed, 0); - } - - return 0; + char *section; + char *c; + WIDGET_TEXT *Text; + + /* prepare config section */ + /* strlen("Widget:")=7 */ + section = malloc(strlen(Self->name) + 8); + strcpy(section, "Widget:"); + strcat(section, Self->name); + + Text = malloc(sizeof(WIDGET_TEXT)); + memset(Text, 0, sizeof(WIDGET_TEXT)); + + /* get raw pre- and postfix (we evaluate it ourselves) */ + Text->prefix = cfg_get_raw(section, "prefix", NULL); + Text->postfix = cfg_get_raw(section, "postfix", NULL); + + /* compile pre- and postfix */ + Compile(Text->prefix, &Text->pretree); + Compile(Text->postfix, &Text->posttree); + + /* get raw expression (we evaluate it ourselves) */ + Text->expression = cfg_get_raw(section, "expression", "''"); + Compile(Text->expression, &Text->tree); + + /* field width, default 10 */ + cfg_number(section, "width", 10, 0, -1, &(Text->width)); + + /* precision: number of digits after the decimal point (default: none) */ + /* Note: this is the *maximum* precision on small values, */ + /* for larger values the precision may be reduced to fit into the field width. */ + /* The default value 0xC0DE is used to distinguish between numbers and strings: */ + /* if no precision is given, the result is always treated as a string. If a */ + /* precision is specified, the result is treated as a number. */ + cfg_number(section, "precision", 0xC0DE, 0, 80, &(Text->precision)); + + /* field alignment: Left (default), Center, Right or Marquee */ + c = cfg_get(section, "align", "L"); + switch (toupper(*c)) { + case 'L': + Text->align = ALIGN_LEFT; + break; + case 'C': + Text->align = ALIGN_CENTER; + break; + case 'R': + Text->align = ALIGN_RIGHT; + break; + case 'M': + Text->align = ALIGN_MARQUEE; + break; + default: + error("widget %s has unknown alignment '%s', using 'Left'", section, c); + Text->align = ALIGN_LEFT; + } + free(c); + + /* update interval (msec), default 1 sec, 0 stands for never */ + cfg_number(section, "update", 1000, 0, -1, &(Text->update)); + /* limit update interval to min 10 msec */ + if (Text->update > 0 && Text->update < 10) + Text->update = 10; + + /* marquee scroller speed: interval (msec), default 500msec */ + if (Text->align == ALIGN_MARQUEE) { + cfg_number(section, "speed", 500, 10, -1, &(Text->speed)); + } + + /* buffer */ + Text->buffer = malloc(Text->width + 1); + + free(section); + Self->data = Text; + + /* add update timer, use one-shot if 'update' is zero */ + timer_add(widget_text_update, Self, Text->update, Text->update == 0); + + /* a marquee scroller has its own timer and callback */ + if (Text->align == ALIGN_MARQUEE) { + timer_add(widget_text_scroll, Self, Text->speed, 0); + } + + return 0; } -int widget_text_quit (WIDGET *Self) { - WIDGET_TEXT *Text; - if (Self) { - Text=Self->data; - if (Self->data) { - DelTree(Text->pretree); - DelTree(Text->posttree); - DelTree(Text->tree); - if (Text->preval) free(Text->preval); - if (Text->postval) free(Text->postval); - if (Text->value) free(Text->value); - if (Text->buffer) free(Text->buffer); - free (Self->data); - Self->data=NULL; +int widget_text_quit(WIDGET * Self) +{ + WIDGET_TEXT *Text; + if (Self) { + Text = Self->data; + if (Self->data) { + DelTree(Text->pretree); + DelTree(Text->posttree); + DelTree(Text->tree); + if (Text->preval) + free(Text->preval); + if (Text->postval) + free(Text->postval); + if (Text->value) + free(Text->value); + if (Text->buffer) + free(Text->buffer); + free(Self->data); + Self->data = NULL; + } + } - - } - return 0; - + return 0; + } WIDGET_CLASS Widget_Text = { - name: "text", - init: widget_text_init, - draw: NULL, - quit: widget_text_quit, + name:"text", + init:widget_text_init, + draw:NULL, + quit:widget_text_quit, }; - - |