30 #include "EST_String.h"
31 #include "EST_THash.h"
32 #include "EST_StringTrie.h"
33 #include "EST_cutils.h"
34 #include "EST_strcasecmp.h"
37 #include "siodeditline.h"
39 #ifdef EST_SIOD_ENABLE_PYTHON
40 #include "slib_python.h"
43 extern "C" const char * repl_prompt;
48 #if defined(INSTANTIATE_TEMPLATES)
49 #include "../base_class/EST_THash.cc"
51 Instantiate_TStringHash_T(
EST_Regex *, hash_string_regex)
56 int siod_init(
int heap_size)
63 char *char_heap_size=getenv(
"SIODHEAPSIZE");
64 if ((char_heap_size == 0) ||
65 (atoi(char_heap_size) < 1000))
66 actual_heap_size=ACTUAL_DEFAULT_HEAP_SIZE;
68 actual_heap_size=atoi(char_heap_size);
71 actual_heap_size = heap_size;
73 init_storage(actual_heap_size);
76 #ifdef EST_SIOD_ENABLE_PYTHON
85 #ifdef EST_SIOD_ENABLE_PYTHON
92 LISP siod_get_lval(
const char *name,
const char *message)
100 if (symbol_boundp(iii,current_env) == NIL)
106 rval = symbol_value(iii, current_env);
111 LISP siod_set_lval(
const char *name,LISP val)
118 rval = setvar(iii,val,current_env);
123 LISP siod_assoc_str(
const char *key,LISP alist)
129 for (l=alist; CONSP(l); l=CDR(l))
135 if (NULLP(lcc))
continue;
136 else if TYPEP(lcc,tc_symbol)
138 if (strcmp(key,PNAME(lcc))==0)
141 else if TYPEP(lcc,tc_flonum)
143 if (FLONMPNAME(lcc) == NULL)
146 sprintf(b,
"%g",FLONM(lcc));
147 FLONMPNAME(lcc) = (
char *)must_malloc(strlen(b)+1);
148 sprintf(FLONMPNAME(lcc),
"%s",b);
150 if (strcmp(key,FLONMPNAME(lcc))==0)
153 else if TYPEP(lcc,tc_string)
155 if (strcmp(key,lcc->storage_as.string.data)==0)
165 LISP siod_member_str(
const char *key,LISP list)
170 for (l=list; CONSP(l); l=CDR(l))
171 if (strcmp(key,get_c_string(CAR(l))) == 0)
177 LISP siod_regex_member_str(
const EST_String &key,LISP list)
182 for (l=list; CONSP(l); l=CDR(l))
183 if (key.
matches(make_regex(get_c_string(CAR(l)))))
189 LISP siod_member_int(
const int key,LISP list)
194 for (l=list; CONSP(l); l=CDR(l))
195 if (key == get_c_int(CAR(l)))
200 int siod_llength(LISP list)
206 for (len=0,l=list; CONSP(l); l=CDR(l),len++);
212 LISP siod_nth(
int n,LISP list)
218 for (i=0,l=list; CONSP(l); l=CDR(l),i++)
226 int siod_atomic_list(LISP list)
231 for (p=list; p != NIL; p=cdr(p))
238 int siod_eof(LISP item)
242 (cdr(item) == NIL) &&
243 (SYMBOLP(car(item))) &&
244 (strcmp(
"eof",get_c_string(car(item))) == 0))
253 return cons(rintern(
"quote"),cons(l,NIL));
256 LISP siod_last(LISP list)
260 if ((list == NIL) || (NCONSP(list)))
264 for (l=list; cdr(l) != NIL; l=cdr(l));
269 int get_param_int(
const char *name, LISP params,
int defval)
275 pair = siod_assoc_str(name,params);
279 else if FLONUMP(car(cdr(pair)))
280 return (
int)FLONM(car(cdr(pair)));
283 cerr <<
"param " << name <<
" not of type int" << endl;
290 float get_param_float(
const char *name, LISP params,
float defval)
296 pair = siod_assoc_str(name,params);
300 else if (FLONUMP(car(cdr(pair))))
301 return (
float)FLONM(car(cdr(pair)));
304 cerr <<
"param " << name <<
" not of type float" << endl;
311 const char *get_param_str(
const char *name, LISP params,
const char *defval)
317 pair = siod_assoc_str(name,params);
322 return get_c_string(car(cdr(pair)));
325 LISP get_param_lisp(
const char *name, LISP params, LISP defval)
331 pair = siod_assoc_str(name,params);
336 return car(cdr(pair));
339 LISP make_param_str(
const char *name,
const char *val)
341 return cons(rintern(name),cons(rintern(val),NIL));
344 LISP make_param_int(
const char *name,
int val)
346 return cons(rintern(name),cons(flocons(val),NIL));
349 LISP make_param_float(
const char *name,
float val)
351 return cons(rintern(name),cons(flocons(val),NIL));
354 LISP make_param_lisp(
const char *name,LISP val)
356 return cons(rintern(name),cons(val,NIL));
367 rx = regexes.val(sr,found);
371 regexes.add_item(sr,rx);
377 LISP apply_hooks(LISP hooks,LISP arg)
385 if (hooks && (!CONSP(hooks)))
386 r = leval(cons(hooks,cons(quote(arg),NIL)),NIL);
388 for (h=hooks; h != NIL; h=cdr(h))
389 r = leval(cons(car(h),cons(quote(arg),NIL)),NIL);
393 LISP apply_hooks_right(LISP hooks,LISP args)
403 else if (!CONSP(hooks))
404 r = apply(hooks,args);
406 for (r=args,h=hooks; h != NIL; h=cdr(h))
411 LISP apply(LISP func,LISP args)
415 for (qa=NIL,a=args; a; a=cdr(a))
416 qa = cons(quote(car(a)),qa);
417 return leval(cons(func,reverse(qa)),NIL);
420 LISP stringexplode(
const char *str)
428 for (i=0; i < strlen(str); i++)
431 l = cons(rintern(
id),l);
439 char **siod_variable_generator(
char *text,
int length)
443 char **matches = NULL;
447 for(lmatches=NIL,l=oblistvar;CONSP(l);l=CDR(l))
449 if (VCELL(car(l)) == NIL)
continue;
450 switch(TYPE(VCELL(CAR(l))))
464 name = PNAME(CAR(l));
465 if (strncmp(name, text, length) == 0)
466 lmatches = cons(CAR(l),lmatches);
471 matches = walloc(
char *,siod_llength(lmatches)+1);
472 for (l=lmatches,i=0; l; l=cdr(l),i++)
473 matches[i] = wstrdup(PNAME(car(l)));
479 char **siod_command_generator (
char *text,
int length)
483 char **matches = NULL;
487 for(lmatches=NIL,l=oblistvar;CONSP(l);l=CDR(l))
489 if (VCELL(car(l)) == NIL)
continue;
490 switch(TYPE(VCELL(CAR(l))))
502 name = PNAME(CAR(l));
503 if (strncmp(name, text, length) == 0)
504 lmatches = cons(CAR(l),lmatches);
510 matches = walloc(
char *,siod_llength(lmatches)+1);
511 for (l=lmatches,i=0; l; l=cdr(l),i++)
512 matches[i] = wstrdup(PNAME(car(l)));
525 for (b=l; b != NIL; b=cdr(b))
526 a.
append(get_c_string(car(b)));
536 for (p=a.head(); p != 0; p=p->next())
537 b = cons(rintern(a(p)),b);