- added stuff for ease/pardef

This commit is contained in:
zolliker
2005-09-05 08:07:57 +00:00
parent e83353d722
commit f5bb7d6366
3 changed files with 140 additions and 0 deletions

49
strobj.c Normal file
View File

@ -0,0 +1,49 @@
/*---------------------------------------------------------------------------
strobj.c
a string object based on pardef, logging is on by default
Markus Zolliker, March 2005
----------------------------------------------------------------------------
*/
#include <stdio.h>
#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);
}

78
sugar.c Normal file
View File

@ -0,0 +1,78 @@
/*---------------------------------------------------------------------------
sugar.c
syntactic sugar for accessing object subvariables (aliases)
Markus Zolliker, March 2005
----------------------------------------------------------------------------
*/
#include <stdio.h>
#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;
}

13
sugar.h Normal file
View File

@ -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);