/* -*- LPC -*- */
/*
* $Locker: $
* $Id: process_value.c,v 1.2 1998/03/07 13:49:40 pinkfish Exp $
* $Log: process_value.c,v $
* Revision 1.2 1998/03/07 13:49:40 pinkfish
* Fixes because of the new inherit structor of the simul_efun object.
*
* Revision 1.1 1998/01/06 05:13:15 ceres
* Initial revision
*
*/
/*
* process_value - a replacement for the (now missing) process_value
* efun. I was hoping that function pointers would
* make this unnecessary, but there's no way to store
* a function pointer with the autoloader.
*
* Initial release: 16-Nov-96
*/
string *pattern = ({
"\\|", " *[0-9]+ *", ".*"
});
#define PV_BAR 2
#define PV_INT 3
#define PV_STR 4
#define PV_QUOTED 5
int *token = ({ 2, 3, 4 });
/**
* This method replaces the process_value efun which is now missing.
* @param s the string to process
* @return the processed string
*/
mixed process_value(string s) {
string func, file, arg;
mixed assoc, params;
object ob;
int i;
if (sscanf(s, "%s|%s", func, arg) == 2) {
// Call has arguments
} else {
// No arguments
func = s;
arg = 0;
}
if (sscanf(func, "%s:%s", func, file) == 2) {
if (!objectp(ob = find_object(file)))
return 0;
} else {
ob = this_object();
}
//printf("func: %O\n", func);
//printf("file: %O\n", file);
params = ({ func });
if (stringp(arg)) {
assoc = reg_assoc(arg, pattern, token);
// First, get rid of the separators
for (i = 0; i < sizeof(assoc[0]); i++) {
if ((assoc[0][i] == "") && (assoc[1][i] == 0)) {
assoc[0] = assoc[0][0..i - 1] + assoc[0][i + 1..];
assoc[1] = assoc[1][0..i - 1] + assoc[1][i + 1..];
} else if (assoc[1][i] == 0) {
// Got unanticipated pattern; dunno what to do here
write("process_value: syntax error: " + assoc[0][i] + "\n");
return 0;
}
}
// Check for escaped special characters
for (i = 0; i < sizeof(assoc[0])-1; i++) {
if ((assoc[1][i+1] == PV_BAR)
&& (strsrch(assoc[0][i], "\\", -1) == strlen(assoc[0][i])-1)) {
assoc[0][i] = assoc[0][i][0..sizeof(assoc[0][i])-2];
if (i+2 < sizeof(assoc[0])) {
//printf("i=%d; assoc=%O\n", i, assoc);
assoc[0][i] += assoc[0][i+1] + assoc[0][i+2];
assoc[0] = assoc[1][0..i] + assoc[1][i + 2..];
} else {
assoc[0][i] += assoc[0][i+1];
assoc[0] = assoc[1][0..i] + assoc[1][i + 2..];
}
}
}
for (i = 0; i < sizeof(assoc[0]); i++) {
switch (assoc[1][i]) {
case PV_BAR:
//printf("bar: %O\n", assoc[0][i]);
break;
case PV_INT:
//printf("int: %O\n", to_int(assoc[0][i]));
params += ({ to_int(assoc[0][i]) });
break;
case PV_STR:
case PV_QUOTED:
//printf("string: %O\n", assoc[0][i]);
params += ({ assoc[0][i] });
break;
default:
//if (assoc[0][i] != "")
//printf("OTHER: %O\n", assoc[0][i]);
}
}
}
return call_other( ob, params );
}
/*
* And I'll just put process_string in here also, so that it's all in
* one place.
*/
string process_string(string s) {
string *ss, proc;
int i;
ss = explode(s, "@@");
if (strsrch(s, "@@") == 0)
ss = ({ "" }) + ss;
for (i = 1; i < sizeof(ss); i += 2) {
proc = process_value(ss[i]);
if (stringp(proc))
ss[i] = proc;
}
return implode(ss, "");
}