aboutsummaryrefslogtreecommitdiffstats
path: root/parser.c
diff options
context:
space:
mode:
authorreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>2000-03-13 15:58:24 +0000
committerreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>2000-03-13 15:58:24 +0000
commit1f0791dbac416903409b420ce5bdd73a1944c3d4 (patch)
treec72c000f26428a310cd2778e7c301ca24e026e09 /parser.c
parent713dd4045fdc6312cb80a4aee9b17a3dd5cc1368 (diff)
downloadlcd4linux-1f0791dbac416903409b420ce5bdd73a1944c3d4.tar.gz
[lcd4linux @ 2000-03-13 15:58:24 by reinelt]
release 0.9 moved row parsing to parser.c all basic work finished git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@10 3ae390bd-cb1e-0410-b409-cd5a39f66f1f
Diffstat (limited to 'parser.c')
-rw-r--r--parser.c208
1 files changed, 208 insertions, 0 deletions
diff --git a/parser.c b/parser.c
new file mode 100644
index 0000000..a3ebddb
--- /dev/null
+++ b/parser.c
@@ -0,0 +1,208 @@
+/* $Id: parser.c,v 1.1 2000/03/13 15:58:24 reinelt Exp $
+ *
+ * row definition parser
+ *
+ * Copyright 1999, 2000 by Michael Reinelt (reinelt@eunet.at)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ * $Log: parser.c,v $
+ * Revision 1.1 2000/03/13 15:58:24 reinelt
+ *
+ * release 0.9
+ * moved row parsing to parser.c
+ * all basic work finished
+ *
+ */
+
+/*
+ * exported functions:
+ *
+ * char *parse (char *string, int supported_bars)
+ * converts a row definition from the config file
+ * into the internal form using tokens
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+
+#include "display.h"
+#include "parser.h"
+
+typedef struct {
+ char *symbol;
+ TOKEN token;
+ int bar;
+} SYMTAB;
+
+static SYMTAB Symtab[] = {{ "%", T_PERCENT, 0 },
+ { "$", T_DOLLAR, 0 },
+ { "o", T_OS, 0 },
+ { "r", T_RELEASE, 0 },
+ { "p", T_CPU, 0 },
+ { "m", T_RAM, 0 },
+ { "l1", T_LOAD_1, 1 },
+ { "l2", T_LOAD_2, 1 },
+ { "l3", T_LOAD_3, 1 },
+ { "L", T_OVERLOAD, 0 },
+ { "cu", T_CPU_USER, 1 },
+ { "cn", T_CPU_NICE, 1 },
+ { "cs", T_CPU_SYSTEM, 1 },
+ { "cb", T_CPU_BUSY, 1 },
+ { "ci", T_CPU_IDLE, 1 },
+ { "dr", T_DISK_READ, 1 },
+ { "dw", T_DISK_WRITE, 1 },
+ { "dt", T_DISK_TOTAL, 1 },
+ { "dm", T_DISK_MAX, 1 },
+ { "nr", T_NET_RX, 1 },
+ { "nw", T_NET_TX, 1 },
+ { "nt", T_NET_TOTAL, 1 },
+ { "nm", T_NET_MAX, 1 },
+ { "ii", T_ISDN_IN, 1 },
+ { "io", T_ISDN_OUT, 1 },
+ { "it", T_ISDN_TOTAL, 1 },
+ { "im", T_ISDN_MAX, 1 },
+ { "s1", T_SENSOR_1, 1 },
+ { "s1", T_SENSOR_2, 1 },
+ { "s2", T_SENSOR_3, 1 },
+ { "s3", T_SENSOR_4, 1 },
+ { "s4", T_SENSOR_5, 1 },
+ { "s5", T_SENSOR_6, 1 },
+ { "s6", T_SENSOR_7, 1 },
+ { "s7", T_SENSOR_8, 1 },
+ { "s8", T_SENSOR_9, 1 },
+ { "", -1 }};
+
+
+static int bar_type (char tag)
+{
+ switch (tag) {
+ case 'l':
+ return BAR_L;
+ case 'r':
+ return BAR_R;
+ case 'u':
+ return BAR_U;
+ case 'd':
+ return BAR_D;
+ default:
+ return 0;
+ }
+}
+
+static TOKEN get_token (char *s, char **p, int bar)
+{
+ int i;
+ for (i=0; Symtab[i].token!=-1; i++) {
+ int l=strlen(Symtab[i].symbol);
+ if (bar && !Symtab[i].bar) continue;
+ if (strncmp(Symtab[i].symbol, s, l)==0) {
+ *p=s+l;
+ return Symtab[i].token;
+ }
+ }
+ return -1;
+}
+
+char *parse (char *string, int supported_bars)
+{
+ static char buffer[256];
+ char *s=string;
+ char *p=buffer;
+ int token, token2, type, len;
+
+ do {
+ switch (*s) {
+
+ case '%':
+ if ((token=get_token (s+1, &s, 0))==-1) {
+ s++;
+ fprintf (stderr, "WARNING: unknown token <%%%c> in <%s>\n", *s, string);
+ } else {
+ *p++='%';
+ *p++=token;
+ }
+ break;
+
+ case '$':
+ type=bar_type(tolower(*++s));
+ if (type==0) {
+ fprintf (stderr, "WARNING: invalid bar type <$%c> in <%s>\n", *s, string);
+ break;
+ }
+ if (!(type & supported_bars)) {
+ fprintf (stderr, "WARNING: driver does not support bar type '%c'\n", *s);
+ break;
+ }
+ if (isupper(*s)) type |= BAR_LOG;
+ len=strtol(++s, &s, 10);
+ if (len<1 || len>127) {
+ fprintf (stderr, "WARNING: invalid bar length in <%s>\n", string);
+ break;
+ }
+ if ((token=get_token (s, &s, 0))==-1) {
+ fprintf (stderr, "WARNING: unknown token <$%c> in <%s>\n", *s, string);
+ break;
+ }
+ token2=-1;
+ if (*s=='+') {
+ if ((type & BAR_H) && (supported_bars & BAR_H2)) {
+ type |= BAR_H2;
+ } else if ((type & BAR_V) && (supported_bars & BAR_V2)) {
+ type |= BAR_V2;
+ } else {
+ fprintf (stderr, "WARNING: driver does not support double bars\n");
+ break;
+ }
+ if ((token2=get_token (s+1, &s, 0))==-1) {
+ fprintf (stderr, "WARNING: unknown token <$%c> in <%s>\n", *s, string);
+ break;
+ }
+ }
+ *p++='$';
+ *p++=type;
+ *p++=len;
+ *p++=token;
+ if (token2!=-1) *p++=token2;
+ break;
+
+ case '\\':
+ if (*(s+1)=='\\') {
+ *p++='\\';
+ s++;
+ } else {
+ unsigned int c=0; int n;
+ sscanf (s+1, "%3o%n", &c, &n);
+ if (c==0 || c>255) {
+ fprintf (stderr, "WARNING: illegal '\\' in <%s>\n", string);
+ } else {
+ *p++=c;
+ s+=n;
+ }
+ }
+ break;
+
+ default:
+ *p++=*s++;
+ }
+
+ } while (*s);
+
+ return buffer;
+}
+