summaryrefslogtreecommitdiff
path: root/src/post/goom/goom_script.c
blob: 5645d583e44f0ead02383f7793f0329978003bad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "goom_script.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

static PluginParameters *getBaseForVariable (PluginInfo *pluginInfo, const char *name) {

	int i;
	if (name == NULL) {
		printf("ERROR: No variable container name specified\n");
		return NULL;
	}

	/* TODO: using an hashmap */
	for (i=0;i<pluginInfo->nbParams;i++) {
		if (!strcmp(name, pluginInfo->params[i].name)) {
			return &(pluginInfo->params[i]);
		}
	}

	printf ("ERROR: No such variable container: %s\n", name);
	return NULL;
}

static PluginParam *getParamForVariable(PluginParameters *params, const char *name) {

	int i;
	if (name == NULL)
		return NULL;

	for (i=0;i<params->nbParams;i++) {
		if (params->params[i] && (!strcmp(name, params->params[i]->name))) {
			return params->params[i];
		}
	}
	printf ("ERROR: No such variable into %s: %s\n", params->name, name);
	return NULL;
}
					    
PluginParam *goom_script_get_param(PluginInfo *pluginInfo, const char *name) {

	int i;
	char *base;
	char *var;
	int len = strlen(name);
	int hasDot = 0;
	PluginParameters *pparams;

	if (name == NULL)
		return NULL;
	if (pluginInfo == NULL) {
		printf("ERROR: programming %s on line %d\n", __FILE__, __LINE__);
		return NULL;
	}
	
	base = (char*)calloc(len+1,1);
	var = (char*)calloc(len+1,1);

	for (i=0;i<len;i++) {
		
		char c = name[i];
		if (c == '_') {
			c=' ';
		}
		if (c == '.') {
			if (i==0)
				return NULL;
			hasDot = i;
		}
		else if (hasDot)
			var[i-hasDot-1] = c;
		else
			base[i] = c;
	}
	if ((hasDot==0)||(var[0]==0)||(base[0]==0))
		return NULL;

	pparams = getBaseForVariable(pluginInfo,base);
	if (pparams==NULL)
		return NULL;
	return getParamForVariable(pparams, var);
}

void goom_execute_script(PluginInfo *pluginInfo, const char *cmds) {

    goom_script_scanner_compile(pluginInfo->scanner, pluginInfo, cmds);
    goom_script_scanner_execute(pluginInfo->scanner);
}

/* set a script that will be executed every loop */
void goom_set_main_script(PluginInfo *pluginInfo, const char *script) {

    pluginInfo->main_script_str = script;
    goom_script_scanner_compile(pluginInfo->main_scanner, pluginInfo, script);
}

void goom_execute_main_script(PluginInfo *pluginInfo) {
    
    goom_script_scanner_execute(pluginInfo->main_scanner);
}

/* return a script containing the current goom state */
char *goom_create_state_script(PluginInfo *pluginInfo) {
	printf("not implemented\n");
	return NULL;
}