- added stuff for ease/pardef
This commit is contained in:
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;
|
||||
}
|
Reference in New Issue
Block a user