79 lines
1.8 KiB
C
79 lines
1.8 KiB
C
/*---------------------------------------------------------------------------
|
|
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;
|
|
}
|