- added stuff for ease/pardef
This commit is contained in:
49
strobj.c
Normal file
49
strobj.c
Normal 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
78
sugar.c
Normal 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
13
sugar.h
Normal 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);
|
Reference in New Issue
Block a user