Files
archived-lcd4linux/plugin_sample.c
reinelt d7461c4f0e [lcd4linux @ 2004-06-26 12:04:59 by reinelt]
uh-oh... the last CVS log message messed up things a lot...

git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@481 3ae390bd-cb1e-0410-b409-cd5a39f66f1f
2004-06-26 12:05:00 +00:00

258 lines
6.1 KiB
C

/* $Id: plugin_sample.c,v 1.8 2004/06/26 12:05:00 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.
*
* 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.8 2004/06/26 12:05:00 reinelt
*
* uh-oh... the last CVS log message messed up things a lot...
*
* Revision 1.7 2004/06/26 09:27:21 reinelt
*
* added '-W' to CFLAGS
* changed all C++ comments to C ones
* cleaned up a lot of signed/unsigned mistakes
*
* Revision 1.6 2004/06/01 06:04:25 reinelt
*
* made README.Plugins and plugin_sample up to date.
*
* Revision 1.5 2004/03/03 03:47:04 reinelt
* big patch from Martin Hejl:
* - use qprintf() where appropriate
* - save CPU cycles on gettimeofday()
* - add quit() functions to free allocated memory
* - fixed lots of memory leaks
*
* Revision 1.4 2004/01/30 20:57:56 reinelt
* HD44780 patch from Martin Hejl
* dmalloc integrated
*
* Revision 1.3 2004/01/29 04:40:02 reinelt
* every .c file includes "config.h" now
*
* 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
* 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 "config.h"
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
/* these should always be included */
#include "debug.h"
#include "plugin.h"
#ifdef WITH_DMALLOC
#include <dmalloc.h>
#endif
/* 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;
}
void plugin_exit_sample(void)
{
/* free any allocated memory */
/* close filedescriptors */
}