[lcd4linux @ 2004-01-13 10:03:01 by reinelt]

new util 'hash' for associative arrays
new plugin 'cpuinfo'

git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@309 3ae390bd-cb1e-0410-b409-cd5a39f66f1f
This commit is contained in:
reinelt
2004-01-13 10:03:01 +00:00
parent 3cac782447
commit 90a08f4f10
8 changed files with 458 additions and 23 deletions
+3 -1
View File
@@ -18,6 +18,7 @@ lcd4linux_DEPENDENCIES = @DRIVERS@
lcd4linux_SOURCES = \
lcd4linux.c \
pid.c pid.h \
hash.c hash.h \
parser.c parser.h \
processor.c processor.h \
layout.c layout.h \
@@ -29,8 +30,9 @@ plugin.c plugin.h \
plugin_math.c \
plugin_string.c \
plugin_cfg.c \
plugin_xmms.c \
plugin_cpuinfo.c \
plugin_i2c_sensors.c \
plugin_xmms.c \
system.c system.h \
isdn.c isdn.h \
wifi.c wifi.h \
+19 -18
View File
@@ -104,7 +104,7 @@ lcd4linux_LDADD = @DRIVERS@ @DRVLIBS@
#remove next line for liblcd4linux
lcd4linux_DEPENDENCIES = @DRIVERS@
lcd4linux_SOURCES = lcd4linux.c pid.c pid.h parser.c parser.h processor.c processor.h layout.c layout.h timer.c timer.h evaluator.c evaluator.h widget.c widget.h widget_text.c widget_text.h plugin.c plugin.h plugin_math.c plugin_string.c plugin_cfg.c plugin_xmms.c plugin_i2c_sensors.c system.c system.h isdn.c isdn.h wifi.c wifi.h mail.c mail.h seti.c seti.h battery.c battery.h dvb.c dvb.h filter.c filter.h exec.c exec.h expr.c expr.h mail2.c socket.c socket.h imon.c imon.h display.c display.h drv.c drv.h debug.c debug.h cfg.c cfg.h lock.c lock.h pixmap.c pixmap.h bar.c bar.h icon.c icon.h fontmap.c fontmap.h udelay.c udelay.h
lcd4linux_SOURCES = lcd4linux.c pid.c pid.h hash.c hash.h parser.c parser.h processor.c processor.h layout.c layout.h timer.c timer.h evaluator.c evaluator.h widget.c widget.h widget_text.c widget_text.h plugin.c plugin.h plugin_math.c plugin_string.c plugin_cfg.c plugin_cpuinfo.c plugin_i2c_sensors.c plugin_xmms.c system.c system.h isdn.c isdn.h wifi.c wifi.h mail.c mail.h seti.c seti.h battery.c battery.h dvb.c dvb.h filter.c filter.h exec.c exec.h expr.c expr.h mail2.c socket.c socket.h imon.c imon.h display.c display.h drv.c drv.h debug.c debug.h cfg.c cfg.h lock.c lock.h pixmap.c pixmap.h bar.c bar.h icon.c icon.h fontmap.c fontmap.h udelay.c udelay.h
#liblcd4linux_la_DEPENDENCIES = @DRIVERS@
@@ -144,17 +144,18 @@ X_CFLAGS = @X_CFLAGS@
X_LIBS = @X_LIBS@
X_EXTRA_LIBS = @X_EXTRA_LIBS@
X_PRE_LIBS = @X_PRE_LIBS@
lcd4linux_OBJECTS = lcd4linux.$(OBJEXT) pid.$(OBJEXT) parser.$(OBJEXT) \
processor.$(OBJEXT) layout.$(OBJEXT) timer.$(OBJEXT) \
lcd4linux_OBJECTS = lcd4linux.$(OBJEXT) pid.$(OBJEXT) hash.$(OBJEXT) \
parser.$(OBJEXT) processor.$(OBJEXT) layout.$(OBJEXT) timer.$(OBJEXT) \
evaluator.$(OBJEXT) widget.$(OBJEXT) widget_text.$(OBJEXT) \
plugin.$(OBJEXT) plugin_math.$(OBJEXT) plugin_string.$(OBJEXT) \
plugin_cfg.$(OBJEXT) plugin_xmms.$(OBJEXT) plugin_i2c_sensors.$(OBJEXT) \
system.$(OBJEXT) isdn.$(OBJEXT) wifi.$(OBJEXT) mail.$(OBJEXT) \
seti.$(OBJEXT) battery.$(OBJEXT) dvb.$(OBJEXT) filter.$(OBJEXT) \
exec.$(OBJEXT) expr.$(OBJEXT) mail2.$(OBJEXT) socket.$(OBJEXT) \
imon.$(OBJEXT) display.$(OBJEXT) drv.$(OBJEXT) debug.$(OBJEXT) \
cfg.$(OBJEXT) lock.$(OBJEXT) pixmap.$(OBJEXT) bar.$(OBJEXT) \
icon.$(OBJEXT) fontmap.$(OBJEXT) udelay.$(OBJEXT)
plugin_cfg.$(OBJEXT) plugin_cpuinfo.$(OBJEXT) \
plugin_i2c_sensors.$(OBJEXT) plugin_xmms.$(OBJEXT) system.$(OBJEXT) \
isdn.$(OBJEXT) wifi.$(OBJEXT) mail.$(OBJEXT) seti.$(OBJEXT) \
battery.$(OBJEXT) dvb.$(OBJEXT) filter.$(OBJEXT) exec.$(OBJEXT) \
expr.$(OBJEXT) mail2.$(OBJEXT) socket.$(OBJEXT) imon.$(OBJEXT) \
display.$(OBJEXT) drv.$(OBJEXT) debug.$(OBJEXT) cfg.$(OBJEXT) \
lock.$(OBJEXT) pixmap.$(OBJEXT) bar.$(OBJEXT) icon.$(OBJEXT) \
fontmap.$(OBJEXT) udelay.$(OBJEXT)
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -176,14 +177,14 @@ DEP_FILES = .deps/BeckmannEgle.P .deps/Crystalfontz.P .deps/Cwlinux.P \
.deps/T6963.P .deps/Text.P .deps/USBLCD.P .deps/XWindow.P .deps/bar.P \
.deps/battery.P .deps/cfg.P .deps/debug.P .deps/display.P .deps/drv.P \
.deps/drv_MatrixOrbital.P .deps/dvb.P .deps/evaluator.P .deps/exec.P \
.deps/expr.P .deps/filter.P .deps/fontmap.P .deps/icon.P .deps/imon.P \
.deps/isdn.P .deps/layout.P .deps/lcd4linux.P .deps/lock.P .deps/mail.P \
.deps/mail2.P .deps/parport.P .deps/parser.P .deps/pid.P .deps/pixmap.P \
.deps/plugin.P .deps/plugin_cfg.P .deps/plugin_i2c_sensors.P \
.deps/plugin_math.P .deps/plugin_string.P .deps/plugin_xmms.P \
.deps/processor.P .deps/seti.P .deps/socket.P .deps/system.P \
.deps/timer.P .deps/udelay.P .deps/widget.P .deps/widget_text.P \
.deps/wifi.P
.deps/expr.P .deps/filter.P .deps/fontmap.P .deps/hash.P .deps/icon.P \
.deps/imon.P .deps/isdn.P .deps/layout.P .deps/lcd4linux.P .deps/lock.P \
.deps/mail.P .deps/mail2.P .deps/parport.P .deps/parser.P .deps/pid.P \
.deps/pixmap.P .deps/plugin.P .deps/plugin_cfg.P .deps/plugin_cpuinfo.P \
.deps/plugin_i2c_sensors.P .deps/plugin_math.P .deps/plugin_string.P \
.deps/plugin_xmms.P .deps/processor.P .deps/seti.P .deps/socket.P \
.deps/system.P .deps/timer.P .deps/udelay.P .deps/widget.P \
.deps/widget_text.P .deps/wifi.P
SOURCES = $(lcd4linux_SOURCES) $(EXTRA_lcd4linux_SOURCES)
OBJECTS = $(lcd4linux_OBJECTS)
+129
View File
@@ -0,0 +1,129 @@
/* $Id: hash.c,v 1.1 2004/01/13 10:03:01 reinelt Exp $
*
* hashes (associative arrays)
*
* Copyright 1999-2003 Michael Reinelt <reinelt@eunet.at>
* Copyright 2004 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
*
* This file is part of LCD4Linux.
*
* LCD4Linux 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.
*
* LCD4Linux 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: hash.c,v $
* Revision 1.1 2004/01/13 10:03:01 reinelt
* new util 'hash' for associative arrays
* new plugin 'cpuinfo'
*
*/
/*
* exported functions:
*
* hash_anything
* Fixme: document me!
*
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "debug.h"
#include "hash.h"
// bsearch compare function for hash entries
static int hash_lookup_f (const void *a, const void *b)
{
char *key=(char*)a;
HASH_ITEM *item=(HASH_ITEM*)b;
return strcmp(key, item->key);
}
// qsort compare function for hash tables
static int hash_sort_f (const void *a, const void *b)
{
HASH_ITEM *ha=(HASH_ITEM*)a;
HASH_ITEM *hb=(HASH_ITEM*)b;
return strcasecmp(ha->key, hb->key);
}
// insert a key/val pair into the hash table
// the tbale will be searched linearly if the entry
// does already exist, for the table may not be sorted.
// the table will be flagged 'unsorted' afterwards
void hash_set (HASH *Hash, char *key, char *val)
{
int i;
// entry already exists?
for (i=0;i<Hash->nItems; i++) {
if (strcmp(key, Hash->Items[i].key)==0) {
if (Hash->Items[i].val) free (Hash->Items[i].val);
Hash->Items[i].val=strdup(val);
return;
}
}
// add entry
Hash->sorted=0;
Hash->nItems++;
Hash->Items=realloc(Hash->Items,Hash->nItems*sizeof(HASH_ITEM));
Hash->Items[i].key=strdup(key);
Hash->Items[i].val=strdup(val);
}
void *hash_get (HASH *Hash, char *key)
{
HASH_ITEM *Item;
if (!Hash->sorted) {
qsort(Hash->Items, Hash->nItems, sizeof(HASH_ITEM), hash_sort_f);
Hash->sorted=1;
}
Item=bsearch(key, Hash->Items, Hash->nItems, sizeof(HASH_ITEM), hash_lookup_f);
return Item?Item->val:NULL;
}
void hash_destroy (HASH *Hash)
{
int i;
if (Hash->Items) {
// free all entries
for (i=0;i<Hash->nItems; i++) {
if (Hash->Items[i].key) free (Hash->Items[i].key);
if (Hash->Items[i].val) free (Hash->Items[i].val);
}
// free hash table
free (Hash->Items);
}
Hash->nItems=0;
Hash->sorted=0;
Hash->Items=NULL;
}
+52
View File
@@ -0,0 +1,52 @@
/* $Id: hash.h,v 1.1 2004/01/13 10:03:01 reinelt Exp $
*
* hashes (associative arrays)
*
* Copyright 1999-2003 Michael Reinelt <reinelt@eunet.at>
* Copyright 2004 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
*
* This file is part of LCD4Linux.
*
* LCD4Linux 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.
*
* LCD4Linux 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: hash.h,v $
* Revision 1.1 2004/01/13 10:03:01 reinelt
* new util 'hash' for associative arrays
* new plugin 'cpuinfo'
*
*/
#ifndef _HASH_H_
#define _HASH_H_
typedef struct HASH_ITEM {
char *key;
char *val;
} HASH_ITEM;
typedef struct HASH {
int nItems;
int sorted;
HASH_ITEM *Items;
} HASH;
void hash_set (HASH *Hash, char *key, char *val);
void *hash_get (HASH *Hash, char *key);
void hash_destroy (HASH *Hash);
#endif
+9 -3
View File
@@ -1,4 +1,4 @@
/* $Id: plugin.c,v 1.9 2004/01/11 18:26:02 reinelt Exp $
/* $Id: plugin.c,v 1.10 2004/01/13 10:03:01 reinelt Exp $
*
* plugin handler for the Evaluator
*
@@ -22,6 +22,10 @@
*
*
* $Log: plugin.c,v $
* Revision 1.10 2004/01/13 10:03:01 reinelt
* new util 'hash' for associative arrays
* new plugin 'cpuinfo'
*
* Revision 1.9 2004/01/11 18:26:02 reinelt
* further widget and layout processing
*
@@ -97,8 +101,9 @@
int plugin_init_math (void);
int plugin_init_string (void);
int plugin_init_cfg (void);
int plugin_init_xmms (void);
int plugin_init_cpuinfo (void);
int plugin_init_i2c_sensors (void);
int plugin_init_xmms (void);
int plugin_init (void)
@@ -106,9 +111,10 @@ int plugin_init (void)
plugin_init_math();
plugin_init_string();
plugin_init_cfg();
plugin_init_xmms();
plugin_init_cpuinfo();
// MR: segfaults here
// plugin_init_i2c_sensors();
plugin_init_xmms();
return 0;
}
+125
View File
@@ -0,0 +1,125 @@
/* $Id: plugin_cfg.c,v 1.1 2004/01/13 10:03:01 reinelt Exp $
*
* plugin for config file access
*
* Copyright 2003, 2004 Michael Reinelt <reinelt@eunet.at>
* Copyright 2004 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
*
* This file is part of LCD4Linux.
*
* LCD4Linux 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.
*
* LCD4Linux 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: plugin_cfg.c,v $
* Revision 1.1 2004/01/13 10:03:01 reinelt
* new util 'hash' for associative arrays
* new plugin 'cpuinfo'
*
*/
/*
* exported functions:
*
* int plugin_init_cfg (void)
* adds cfg() function for config access
* initializes variables from the config file
*
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "debug.h"
#include "evaluator.h"
#include "plugin.h"
#include "cfg.h"
static void load_variables (void)
{
char *section="Variables";
char *list, *key;
char *expression;
RESULT result = {0, 0.0, NULL};
list=cfg_list(section);
key=strtok(list, "|");
while (key!=NULL) {
if (strchr(key, '.')!=NULL || strchr(key, ':') !=0) {
error ("ignoring variable '%s' from %s: structures not allowed", key, cfg_source());
} else {
expression=cfg_get (section, key, "");
if (expression!=NULL && *expression!='\0') {
if (Eval(expression, &result)==0) {
debug ("Variable %s = '%s' (%f)", key, R2S(&result), R2N(&result));
SetVariable (key, &result);
DelResult (&result);
} else {
error ("error evaluating variable '%s' from %s", key, cfg_source());
}
}
}
key=strtok(NULL, "|");
}
free (list);
}
static void my_cfg (RESULT *result, int argc, RESULT *argv[])
{
int i, len;
char *value;
char *buffer;
// calculate key length
len=0;
for (i=0; i<argc; i++) {
len+=strlen(R2S(argv[i]))+1;
}
// allocate key buffer
buffer=malloc(len+1);
// prepare key buffer
*buffer='\0';
for (i=0; i<argc; i++) {
strcat (buffer, ".");
strcat (buffer, R2S(argv[i]));
}
// buffer starts with '.', so cut off first char
value=cfg_get("", buffer+1, "");
// free buffer again
free (buffer);
// store result
SetResult(&result, R_STRING, value);
}
int plugin_init_cfg (void)
{
// load "Variables" section from cfg
load_variables();
// register plugin
AddFunction ("cfg", -1, my_cfg);
return 0;
}
+115
View File
@@ -0,0 +1,115 @@
/* $Id: plugin_cpuinfo.c,v 1.1 2004/01/13 10:03:01 reinelt Exp $
*
* plugin for /proc/cpuinfo parsing
*
* Copyright 2003 Michael Reinelt <reinelt@eunet.at>
* Copyright 2004 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
*
* This file is part of LCD4Linux.
*
* LCD4Linux 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.
*
* LCD4Linux 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: plugin_cpuinfo.c,v $
* Revision 1.1 2004/01/13 10:03:01 reinelt
* new util 'hash' for associative arrays
* new plugin 'cpuinfo'
*
*/
/*
* exported functions:
*
* int plugin_init_cpuinfo (void)
* adds functions to access /proc/cpuinfo
*
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <time.h>
#include "debug.h"
#include "plugin.h"
#include "hash.h"
static void my_cpuinfo (RESULT *result, RESULT *arg1)
{
static HASH CPUinfo = { 0, 0, NULL };
static time_t now=0;
char *key, *val;
// reread every second only
if (time(NULL)!=now) {
FILE *stream;
// destroy previous hash table
hash_destroy (&CPUinfo);
stream=fopen("/proc/cpuinfo", "r");
if (stream==NULL) {
error ("fopen(/proc/cpuinfo) failed: %s", strerror(errno));
goto error;
}
while (!feof(stream)) {
char buffer[256];
char *c;
fgets (buffer, sizeof(buffer), stream);
c=strchr(buffer, ':');
if (c==NULL) continue;
key=buffer; val=c+1;
// strip leading blanks from key
while (isspace(*key)) *key++='\0';
// strip trailing blanks from key
while (isspace(*--c)) *c='\0';
// strip leading blanks from value
while (isspace(*val)) *val++='\0';
// strip trailing blanks from value
for (c=val; *c!='\0';c++);
while (isspace(*--c)) *c='\0';
// add entry to hash table
hash_set (&CPUinfo, key, val);
}
fclose (stream);
time(&now);
}
key=R2S(arg1);
val=hash_get(&CPUinfo, key);
if (val==NULL) val="";
error:
// val="";
SetResult(&result, R_STRING, val);
}
int plugin_init_cpuinfo (void)
{
AddFunction ("cpuinfo", 1, my_cpuinfo);
return 0;
}
+6 -1
View File
@@ -1,8 +1,9 @@
/* $Id: plugin_sample.c,v 1.1 2004/01/06 17:33:45 reinelt Exp $
/* $Id: plugin_sample.c,v 1.2 2004/01/13 10:03:01 reinelt Exp $
*
* plugin template
*
* Copyright 2003 Michael Reinelt <reinelt@eunet.at>
* Copyright 2004 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
*
* This file is part of LCD4Linux.
*
@@ -22,6 +23,10 @@
*
*
* $Log: plugin_sample.c,v $
* Revision 1.2 2004/01/13 10:03:01 reinelt
* new util 'hash' for associative arrays
* new plugin 'cpuinfo'
*
* Revision 1.1 2004/01/06 17:33:45 reinelt
*
* Evaluator: functions with variable argument lists