aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>2004-01-06 17:33:45 +0000
committerreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>2004-01-06 17:33:45 +0000
commit89942b18b768f34b7a17cc84b2ba47986784f32f (patch)
tree146acf66f6ed286ab18725662418d1a38c431164
parent5b3068696ac2f421878c9edeb9cc5ee3fc18af2a (diff)
downloadlcd4linux-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
-rw-r--r--Makefile.am10
-rw-r--r--Makefile.in14
-rw-r--r--README.Plugins28
-rw-r--r--evaluator.c51
-rw-r--r--plugin.c10
-rw-r--r--plugin_sample.c213
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,
- &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);
}
diff --git a/plugin.c b/plugin.c
index 28fdf5a..3872a5c 100644
--- 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
*
@@ -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;
+}
+