]> git.webhop.me Git - lcd4linux.git/commitdiff
[lcd4linux @ 2004-01-06 17:33:45 by reinelt]
authorreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Tue, 6 Jan 2004 17:33:45 +0000 (17:33 +0000)
committerreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Tue, 6 Jan 2004 17:33:45 +0000 (17:33 +0000)
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

Makefile.am
Makefile.in
README.Plugins [new file with mode: 0644]
evaluator.c
plugin.c
plugin_sample.c [new file with mode: 0644]

index 9dbe6a6dfa7382048ce0c506b2f759fca5ff956c..d6885c9e9dd5075f14ad93c07f232c6fea572fcc 100644 (file)
@@ -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
index 08073670c4d9519eacce43d30ee1374da3be5530..d63b63617a6db52daa08c38f4090ef3c9514c232 100644 (file)
@@ -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 (file)
index 0000000..57e460e
--- /dev/null
@@ -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
+
index da3268c542fef45f9dd6eb62aba417f8aefd2187..3ea2fa16be02b5163b9b8562db580819c2b62252 100644 (file)
@@ -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
  *
  * 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, 
-                 &param[0], &param[1], &param[2], &param[3], &param[4], 
-                 &param[5], &param[6], &param[7], &param[8], &param[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, &param); 
+         } 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);
        }
index 28fdf5a3abf15de0dcfc9d0873f294cf46ba6b88..3872a5ca87953bc74bc219feeda3772e639c35a6 100644 (file)
--- a/plugin.c
+++ b/plugin.c
@@ -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
  *
  *
  *
  * $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 (file)
index 0000000..d9b8eae
--- /dev/null
@@ -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;
+}
+