Wild Life  2.29
 All Data Structures Files Functions Variables Typedefs Macros
lib.c
Go to the documentation of this file.
1 /* Copyright 1991 Digital Equipment Corporation.
2  ** All Rights Reserved.
3  *****************************************************************/
4 /* $Id: lib.c,v 1.2 1994/12/08 23:26:47 duchier Exp $ */
5 
6 /* VERSION of Wild-LIFE for calling from C */
7 /* RM: Mar 31 1993 */
8 
9 #include "defs.h"
10 
11 #ifdef SOLARIS
12 #include <stdlib.h>
13 static unsigned int libseed;
14 #endif
15 
16 long noisy=TRUE;
17 long file_date=3;
19 
20 float garbage_time=0;
21 
22 char **group_features(f,n)
23  char **f;
24  ptr_node n;
25 {
26  *f=NULL;
27  if(n) {
28  if(n->left)
29  f=group_features(f,n->left);
30  *f=n->key;
31  f++;
32  if(n->right)
33  f=group_features(f,n->right);
34  }
35 
36  return f;
37 }
38 
39 
40 void exit_if_true(exitflag)
41  long exitflag;
42 {
43  if (exitflag) {
44  printf("\n\n*** Execution is not allowed to continue.\n");
45  /*exit_life(TRUE);*/
46  exit(EXIT_FAILURE);
47  }
48 }
49 
50 
51 
52 /* I/O initialization */
53 void init_io()
54 {
55 #ifdef DJD_PORT_FALSE
56  struct stat buffer_loc;
57 
58  fstat(fileno(stdin), &buffer_loc);
59  /* True iff stdin is from a terminal */
60  stdin_terminal=(S_IFCHR & buffer.st_mode)!=0;
63  output_stream=stdout;
64 #else
68  output_stream=stdout;
69 #endif
70 }
71 
72 
73 // char prompt_buffer[];
74 
75 
76 /* Initial state of system to begin a query */
78 {
79 #ifdef X11
81 #endif
85  undo_stack=NULL; /* 7.8 */
86  var_tree=NULL;
87 
88  /* RM: Oct 13 1993 */
90  prompt=PROMPT;
91  else {
94  }
95 
98 
99 #ifdef X11
100  /* RM: Dec 15 1992 */
102 #endif
103 
104  init_global_vars(); /* RM: Feb 15 1993 */
105 }
106 
107 
108 
109 
110 /******** WFINIT(argc,argv)
111  This routine contains the Read-Solve-Prlong loop.
112  */
113 
114 void WFInit(argc, argv)
115 
116  long argc;
117  char *argv[]; // Modified DJD
118 {
119  // ptr_psi_term s;
120  ptr_stack save_undo_stack;
121  // long sort,exitflag;
122  // int c; 21.12 (prev. char)
123 
124 
125  int i;
126 #ifdef SOLARIS
127  for(i=0;i<256;i++)
128  rand_array[i]=rand_r(&libseed);
129 #else
130  for(i=0;i<256;i++)
131  rand_array[i]=random();
132 #endif
133 
134  if (argc < 10)
135  {
136  arg_c=argc;
137  for (i = 0; i < argc; i++) {
138  arg_v[i]=argv[i];
139  }
140  }
141  else
142  {
143  Errorline("Too many command line arguments\n");
144  }
145 
146  quietflag = TRUE; /* RM: Mar 31 1993 */
147 
148  init_io();
149  init_memory();
151  assert(stack_pointer==mem_base); /* 8.10 */
152  init_copy();
153  assert(stack_pointer==mem_base); /* 8.10 */
154  init_print();
155  assert(stack_pointer==mem_base); /* 8.10 */
156 
157  /* Timekeeping initialization */
158  tzset();
159  (void)times(&life_start);
160  assert(stack_pointer==mem_base); /* 8.10 */
161 
162  init_modules(); /* RM: Jan 8 1993 */
163 
165  assert(stack_pointer==mem_base); /* 8.10 */
166 #ifdef X11
167  x_setup_builtins();
168  assert(stack_pointer==mem_base); /* 8.10 */
169 #endif
170  init_interrupt();
171  assert(stack_pointer==mem_base); /* 8.10 */
172  title();
173  assert(stack_pointer==mem_base); /* 8.10 */
174  init_trace();
175  noisy=FALSE;
176 
177  assert(stack_pointer==mem_base); /* 8.10 */
178 
179 
180  (void)set_current_module(user_module); /* RM: Jan 27 1993 */
181 
182  /* Read in the .set_up file */
183  init_system();
184 
185 #ifdef ARITY /* RM: Mar 29 1993 */
186  arity_init();
187 #endif
188 
189 
190  (void)open_input_file("+SETUP+");
192  file_date+=2;
193  main_prove();
194 
195 
196  (void)setjmp(env);
197  /* printf("%ld\n",(long)(stack_pointer-mem_base)); */ /* 8.10 */
198  init_system();
199  init_trace();
202  save_undo_stack=undo_stack;
203  stdin_cleareof();
204 
205  c_query_level=0;
206 }
207 
208 
209 
210 int WFInput(query)
211 
212  char *query;
213 {
214  ptr_psi_term t;
215  long sort;
216  parse_block pb;
217  int result=WFno;
218  ptr_stack save_undo_stack;
219  ptr_choice_point old_choice;
220 
221 
222  save_undo_stack=undo_stack;
223  old_choice=choice_stack;
224 
225 
226  if(!strcmp(query,".")) {
227  reset_stacks();
228  result=WFyes;
229  c_query_level=0;
230  }
231  else {
232  if(!strcmp(query,";")) {
233  sort=QUERY;
235  }
236  else {
237  /* Parse the string in its own state */
238  save_parse_state(&pb);
241  stringinput=query;
242 
243  /* old_var_occurred=var_occurred; */
245  t=stack_copy_psi_term(parse(&sort));
246 
247  /* Main loop of interpreter */
248  if(sort==QUERY) {
250  goal_count=0;
251 
253  c_query_level++;
256  /* reset_step(); */
257  }
258  else if (sort==FACT) {
260  assert_clause(t);
261  if(assert_ok)
262  result=WFyes;
263  undo(save_undo_stack);
265  encode_types();
266  }
267  }
268 
269  if(sort==QUERY) {
270  start_chrono();
271  main_prove();
272 
274 
275  if((long)(goal_stack->aaaa_1)==c_query_level)
276  if(choice_stack==old_choice) {
277  result=WFyes;
278  c_query_level--;
279  }
280  else
281  result=WFmore;
282  else {
283  result=WFno;
284  c_query_level--;
285  }
286 
288  }
289  }
290  }
291 
292  return result;
293 }
294 
295 
296 
298 
299  char *name;
300 {
301  ptr_psi_term result=NULL;
302  ptr_node n;
303 
304  n=find(STRCMP,name,var_tree);
305  if(n) {
306  result=(ptr_psi_term)n->data;
307  if(result)
308  deref_ptr(result);
309  }
310 
311  return result;
312 }
313 
314 
316 
317  ptr_node n;
318 {
319  int result=0;
320 
321  if(n) {
322  if(n->left)
323  result+=WFfeature_count_loop(n->left);
324  result++;
325  if(n->right)
326  result+=WFfeature_count_loop(n->right);
327  }
328 
329  return result;
330 }
331 
332 
333 
335 
336  ptr_psi_term psi;
337 {
338  int result=0;
339 
340  if(psi) {
341  deref_ptr(psi);
342  result=WFfeature_count_loop(psi->attr_list);
343  }
344 
345  return result;
346 }
347 
348 
349 
350 char *WFType(psi)
351 
352  ptr_psi_term psi;
353 {
354  char *result=NULL;
355  if(psi) {
356  deref_ptr(psi);
357  result=psi->type->keyword->combined_name;
358  }
359  return result;
360 }
361 
362 
363 
364 char **WFFeatures(psi)
365 
366  ptr_psi_term psi;
367 {
368  char **features_loc=NULL;
369  int n;
370 
371  if(psi) {
372  deref_ptr(psi);
373 
374  n=WFfeature_count_loop(psi->attr_list);
375  if(n) {
376  features_loc=(char **)malloc((n+1)*sizeof(char *));
377  (void)group_features(features_loc,psi->attr_list);
378  }
379  }
380 
381  return features_loc;
382 }
383 
384 
385 
386 
387 double WFGetDouble(psi,ok)
388  ptr_psi_term psi;
389  int *ok;
390 {
391  double value=0.0;
392 
393  if(ok)
394  *ok=FALSE;
395 
396  if(psi) {
397  deref_ptr(psi);
398 
399  if(sub_type(psi->type,real) && psi->value_3) {
400  value= *((double *)psi->value_3);
401  if(ok)
402  *ok=TRUE;
403  }
404  }
405  return value;
406 }
407 
408 
409 
410 char *WFGetString(psi,ok)
411  ptr_psi_term psi;
412  int *ok;
413 {
414  char *value=NULL;
415 
416  if(ok)
417  *ok=FALSE;
418 
419  if(psi) {
420  deref_ptr(psi);
421 
422  if(sub_type(psi->type,quoted_string) && psi->value_3) {
423  value=(char *)psi->value_3;
424  if(ok)
425  *ok=TRUE;
426  }
427  }
428  return value;
429 }
430 
431 
432 
433 PsiTerm WFGetFeature(psi,feature)
434 
435  ptr_psi_term psi;
436  char *feature;
437 {
438  ptr_psi_term result=NULL;
439  ptr_node n;
440 
441  if(psi && feature) {
442  deref_ptr(psi);
443  n=find(FEATCMP,feature,psi->attr_list);
444  if(n)
445  result=(PsiTerm)n->data;
446  }
447 
448  return result;
449 }
#define prove
Definition: def_const.h:273
char * WFType(ptr_psi_term psi)
Definition: lib.c:350
ptr_psi_term aaaa_1
Definition: def_struct.h:224
void init_trace()
Definition: error.c:587
void undo(ptr_stack limit)
Definition: login.c:646
long assert_first
Definition: def_glob.h:58
#define FEATCMP
Definition: def_const.h:257
ptr_psi_term stdin_state
Definition: def_glob.h:200
long stdin_terminal
Definition: def_glob.h:188
ptr_goal goal_stack
Definition: def_glob.h:50
ptr_module current_module
Definition: def_glob.h:161
void push_choice_point(goals t, ptr_psi_term a, ptr_psi_term b, GENERIC c)
Definition: login.c:591
void push_goal(goals t, ptr_psi_term a, ptr_psi_term b, GENERIC c)
Definition: login.c:555
psi_term parse(long *q)
Definition: parser.c:877
void init_system()
Definition: lib.c:77
char prompt_buffer[PROMPT_BUFFER]
Definition: def_glob.h:237
ptr_psi_term xevent_list
Definition: def_glob.h:208
void save_parse_state(ptr_parse_block pb)
Definition: token.c:350
long types_done
Definition: lib.c:18
void init_io()
Definition: lib.c:53
#define DEFRULES
Definition: def_const.h:138
#define WFmore
Definition: def_const.h:19
#define FACT
Definition: def_const.h:151
int WFFeatureCount(ptr_psi_term psi)
Definition: lib.c:334
ptr_module user_module
Definition: def_glob.h:156
GENERIC data
Definition: def_struct.h:185
GENERIC other_base
Definition: def_glob.h:19
long quietflag
Definition: def_glob.h:271
#define NULL
Definition: def_const.h:203
ptr_node var_tree
Definition: def_glob.h:26
#define WFno
Definition: def_const.h:13
ptr_psi_term input_state
Definition: def_glob.h:199
long ignore_eff
Definition: def_glob.h:151
#define PROMPT
Definition: def_const.h:109
#define QUERY
Definition: def_const.h:152
ptr_goal resid_aim
Definition: def_glob.h:220
#define WFyes
Definition: def_const.h:16
#define c_what_next
Definition: def_const.h:289
long x_window_creation
Definition: def_glob.h:217
long assert_ok
Definition: def_glob.h:59
ptr_node left
Definition: def_struct.h:183
long sub_type(ptr_definition t1, ptr_definition t2)
Definition: types.c:1544
void * PsiTerm
Definition: def_struct.h:4
ptr_stack undo_stack
Definition: def_glob.h:53
void Errorline(char *format,...)
Definition: error.c:414
char * heap_copy_string(char *s)
Definition: trees.c:147
long goal_count
Definition: def_glob.h:152
ptr_definition real
Definition: def_glob.h:102
char * buffer
Definition: def_glob.h:175
#define deref_ptr(P)
Definition: def_macro.h:95
goals type
Definition: def_struct.h:223
char * key
Definition: def_struct.h:182
void begin_terminal_io()
Definition: token.c:410
#define TRUE
Definition: def_const.h:127
char * name
Definition: def_glob.h:325
#define STRCMP
Definition: def_const.h:255
int WFInput(char *query)
Definition: lib.c:210
void exit_if_true(long exitflag)
Definition: lib.c:40
void start_chrono()
Definition: login.c:330
void init_global_vars()
Definition: lefun.c:1337
#define FALSE
Definition: def_const.h:128
int arg_c
Definition: def_glob.h:5
void init_print()
Definition: print.c:48
long var_occurred
Definition: def_glob.h:189
ptr_definition quoted_string
Definition: def_glob.h:101
GENERIC mem_base
Definition: def_glob.h:11
void init_memory()
Definition: memory.c:1572
char * arg_v[10]
Definition: def_glob.h:6
#define fail
Definition: def_const.h:272
void init_parse_state()
Definition: token.c:381
ptr_psi_term stack_nil()
Definition: built_ins.c:29
char * module_name
Definition: def_struct.h:75
void reset_stacks()
Definition: login.c:1924
long file_date
Definition: lib.c:17
ptr_node find(long comp, char *keystr, ptr_node tree)
Definition: trees.c:341
ptr_psi_term stack_copy_psi_term(psi_term t)
Definition: parser.c:183
#define load
Definition: def_const.h:288
char ** group_features(char **f, ptr_node n)
Definition: lib.c:22
long rand_array[256]
Definition: def_glob.h:279
double WFGetDouble(ptr_psi_term psi, int *ok)
Definition: lib.c:387
#define PROMPT_BUFFER
Definition: def_const.h:112
void encode_types()
Definition: types.c:1015
void WFInit(long argc, argv)
Definition: lib.c:114
jmp_buf env
Definition: def_glob.h:236
void main_prove()
Definition: login.c:2205
struct wl_psi_term * ptr_psi_term
Definition: def_struct.h:34
char * prompt
Definition: def_glob.h:42
void init_built_in_types()
Definition: built_ins.c:5805
long c_query_level
Definition: def_glob.h:289
FILE * output_stream
Definition: def_glob.h:41
float garbage_time
Definition: lib.c:20
GENERIC stack_pointer
Definition: def_glob.h:14
long stringparse
Definition: def_glob.h:202
long noisy
Definition: lib.c:16
char * stringinput
Definition: def_glob.h:203
void init_modules()
Definition: modules.c:30
long memory_check()
Definition: memory.c:1622
void stdin_cleareof()
Definition: token.c:42
PsiTerm WFGetVar(char *name)
Definition: lib.c:297
unsigned long * GENERIC
Definition: def_struct.h:17
void title()
Definition: info.c:31
char * WFGetString(ptr_psi_term psi, int *ok)
Definition: lib.c:410
void init_copy()
Definition: copy.c:34
int WFfeature_count_loop(ptr_node n)
Definition: lib.c:315
long open_input_file(char *file)
Definition: token.c:504
ptr_module set_current_module(ptr_module module)
Definition: modules.c:95
void assert_clause(ptr_psi_term t)
Definition: login.c:267
void init_interrupt()
Definition: interrupt.c:28
ptr_choice_point choice_stack
Definition: def_glob.h:51
char ** WFFeatures(ptr_psi_term psi)
Definition: lib.c:364
#define assert(N)
Definition: memory.c:104
ptr_node right
Definition: def_struct.h:184
ptr_goal next
Definition: def_struct.h:227
PsiTerm WFGetFeature(ptr_psi_term psi, char *feature)
Definition: lib.c:433