diff --git a/strobj.c b/strobj.c new file mode 100644 index 0000000..b102574 --- /dev/null +++ b/strobj.c @@ -0,0 +1,49 @@ +/*--------------------------------------------------------------------------- +strobj.c + +a string object based on pardef, logging is on by default + +Markus Zolliker, March 2005 +---------------------------------------------------------------------------- +*/ + +#include +#include "sics.h" +#include "pardef.h" +#include "initializer.h" + +typedef struct { + ParData p; + char *str; +} StrObj; + +static ParClass strObjClass = { "string", sizeof(StrObj) }; + +/*----------------------------------------------------------------------------*/ +static void StrObjParDef(void *object) { + StrObj *so = ParCast(&strObjClass, object); + ParName(""); + ParAccess(usUser); + ParSave(1); + ParList(NULL); + ParStr(&so->str, NULL); +} +/*----------------------------------------------------------------------------*/ +static int StrObjInit(SConnection *con, int argc, char *argv[], int dynamic) { + StrObj *so = NULL; + char *creationCmd = NULL; + + if (dynamic) { + creationCmd = ParArg2Text(argc, argv, NULL, 0); + } + so = ParMake(con, argv[1], &strObjClass, StrObjParDef, creationCmd); + if (so) { + so->str = NULL; + } + return so != NULL; +} +/*----------------------------------------------------------------------------*/ +void StrObjStartup(void) { + ParMakeClass(&strObjClass, NULL); + MakeDriver("string", StrObjInit, 0); +} diff --git a/sugar.c b/sugar.c new file mode 100644 index 0000000..eca6a2a --- /dev/null +++ b/sugar.c @@ -0,0 +1,78 @@ +/*--------------------------------------------------------------------------- +sugar.c + +syntactic sugar for accessing object subvariables (aliases) + +Markus Zolliker, March 2005 +---------------------------------------------------------------------------- +*/ + +#include +#include "sics.h" +#include "sugar.h" +#include "pardef.h" + +typedef struct { + pObjectDescriptor desc; + char *name; + char *alias; +} Sugar; + +int SugarCommand(SConnection *con, SicsInterp *sics, void *data, int argc, char *argv[]) { + Sugar *sugar = data; + char value[256], buf[256]; + + assert(sugar); + ParArg2Text(argc-1, argv+1, value, sizeof value); + snprintf(buf, sizeof buf, "%s %s", sugar->alias, value); + return SCInvoke(con, sics, buf); +} + +void SugarDelete(void *data) { + Sugar *sugar = data; + + assert(sugar); + if (sugar->desc) { + DeleteDescriptor(sugar->desc); + sugar->desc = NULL; + } + if (sugar->name) free(sugar->name); + if (sugar->alias) free(sugar->alias); + free(sugar); +} + +int SugarMake(char *name, char *alias) { + Sugar *sugar; + + sugar = FindCommandData(pServ->pSics, name, "Sugar"); + if (sugar == NULL) { + if (FindCommand(pServ->pSics, name)) { + return -2; + } + sugar = calloc(1, sizeof *sugar); + if (!sugar) return -1; + + sugar->desc = CreateDescriptor("Sugar"); + if (!sugar->desc) goto release; + sugar->name = strdup(name); + sugar->alias = strdup(alias); + } else { + if (strcmp(name, sugar->name) != 0) { + free(sugar->name); + sugar->name = strdup(name); + } + if (strcmp(alias, sugar->alias) != 0) { + free(sugar->alias); + sugar->alias = strdup(alias); + } + } + + if (!sugar->name || !sugar->alias) goto release; + + if (0 == AddCommand(pServ->pSics, name, SugarCommand, SugarDelete, sugar)) goto release; + return 1; + +release: + SugarDelete(sugar); + return -1; +} diff --git a/sugar.h b/sugar.h new file mode 100644 index 0000000..aed7335 --- /dev/null +++ b/sugar.h @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------- +sugar.h + +syntactic sugar for accessing object subvariables + +Markus Zolliker, March 2005 +---------------------------------------------------------------------------- +*/ + +/* make an sugar object named "name", referring to "alias" + which is normally an object and a parameter name separated with space +*/ +int SugarMake(char *name, char *alias);