- 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

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;
}