diff options
author | reinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f> | 2004-01-06 17:33:45 +0000 |
---|---|---|
committer | reinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f> | 2004-01-06 17:33:45 +0000 |
commit | 89942b18b768f34b7a17cc84b2ba47986784f32f (patch) | |
tree | 146acf66f6ed286ab18725662418d1a38c431164 | |
parent | 5b3068696ac2f421878c9edeb9cc5ee3fc18af2a (diff) | |
download | lcd4linux-89942b18b768f34b7a17cc84b2ba47986784f32f.tar.gz |
[lcd4linux @ 2004-01-06 17:33:45 by reinelt]
Evaluator: functions with variable argument lists
Evaluator: plugin_sample.c and README.Plugins added
git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@288 3ae390bd-cb1e-0410-b409-cd5a39f66f1f
Diffstat (limited to '')
-rw-r--r-- | Makefile.am | 10 | ||||
-rw-r--r-- | Makefile.in | 14 | ||||
-rw-r--r-- | README.Plugins | 28 | ||||
-rw-r--r-- | evaluator.c | 51 | ||||
-rw-r--r-- | plugin.c | 10 | ||||
-rw-r--r-- | plugin_sample.c | 213 |
6 files changed, 298 insertions, 28 deletions
diff --git a/Makefile.am b/Makefile.am index 9dbe6a6..d6885c9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -38,7 +38,7 @@ socket.c socket.h \ imon.c imon.h liblcd4linux_la_DEPENDENCIES = @DRIVERS@ -liblcd4linux_la_LDFLAGS = -version-info 9:11:9 +liblcd4linux_la_LDFLAGS = -version-info 9:12:9 liblcd4linux_la_LIBADD = @DRIVERS@ liblcd4linux_la_SOURCES = \ @@ -66,7 +66,6 @@ MilfordInstruments.c \ PalmPilot.c \ Raster.c \ SIN.c \ -Skeleton.c \ XWindow.c \ Text.c @@ -83,5 +82,10 @@ FAQ \ NEWS \ TODO \ README \ +README.Rows \ +README.Tokens \ README.Drivers \ -README.KDE +README.Plugins \ +README.KDE \ +Skeleton.c \ +plugin_sample.c diff --git a/Makefile.in b/Makefile.in index 0807367..d63b636 100644 --- a/Makefile.in +++ b/Makefile.in @@ -105,16 +105,16 @@ lcd4linux_SOURCES = lcd4linux.c pid.c pid.h parser.c parser.h processor.c proce liblcd4linux_la_DEPENDENCIES = @DRIVERS@ -liblcd4linux_la_LDFLAGS = -version-info 9:11:9 +liblcd4linux_la_LDFLAGS = -version-info 9:12:9 liblcd4linux_la_LIBADD = @DRIVERS@ liblcd4linux_la_SOURCES = display.c display.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 -EXTRA_lcd4linux_SOURCES = parport.c parport.h BeckmannEgle.c Crystalfontz.c Cwlinux.c HD44780.c M50530.c T6963.c USBLCD.c MatrixOrbital.c MilfordInstruments.c PalmPilot.c Raster.c SIN.c Skeleton.c XWindow.c Text.c +EXTRA_lcd4linux_SOURCES = parport.c parport.h BeckmannEgle.c Crystalfontz.c Cwlinux.c HD44780.c M50530.c T6963.c USBLCD.c MatrixOrbital.c MilfordInstruments.c PalmPilot.c Raster.c SIN.c XWindow.c Text.c -EXTRA_DIST = lcd4linux.conf.sample lcd4kde.conf lcd4linux.kdelnk lcd4linux.xpm lcd4linux.lsm curses.m4 AUTHORS CREDITS FAQ NEWS TODO README README.Drivers README.KDE +EXTRA_DIST = lcd4linux.conf.sample lcd4kde.conf lcd4linux.kdelnk lcd4linux.xpm lcd4linux.lsm curses.m4 AUTHORS CREDITS FAQ NEWS TODO README README.Rows README.Tokens README.Drivers README.Plugins README.KDE Skeleton.c plugin_sample.c ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs @@ -162,10 +162,10 @@ GZIP_ENV = --best DEP_FILES = .deps/BeckmannEgle.P .deps/Crystalfontz.P .deps/Cwlinux.P \ .deps/HD44780.P .deps/M50530.P .deps/MatrixOrbital.P \ .deps/MilfordInstruments.P .deps/PalmPilot.P .deps/Raster.P .deps/SIN.P \ -.deps/Skeleton.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/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/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/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/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_math.P .deps/plugin_string.P \ diff --git a/README.Plugins b/README.Plugins new file mode 100644 index 0000000..57e460e --- /dev/null +++ b/README.Plugins @@ -0,0 +1,28 @@ +# +# $Id: README.Plugins,v 1.1 2004/01/06 17:33:45 reinelt Exp $ +# + + +This file contains instructions for writing plugins to lcd4linux. + +- use the file 'plugin_sample.c' as a template +- copy the file to 'plugin_yourname.c' and edit +- replace the "$Id..." in the first line with "$Id: README.Plugins,v 1.1 2004/01/06 17:33:45 reinelt Exp $" +- add a short description what this plugin is for +- add your copyright notice (important: your name and email) +- replace the "$Log..." with "$Log: README.Plugins,v $ +- replace the "$Log..." with "Revision 1.1 2004/01/06 17:33:45 reinelt +- replace the "$Log..." with " +- replace the "$Log..." with "Evaluator: functions with variable argument lists +- replace the "$Log..." with "Evaluator: plugin_sample.c and README.Plugins added +- replace the "$Log..." with "" +- remove all Log lines until "*/" +- do some documentation (I know that real programmers write programs, not documentation) +- use one or more of the example functions as templates for your own functions +- register your new functions to the init() function, delete the sample ones +- edit 'plugin.c', add a prototype and the call to your plugin_init_* function +- edit 'Makefile.am' and add your 'plugin_*.c' to lcd4linux_SOURCES +- compile and test with interactive mode ('-i') +- send me a patch (or check in if you have developer CVS access) +- enjoy + diff --git a/evaluator.c b/evaluator.c index da3268c..3ea2fa1 100644 --- a/evaluator.c +++ b/evaluator.c @@ -1,4 +1,4 @@ -/* $Id: evaluator.c,v 1.4 2004/01/06 15:19:12 reinelt Exp $ +/* $Id: evaluator.c,v 1.5 2004/01/06 17:33:45 reinelt Exp $ * * expression evaluation * @@ -10,6 +10,11 @@ * FIXME: GPL or not GPL???? * * $Log: evaluator.c,v $ + * Revision 1.5 2004/01/06 17:33:45 reinelt + * + * Evaluator: functions with variable argument lists + * Evaluator: plugin_sample.c and README.Plugins added + * * Revision 1.4 2004/01/06 15:19:12 reinelt * Evaluator rearrangements... * @@ -728,7 +733,7 @@ static void Level10 (RESULT *result) // literal numbers, variables, functions static void Level11 (RESULT *result) { - RESULT param[10]; + RESULT *param[10]; if (*Token == '(') { @@ -755,23 +760,37 @@ static void Level11 (RESULT *result) FUNCTION *F=GetFunction(Token); if (F!=NULL) { int n=0; - Parse(); + Parse(); // read opening brace do { - Parse(); - if (*Token == ')' || *Token == ',') ERROR (E_NOARG); - param[n].type=0; - param[n].string=NULL; - Level01(&(param[n])); - n++; + Parse(); // read argument + if (*Token == ',') ERROR (E_NOARG); + if (*Token == ')') { + // immediately closed when no args + if (F->args>0 || n>0) ERROR (E_NOARG); + } else { + param[n]=NewResult(); + Level01(param[n]); + n++; + } } while (n < 10 && *Token == ','); - Parse(); - if (n != F->args) - ERROR (E_NUMARGS); - F->func(result, - ¶m[0], ¶m[1], ¶m[2], ¶m[3], ¶m[4], - ¶m[5], ¶m[6], ¶m[7], ¶m[8], ¶m[9]); + Parse(); // read closing brace + if (F->args<0) { + // Function with variable argument list: + // pass number of arguments as first parameter + F->func(result, n, ¶m); + } else { + if (n != F->args) ERROR (E_NUMARGS); + F->func(result, + param[0], param[1], param[2], param[3], param[4], + param[5], param[6], param[7], param[8], param[9]); + } + // free parameter list + while(n-->0) { + FreeResult(param[n]); + } + return; - + } else { ERROR(E_BADFUNC); } @@ -1,4 +1,4 @@ -/* $Id: plugin.c,v 1.4 2004/01/06 15:19:16 reinelt Exp $ +/* $Id: plugin.c,v 1.5 2004/01/06 17:33:45 reinelt Exp $ * * plugin handler for the Evaluator * @@ -22,6 +22,11 @@ * * * $Log: plugin.c,v $ + * Revision 1.5 2004/01/06 17:33:45 reinelt + * + * Evaluator: functions with variable argument lists + * Evaluator: plugin_sample.c and README.Plugins added + * * Revision 1.4 2004/01/06 15:19:16 reinelt * Evaluator rearrangements... * @@ -70,6 +75,7 @@ #include "plugin.h" +// Prototypes int plugin_init_math (void); int plugin_init_string (void); int plugin_init_xmms (void); @@ -80,7 +86,7 @@ int plugin_init (void) plugin_init_math(); plugin_init_string(); plugin_init_xmms(); - + return 0; } diff --git a/plugin_sample.c b/plugin_sample.c new file mode 100644 index 0000000..d9b8eae --- /dev/null +++ b/plugin_sample.c @@ -0,0 +1,213 @@ +/* $Id: plugin_sample.c,v 1.1 2004/01/06 17:33:45 reinelt Exp $ + * + * plugin template + * + * Copyright 2003 Michael Reinelt <reinelt@eunet.at> + * + * 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_sample.c,v $ + * Revision 1.1 2004/01/06 17:33:45 reinelt + * + * Evaluator: functions with variable argument lists + * Evaluator: plugin_sample.c and README.Plugins added + * + */ + +/* + * exported functions: + * + * int plugin_init_sample (void) + * adds various functions + * + */ + + +// define the include files you need +#include <stdlib.h> +#include <string.h> +#include <ctype.h> + +// these should always be included +#include "debug.h" +#include "plugin.h" + + + +// sample function 'mul2' +// takes one argument, a number +// multiplies the number by 2.0 +// Note: all local functions should be declared 'static' + +static void my_mul2 (RESULT *result, RESULT *arg1) +{ + double param; + double value; + + // Get Parameter + // R2N stands for 'Result to Number' + param=R2N(arg1); + + // calculate value + value=param*2.0; + + // store result + // when called with R_NUMBER, it assumes the + // next parameter to be a pointer to double + SetResult(&result, R_NUMBER, &value); +} + + +// sample function 'mul3' +// takes one argument, a number +// multiplies the number by 3.0 +// same as 'mul2', but shorter + +static void my_mul3 (RESULT *result, RESULT *arg1) +{ + // do it all in one line + double value=R2N(arg1)*3.0; + + // store result + SetResult(&result, R_NUMBER, &value); +} + + +// sample function 'diff' +// takes two arguments, both numbers +// returns |a-b| + +static void my_diff (RESULT *result, RESULT *arg1, RESULT *arg2) +{ + // do it all in one line + double value=R2N(arg1)-R2N(arg2); + + // some more calculations... + if (value<0) value=-value; + + // store result + SetResult(&result, R_NUMBER, &value); +} + + +// sample function 'answer' +// takes no argument! +// returns the answer to all questions + +static void my_answer (RESULT *result) +{ + // we have to declare a variable because + // SetResult needs a pointer + double value=42; + + // store result + SetResult(&result, R_NUMBER, &value); +} + + +// sample function 'length' +// takes one argument, a string +// returns the string length + +static void my_length (RESULT *result, RESULT *arg1) +{ + // Note #1: value *must* be double! + // Note #2: R2S stands for 'Result to String' + double value=strlen(R2S(arg1)); + + // store result + SetResult(&result, R_NUMBER, &value); +} + + + +// sample function 'upcase' +// takes one argument, a string +// returns the string in upper case letters + +static void my_upcase (RESULT *result, RESULT *arg1) +{ + char *value, *p; + + // create a local copy of the argument + // Do *NOT* try to modify the original string! + value=strdup(R2S(arg1)); + + // process the string + for (p=value; *p!='\0'; p++) + *p=toupper(*p); + + // store result + // when called with R_STRING, it assumes the + // next parameter to be a pointer to a string + // 'value' is already a char*, so use 'value', not '&value' + SetResult(&result, R_STRING, value); + + // free local copy again + // Note that SetResult() makes its own string copy + free (value); +} + + +// sample function 'cat' +// takes variable number of arguments, all strings +// returns all prameters concatenated + +static void my_concat (RESULT *result, int argc, RESULT *argv[]) +{ + int i, len; + char *value, *part; + + // start with a empty string + value=strdup(""); + + // process all arguments + for (i=0; i<argc; i++) { + part=R2S(argv[i]); + len=strlen(value)+strlen(part); + value=realloc(value, len+1); + strcat(value, part); + } + + // store result + SetResult(&result, R_STRING, value); + + // free local string + free (value); +} + + +// plugin initialization +// MUST NOT be declared 'static'! +int plugin_init_sample (void) +{ + + // register all our cool functions + // the second parameter is the number of arguments + // -1 stands for variable argument list + AddFunction ("mul2", 1, my_mul2); + AddFunction ("mul3", 1, my_mul3); + AddFunction ("answer", 0, my_answer); + AddFunction ("diff", 2, my_diff); + AddFunction ("length", 1, my_length); + AddFunction ("upcase", 1, my_upcase); + AddFunction ("concat", -1, my_concat); + + return 0; +} + |