diff options
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; +} + | 
