home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum7.lzh / C / VC / prog.c < prev    next >
Text File  |  1988-09-06  |  2KB  |  112 lines

  1. /* Mark Weiser, humble programmer. */
  2. /* $Log:    prog.c,v $
  3.  * Revision 1.1  84/12/10  23:17:20  mark
  4.  * Initial revision
  5.  *
  6.  * Adapted to OS9 by Uwe Simon August 1988
  7.  *  */
  8.  
  9. static char rcsid[] = "$Header: /g/mark/vc/prog.c,v 1.1 84/12/10 23:17:20 mark Exp $";
  10. #include <stdio.h>
  11. #include "sc.h"
  12.  
  13. char pipename[]= "/PIPE/VCXXXXXX";
  14.  
  15. char s[10240],ts[128];
  16.  
  17. struct lnode * newlist(e)
  18. struct enode *e;
  19. {
  20.     struct lnode *r;
  21.     r = (struct lnode *)malloc(sizeof(struct lnode));
  22.     r->num = 1;
  23.     r->lptr[0] = e;
  24.     return r;
  25. }
  26.  
  27. struct lnode * addlist(l,e)
  28. struct lnode *l;
  29. struct enode *e;
  30. {
  31.     if (l->num >= MAXLPTR)
  32.         error("Too many arguments");
  33.     l->lptr[l->num] = e;
  34.     l->num += 1;
  35.     return l;
  36. }
  37.  
  38.  
  39. double executeprogram(e)
  40. struct enode *e;
  41. {
  42.     char *name;
  43.     struct lnode *l;
  44.     double d,eval();
  45.     FILE *stream,*fopen();
  46.     struct enode *p;
  47.     int i;
  48.     name = (char *)(e->e.o.left) ;
  49.     l = (struct lnode *)(e->e.o.right) ;
  50.     strcpy(s,name);
  51.     strcat(s," ");
  52.     if (l)
  53.     {
  54.         for (i=0; i < l->num; i += 1)
  55.         {
  56.             p = l->lptr[i];
  57.             if (p -> op == 's')    /* new type string */
  58.                 strcat(s,p->e.o.left);
  59.             else    {
  60.                 sprintf(ts,"%g",eval(p));
  61.                 strcat(s,ts);
  62.                 }
  63.             strcat(s," ");
  64.         }
  65.     }
  66.     strcat(s, ">-");
  67.     mktemp(pipename);
  68.     strcat(s, pipename);            
  69.     system(s);
  70.     stream = fopen(pipename,"r");
  71.     d = 0.0;
  72.     fgets(s,80,stream);
  73.     d=atof(s);
  74.     while(fgets(s,80,stream));   /* ueberlese den Rest der Daten */
  75.         
  76.     fclose(stream); 
  77.     return d;
  78.     }
  79.  
  80. saveprogram(v,s,l)
  81. struct ent *v;
  82. char *s;
  83. struct lnode *l;
  84.     {
  85.     v->expr = new('p', s, l);
  86.     v->flags |= (is_changed|is_valid);
  87.     changed++;
  88.     modflg++;
  89.     }
  90.  
  91. pfree(e)
  92. struct enode *e;
  93. {
  94. struct enode *p;
  95. struct lnode *l;
  96. int i;
  97. free(e->e.o.left);
  98. l = (struct lnode *)(e->e.o.right);
  99. for(i = l->num; i>0 ; i -= 1)
  100.     {
  101.     p = (struct enode *)l->lptr[i];
  102.     if (p->op == 's')
  103.         {
  104.         free(p->e.o.left);
  105.         free(p);
  106.         }
  107.     else    efree(l->lptr[i]);
  108.     }
  109. free(e->e.o.right);
  110. free(e);
  111. }
  112.