home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / msdos / raytrace / pov / gen / bstone / borlandc / bstone.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-03-14  |  7.7 KB  |  310 lines

  1. /*********************** main module *************************************/
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5. #include <string.h>
  6. #include <alloc.h>
  7. #include <signal.h>
  8. #include "t_lex.h"
  9. #include "t_cio.h"
  10. #include "bstone_m.h"
  11.  
  12. static char cpr[]={"\nBuildstone Basic, Thiessenhusen '93/94\n\n"};
  13.  
  14. /**** debugging on/off                                                ****/
  15. static int bdebug=0;
  16. FILE *errlog;
  17. FILE *autosav;
  18. int  break_en=1;
  19. int  break_req=0;
  20. static int auto_save=1;
  21. static int auto_list=1;
  22. int listl=0;
  23.  
  24. /**** signal handler                                                  ****/
  25. void sig_ha(int sig)
  26. {
  27.  if(sig==SIGINT)
  28.    if(break_en)
  29.      { break_req=1; fprintf(stderr,"Break requested\n");
  30.        signal(SIGINT,sig_ha); }
  31.    else
  32.      { signal(SIGINT,SIG_IGN); }
  33.  return;
  34. }
  35.  
  36. void sig_ig(int sig)
  37. {
  38.  if(sig==SIGINT)
  39.    { fprintf(stderr,"Break ignored\n");
  40.      signal(SIGINT,sig_ig); }
  41.  return;
  42. }
  43.  
  44.  
  45. /**** help                                                            ****/
  46. void help(void)
  47. {
  48.  int i;
  49.  const char *hlp[]={"Usage:    bstone <options> <filename> \n",
  50.             "Options:  -?,-h     This message.",
  51.             "          -d        Turn debugging on.",
  52.             "          -b        Disable Ctrl-C (faster)",
  53.             "          -s        Disable automatic save",
  54.             "          -l        Disable auto-listing"
  55.             ""};
  56.  
  57.  for(i=0;*hlp[i]!=(char)0;i++)
  58.    fprintf(stderr,"%s\n",hlp[i]);
  59.  return;
  60. }
  61.  
  62. /**** symbol debugging function                                      *****/
  63. int symdebug(T_NODE * tnode)
  64. {
  65.  int i;
  66.  POV_OBJ *pv;
  67.  DIM_H *dm;
  68.  FT_LOOP *ft;
  69.  
  70.  putc('\n',errlog);
  71. #ifdef __TURBOC__
  72.  fprintf(errlog,"NODE: %p L: %p R: %p NL: %p P: %p N: %05d\n",
  73.         tnode,tnode->l,tnode->r,tnode->nl,tnode->p,tnode->n);
  74. #endif
  75.  fprintf(errlog,"%3d, %-8.8s : ",tnode->c,tnode->s);
  76.  if(tnode->c>0) switch(tnode->c)
  77.    {
  78.     case B_NUM:
  79.     case B_VAL: fprintf(errlog,"number, %lG",*(double *)(tnode->p));
  80.         break;
  81.     case B_VEC: fprintf(errlog,"vector, <%lG,%lG,%lG>",
  82.          ((double *)(tnode->p))[0],((double *)(tnode->p))[1],
  83.          ((double *)(tnode->p))[2]  );
  84.         break;
  85.     case B_STR: fprintf(errlog,"string, %.30s",(tnode->s)+1);
  86.         break;
  87.     case B_OBJ: pv=(POV_OBJ *)(tnode->p);
  88.         if(pv->s!=(char *)NULL)
  89.           fprintf(errlog,"OBJ, %.30s <%d>",pv->s,pv->cnt);
  90.         else
  91.           fprintf(errlog,"OBJ, %s <%d>","NULL",pv->cnt);
  92.         break;
  93.     case B_FLD: dm=(DIM_H *)(tnode->p);
  94.         fprintf(errlog,"field %s ",(tnode->s)+2);
  95.         fprintf(errlog,"len %ld, %d dim: ",dm->l,dm->n);
  96.         for(i=0;i<dm->n;i++)
  97.           fprintf(errlog,"%d ",dm->d[i]);
  98.         break;
  99.     case B_FOR: ft=(FT_LOOP *)(tnode->p);
  100.         fprintf(errlog,"for %s=%lG to %lG step %lG goto %d",
  101.             (tnode->s)+1,ft->start,ft->end,ft->step,ft->n);
  102.         break;
  103.    }
  104.  fprintf(errlog,"\n");
  105.  return(0);
  106. }
  107.  
  108. void obj_deb(POV_OBJ *pv,int level,FILE *fep)
  109. {
  110.  int i,k;
  111.  char *s;
  112.  
  113.  if(pv==(POV_OBJ *)NULL) return;
  114.  
  115.  for(k=0;k<PSIZE;k++) if(obj_all[k]==pv) break;
  116.  if(k==PSIZE) { fprintf(fep,"Object not found.\n"); return; }
  117.  
  118.  fprintf(fep,"* OBJ ");
  119.  for(i=0;i<level;i++) putc('|',fep);
  120.  fprintf(fep," %d.%d.%d ",k,pv->cnt,pv->c);
  121.  if(pv->s!=(char *)NULL) fprintf(fep,"\"%.20s\" ",pv->s);
  122.  else fprintf(fep,"NULL ");
  123.  if(pv->tex!=(POV_OBJ *)NULL) fprintf(fep,"TEX ");
  124.  if(pv->bound!=(POV_OBJ *)NULL) fprintf(fep,"BOUND ");
  125.  fprintf(fep,"\n");
  126.  
  127.  obj_deb(pv->tex,level+1,fep);
  128.  obj_deb(pv->bound,level+1,fep);
  129.  if((pv->s!=(char *)NULL) && (pv->c!=0))
  130.    for(s=pv->s;*s;s+=5)
  131.      {
  132.       k=get4hex(s+1);
  133.       obj_deb(obj_all[k],level+1,fep);
  134.      }
  135.  return;
  136. }
  137.  
  138.  
  139. /* Object debugging function                                             */
  140. int objdebug(T_NODE *tnode)
  141. {
  142.  POV_OBJ *pv;
  143.  
  144.  pv=(POV_OBJ *)(tnode->p);
  145.  fprintf(errlog,"OBJECT %s\n",tnode->s);
  146.  obj_deb(pv,0,errlog);
  147.  return(0);
  148. }
  149.  
  150.  
  151. void write_log(void)
  152. {
  153.  t_symwalk(-1,symdebug);
  154.  t_symwalk(B_OBJ,objdebug);
  155.  
  156. }
  157.  
  158.  
  159. main(int argc, char *argv[])
  160. {
  161.  int i,k,n;
  162.  int id1,id2;
  163.  char *s;
  164.  LEX *lex;
  165.  static char msg[]="Executing main program.";
  166.  
  167.  fprintf(stderr,"%s",cpr);
  168.  errlog=stderr;
  169.  flev=0;
  170.  t_setfep((fp[0]=stdin),3L);
  171.  for(i=1;i<argc;i++)
  172.      {
  173.       if(*argv[i]=='-') /* options */
  174.     for(k=1;k<strlen(argv[i]);k++)
  175.       switch(*(argv[i]+k))
  176.         {
  177.          case 'd': bdebug=1;
  178.                if((errlog=fopen("bstone.log","w"))==NULL)
  179.              t_error("Can't open error log",2);
  180.                fprintf(stderr,"Debugging ON.\n");
  181.                break;
  182.          case 'b': break_en=0;
  183.                fprintf(stderr,"Ctrl-C OFF.\n");
  184.                break;
  185.          case 's': auto_save=0;
  186.                fprintf(stderr,"Auto save OFF.\n");
  187.                break;
  188.          case 'l': auto_list=0;
  189.                fprintf(stderr,"Auto list OFF.\n");
  190.                break;
  191.          case 'h':
  192.          case '?':
  193.          default: help();
  194.               t_error("",-1);
  195.               break;
  196.         }
  197.       else
  198.     {
  199.      if(flev>0) t_error("There is only one file argument allowed!",4);
  200.      if((fp[++flev]=fopen(argv[i],"r"))==NULL)
  201.        { sprintf(err_msg,"Cannot open file: %s.",argv[i]);
  202.          t_error(err_msg,2); }
  203.      fprintf(stderr,"Loading file: %s\n",argv[i]);
  204.      t_setfep(fp[flev],3L);
  205.     }
  206.      }
  207.  
  208.  if(break_en)
  209.    { signal(SIGINT,sig_ha); }
  210.  else
  211.    { signal(SIGINT,sig_ig); }
  212.  
  213. #ifdef __TURBOC__
  214.  if(bdebug) fprintf(errlog,"\nBytes free: %ld\n",coreleft());
  215. #endif
  216.  
  217.  /* init program area */
  218.  for(i=0;i<MAX_LINES;i++) { program[i].n=-1; program[i].s=(char *)NULL; }
  219.  if((obj_all=(POV_OBJ **)malloc(PSIZE*sizeof(POV_OBJ *)))==(POV_OBJ **)NULL)
  220.    t_error(msg,1);
  221.  for(i=0;i<PSIZE;i++) obj_all[i]=(POV_OBJ *)NULL;
  222.  clear_program();
  223.  
  224.  /* command line */
  225.  for(cmdl=1,listl=0;cmdl>0;cmdl++)
  226.    {
  227.     if(!flev)
  228.       {
  229.     if(auto_list)
  230.       {
  231.        n=search_line(listl);
  232.        id1=(n-3>0) ? n-3 : 0; id2=(id1+5>MAX_LINES) ? MAX_LINES : id1+5;
  233.        for(i=id1; (i<=id2) && (program[i].n>=0); i++)
  234.          printf("%-6d%c %s\n", program[i].n, (i==n) ? '>' : ' ',
  235.             retransl_line(program[i].s));
  236.       }
  237.     printf("\nC%d> ",cmdl);
  238.     fflush(stdin);
  239.       }
  240.     lex=t_lex(NULL,NO_FORCE);
  241.     if(lex==(LEX *)NULL) { basic_error(5); continue; }
  242.     if(break_req)
  243.       { break_req=0;
  244.     for(i=1;i<=flev;i++) fclose(fp[i]);
  245.     flev=0; t_setfep((fp[0]=stdin),3L);
  246.     continue;
  247.       }
  248.     switch(lex->typ)
  249.       {
  250.        case EOLX:
  251.        case END:    if(!flev) cmdl=-0XFF;    /* finish session */
  252.             else
  253.               {
  254.                fclose(fp[flev]);
  255.                flev-=1;
  256.                t_setfep(fp[flev],3L);  /* restore file */
  257.               }
  258.             break;
  259.        case EOLN:   printf("\n"); break;     /* empty line */
  260.        case ZAHL:   n=lex->wert.n.i;         /* store line n */
  261.             if(bdebug && flev)
  262.               fprintf(errlog,"%4d%c",n,(cmdl+1)%20 ? ' ':'\n');
  263.             if(!flev) listl=n;
  264.             lex=t_lex(NULL,NO_FORCE);
  265.             switch(lex->typ)
  266.               {
  267.                case EOLX:
  268.                case EOLN:
  269.               insert_line(n,(char *)NULL);  /* delete line n */
  270.               break;
  271.  
  272.                case ZAHL:                       /* insert line n */
  273.               s=program[search_line(lex->wert.n.i)].s;
  274.               if(s!=(char *)NULL) insert_line(n,s);
  275.               break;
  276.  
  277.                case '#': break;
  278.  
  279.                default:
  280.               t_lex(NULL,LEX_PUSH);
  281.               s=translate_line();
  282.               if(s!=(char *)NULL) insert_line(n,s);
  283.               else
  284.                 { sprintf(err_msg,"Line not stored: %d %s\n",
  285.                        n,retransl_line(cline));
  286.                   basic_error(1);
  287.                 }
  288.               break;
  289.               }
  290.             break;
  291.        default:     t_lex(NULL,LEX_PUSH);           /* interpret line */
  292.             s=translate_line();
  293.             if(s!=(char *)NULL) exec_line(s);
  294.             break;
  295.       }
  296.     if(!flev) fflush(stdin);
  297.    }
  298.  
  299.  /* auto save */
  300.  if(auto_save) save_program(0,MAX_LINES,"bstone.sav");
  301.  /* debugging */
  302.  if(bdebug) write_log();
  303.  free(obj_all);
  304. #ifdef __TURBOC__
  305.  if(bdebug) fprintf(errlog,"\nBytes free: %ld\n",coreleft());
  306. #endif
  307.  
  308.  return(0);
  309. }
  310.