30#include "EST_String.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"
43extern "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)
56int 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
92LISP siod_get_lval(
const char *name,
const char *message)
100 if (symbol_boundp(iii,current_env) == NIL)
106 rval = symbol_value(iii, current_env);
111LISP siod_set_lval(
const char *name,LISP val)
118 rval = setvar(iii,val,current_env);
123LISP 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)
165LISP 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)
177LISP 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)))))
189LISP 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)))
200int siod_llength(LISP list)
206 for (len=0,l=list; CONSP(l); l=CDR(l),len++);
212LISP siod_nth(
int n,LISP list)
218 for (i=0,l=list; CONSP(l); l=CDR(l),i++)
226int siod_atomic_list(LISP list)
231 for (p=list; p != NIL; p=cdr(p))
238int 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));
256LISP siod_last(LISP list)
260 if ((list == NIL) || (NCONSP(list)))
264 for (l=list; cdr(l) != NIL; l=cdr(l));
269int 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;
290float 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;
311const 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)));
325LISP get_param_lisp(
const char *name, LISP params, LISP defval)
331 pair = siod_assoc_str(name,params);
336 return car(cdr(pair));
339LISP make_param_str(
const char *name,
const char *val)
341 return cons(rintern(name),cons(rintern(val),NIL));
344LISP make_param_int(
const char *name,
int val)
346 return cons(rintern(name),cons(flocons(val),NIL));
349LISP make_param_float(
const char *name,
float val)
351 return cons(rintern(name),cons(flocons(val),NIL));
354LISP 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);
377LISP 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);
393LISP 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))
411LISP 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);
420LISP stringexplode(
const char *str)
428 for (i=0; i < strlen(str); i++)
431 l = cons(rintern(
id),l);
439char **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)));
479char **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);
int matches(const char *e, int pos=0) const
Exactly match this string?
void clear(void)
remove all items in list
void append(const T &item)
add item onto end of list