/[cvs]/stack/stack.c
ViewVC logotype

Diff of /stack/stack.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.3 by teddy, Mon Jan 7 23:31:34 2002 UTC revision 1.7 by masse, Tue Jan 8 13:46:05 2002 UTC
# Line 11  Line 11 
11    
12  typedef struct stack_item  typedef struct stack_item
13  {  {
14    enum {value, string, ref, func} type;    enum {value, string, ref, func, symbol, list} type;
15    union {    union {
16      void* ptr;      void* ptr;
17      int val;      int val;
# Line 110  void def_func(hashtbl in_hashtbl, funcp Line 110  void def_func(hashtbl in_hashtbl, funcp
110    mk_hashentry(in_hashtbl, temp, id);    mk_hashentry(in_hashtbl, temp, id);
111  }  }
112    
113    void def_sym(hashtbl in_hashtbl, const char* id)
114    {
115      stackitem* temp= malloc(sizeof(stackitem));
116      
117      temp->type= symbol;
118    
119      mk_hashentry(in_hashtbl, temp, id);
120    }
121    
122  int push_ref(stackitem** stack_head, hashtbl in_hash, const char* in_string)  int push_ref(stackitem** stack_head, hashtbl in_hash, const char* in_string)
123  {  {
124    void* handle;    static void* handle= NULL;
125    void* symbol;    void* symbol;
126      
127    stackitem* new_item= malloc(sizeof(stackitem));    stackitem* new_item= malloc(sizeof(stackitem));
128    new_item->content.ptr= *hash(in_hash, in_string);    new_item->content.ptr= *hash(in_hash, in_string);
129    new_item->type= ref;    new_item->type= ref;
130    
131    if(new_item->content.ptr==NULL) {    if(handle==NULL)
132      handle= dlopen(NULL, RTLD_LAZY);      handle= dlopen(NULL, RTLD_LAZY);
133    
134      if(new_item->content.ptr==NULL) {
135      symbol= dlsym(handle, in_string);      symbol= dlsym(handle, in_string);
136      if(dlerror()==NULL) {      if(dlerror()==NULL)
137        def_func(in_hash, symbol, in_string);        def_func(in_hash, symbol, in_string);
138        new_item->content.ptr= *hash(in_hash, in_string);      else
139        new_item->type= ref;        def_sym(in_hash, in_string);
140      }        
141        new_item->content.ptr= *hash(in_hash, in_string);
142        new_item->type= ref;
143    }    }
144    
145    push(stack_head, new_item);    push(stack_head, new_item);
# Line 137  extern void toss(stackitem** stack_head) Line 150  extern void toss(stackitem** stack_head)
150  {  {
151    stackitem* temp= *stack_head;    stackitem* temp= *stack_head;
152    
153      if((*stack_head)==NULL)
154        return;
155      
156      if((*stack_head)->type==string)
157        free((*stack_head)->content.ptr);
158    
159    *stack_head= (*stack_head)->next;    *stack_head= (*stack_head)->next;
160    free(temp);    free(temp);
161  }  }
# Line 156  void print_st(stackitem* stack_head, lon Line 175  void print_st(stackitem* stack_head, lon
175      printf("%ld: \"%s\"\n", counter, (char*)stack_head->content.ptr);      printf("%ld: \"%s\"\n", counter, (char*)stack_head->content.ptr);
176      break;      break;
177    case ref:    case ref:
178        printf("%ld: %s\n", counter, ((stackitem*)stack_head->content.ptr)->id);
179        break;
180    case func:    case func:
181      case symbol:
182      default:
183      printf("%ld: %p\n", counter, stack_head->content.ptr);      printf("%ld: %p\n", counter, stack_head->content.ptr);
184      break;      break;
185    }    }
# Line 224  extern void print(stackitem** stack_head Line 247  extern void print(stackitem** stack_head
247    if((*stack_head)==NULL)    if((*stack_head)==NULL)
248      return;      return;
249    
250    if((*stack_head)->type==value)    switch((*stack_head)->type){
251      case value:
252      printf("%d", (*stack_head)->content.val);      printf("%d", (*stack_head)->content.val);
253    else if((*stack_head)->type==string)      break;
254      case string:
255      printf("%s", (char*)(*stack_head)->content.ptr);      printf("%s", (char*)(*stack_head)->content.ptr);
256    else      break;
257      case ref:
258        printf("%s", ((stackitem*)(*stack_head)->content.ptr)->id);
259        break;
260      case symbol:
261      default:
262      printf("%p", (*stack_head)->content.ptr);      printf("%p", (*stack_head)->content.ptr);
263        break;
264      }
265    
266    toss(stack_head);    toss(stack_head);
267  }  }
268    
269    extern void pack(stackitem** stack_head)
270    {
271      void* delimiter;
272      stackitem *iterator, *temp, *pack;
273    
274      if((*stack_head)==NULL)
275        return;
276    
277      delimiter= (*stack_head)->content.ptr;
278      toss(stack_head);
279    
280      iterator= *stack_head;
281    
282      while(iterator->next!=NULL && iterator->next->content.ptr!=delimiter)
283        iterator= iterator->next;
284    
285      temp= *stack_head;
286      *stack_head= iterator->next;
287      iterator->next= NULL;
288      
289      if(*stack_head!=NULL && (*stack_head)->content.ptr==delimiter)
290        toss(stack_head);
291    
292      pack= malloc(sizeof(stackitem));
293      pack->type= list;
294      pack->content.ptr= temp;
295    
296      push(stack_head, pack);
297    }
298      
299    
300  extern void nl()  extern void nl()
301  {  {
302    printf("\n");    printf("\n");
303  }  }
304    
305    extern void quit()
306    {
307      exit(EXIT_SUCCESS);
308    }
309    
310  int main()  int main()
311  {  {
312    stackitem* s= NULL;    stackitem* s= NULL;

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.7

root@recompile.se
ViewVC Help
Powered by ViewVC 1.1.26