Files
sicspsi/sugar.c
koennecke eb72d5c486 - Adapted indenation to new agreed upon system
- Fixed bad status in poldi zug driver
2009-02-13 09:01:03 +00:00

108 lines
2.1 KiB
C

/*---------------------------------------------------------------------------
sugar.c
syntactic sugar for accessing object subvariables (aliases)
Markus Zolliker, March 2005
----------------------------------------------------------------------------
*/
#include <stdio.h>
#include "sics.h"
#include "splitter.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 *cmd;
char **args;
char buf[256];
int i;
assert(sugar);
if (argc < 1)
return 0;
args = calloc(argc, sizeof(char *));
if (!args)
return 0;
args[0] = sugar->alias;
for (i = 1; i < argc; i++) {
args[i] = argv[i];
}
cmd = Arg2Tcl(argc + 1, args, buf, sizeof(buf));
free(args);
if (!cmd)
return 0;
i = SCInvoke(con, sics, cmd);
if (cmd != buf)
free(cmd);
return i;
}
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;
}