home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / GENCSRC.ZIP / FILE.C < prev    next >
C/C++ Source or Header  |  1987-11-21  |  10KB  |  269 lines

  1. /*     FILE.C   FILE.C    FILE.C    FILE.C    FILE.C    FILE.C
  2.  
  3. FILE INPUT AND OUTPUT         XXXXX  XXX  X      XXXXX
  4.                               X       X   X      X
  5. July 1,1987                   X       X   X      X
  6.                               XXX     X   X      XXX
  7.                               X       X   X      X
  8.                               X       X   X      X
  9.                               X      XXX  XXXXX  XXXXX
  10. */
  11. #include "stdio.h"
  12. #include "string.h"
  13. #include "alloc.h"
  14. #include "struct.def"
  15. #include "defin.h"
  16.  
  17. int lastline = 0;
  18. int arrowln = 0;
  19. extern struct lines *top, *bot, *q, *p, *arrow, *trnsend;
  20. extern struct vars allvars[];
  21. extern int varinuse;
  22. extern int printit;
  23. extern char inline[];
  24. extern int errcode;
  25. extern int ignore;
  26. extern int trnsattr;
  27.  
  28. /* ******************************************************** fileout */
  29. /* This routine opens a disk file and writes the marked lines in the*/
  30. /* transcript to that file.                                         */
  31. void fileout(void)
  32. {
  33. char *lpt, fileout[25];
  34. struct lines *pt;
  35. int i;
  36. FILE *fp2;
  37.  
  38.    poscurs(23,1);                  /* read in filename to output to */
  39.    printf("     filename >                    <");
  40.    poscurs(23,17);
  41.    for (i = 0;(fileout[i] = getchar()) != '\n';++i);
  42.    fileout[i] = 0;                /* filename read in, ready to use */
  43.    fp2 = fopen(fileout,"w");                           /* open file */
  44.    pt = top;                        /* start at top of llinked list */
  45.    do {
  46.       lpt = pt->lineloc;                     /* line of text stored */
  47.       if (pt->marked){                  /* only output marked lines */
  48.          fputs(lpt,fp2);                           /* output a line */
  49.          fputs("\n",fp2);                         /* and a linefeed */
  50.       }
  51.       pt = pt->dn;                             /* get the next line */
  52.    } while (pt != NULL);
  53.    fflush(fp2);                           /* flush the file to disk */
  54.    fclose(fp2);                                   /* close the file */
  55.    poscurs(23,7);
  56.    printf("  input >                     ");
  57. }
  58.  
  59. /* ********************************************************* filein */
  60. /* A diskfile is opened and read into the transcript window while   */
  61. /* all calculations are done as the file is input. If any errors are*/
  62. /* found, the calculations are not done, zero is returned as a      */
  63. /* result and the remainder of the file is read in. It is assumed   */
  64. /* that the equations are correct before the file was originally    */
  65. /* written.                                                         */
  66. char filenam[25] = "help";        /* default filename to start with */
  67. void filein(void)
  68. {
  69. char filein[25];
  70. char *fc;
  71. int i;
  72. FILE *fp2;
  73.  
  74.    poscurs(23,1);                      /*read in filename for input */
  75.    printf("     filename >                    <");
  76.    poscurs(23,17);
  77.    for (i = 0; (filein[i] = getchar()) != '\n';++i);
  78.    filein[i] = 0;                /* filename read in , ready to use */
  79.    if (filein[0] == 0)                  /* if no filename was input */
  80.       strcpy(filein,filenam);            /* use last valid filemane */
  81.    else
  82.       strcpy(filenam,filein);                 /* save for later use */
  83.    fp2 = fopen(filein,"r");                            /* open file */
  84.    if (fp2 == NULL) {                         /* file doesn't exist */
  85.       errcode = 11;
  86.       errout();
  87.    }
  88.    else {
  89.       do {
  90.          fc = (fgets(inline,62,fp2));
  91.          if (fc == NULL) break;
  92.          for (i=0;inline[i];++i);
  93.          inline[i-1] = 0;
  94.           parse();
  95.          if ((ignore == 1) || errcode)
  96.             strtrans(inline,0);
  97.          else
  98.             strtrans(inline,1);
  99.          transout();
  100.       } while (i != NULL);
  101.    }
  102.    for (i = 0;i < 200;++i) inline[i] = 0;       /* clear input area */
  103.    poscurs(23,7);
  104.    printf("  input >                      ");
  105. }
  106.  
  107. /* ******************************************************* strtrans */
  108. /* A line from the input area or from a file input is stored in the */
  109. /* transcript area. It is stored in the transcript array here, and  */
  110. /* output to the transcript window in the "transout" function.      */
  111. /* This function uses a linked list to store the lines of data.     */
  112. void strtrans(char line[],int type)
  113. {
  114. int i;
  115. long int temp;
  116. char *pt;
  117. char buffer[25];     /* this is long enough to include an overwrite */
  118. double xx;                                    /* temporary variable */
  119. extern FILE *prtfile;                          /* print file output */
  120.  
  121.    p = (struct lines *)malloc(sizeof(struct lines));
  122.    pt = (char *)malloc(1 + strlen(line));
  123.    if ((p == NULL) || (pt == NULL)) {              /* out of memory */
  124.       errcode = 13;
  125.       errout();
  126.    }
  127.  
  128.    else {                  /* there is enough memory for this entry */
  129.       if (top == NULL){                               /* first entry */
  130.           top = bot = p;
  131.           p->dn = NULL;
  132.           p->up = NULL;
  133.       }
  134.       else {                                  /* additional entries */
  135.           bot->dn = p;
  136.           p->up = bot;
  137.           p->dn = NULL;
  138.           bot = p;
  139.       }
  140.  
  141.       p->lineloc = pt;
  142.       i = strlen(line);
  143.       p->isvalue = type;
  144.       p->marked = type;
  145.       p->linelngt = i;
  146.       if (type) {
  147.          xx = allvars[varinuse].value;
  148.          if (xx < 0.0) xx = -xx;
  149.          if ((xx > 9999999.0) || (xx < .001))
  150.             sprintf(buffer,"%12.5e",allvars[varinuse].value);
  151.          else
  152.             sprintf(buffer,"%12.6f",allvars[varinuse].value);
  153.          buffer[12] = 0;
  154.          if (varinuse > 5) {                /* variable I through N */
  155.             temp = allvars[varinuse].value;
  156.             temp = temp & 077777777;
  157.             if (allvars[varinuse].outtype == 'D')
  158.                sprintf(buffer,"(D) %8ld",temp);
  159.             if (allvars[varinuse].outtype == 'O')
  160.                sprintf(buffer,"(O) %8lo",temp);
  161.             if ((allvars[varinuse].outtype == 'X') ||
  162.                 (allvars[varinuse].outtype == 'H'))
  163.                sprintf(buffer,"(H) %8lx",temp);
  164.          }
  165.          strcpy(p->strval,buffer);
  166.       }
  167.       else
  168.          strcpy(p->strval,"            ");
  169.       line[i] = '\0';                            /* line terminator */
  170.       strcpy(pt,line);
  171.       if (type && printit){
  172.          fprintf(prtfile,"%13s  %-62s\n",buffer,line);
  173.       }
  174.       arrow = p;
  175.       trnsend = p;
  176.       lastline++;
  177.       arrowln = lastline;
  178.    }
  179. }
  180.  
  181. /* ******************************************************* transout */
  182. /* This function outputs the transcript to the transcript window    */
  183. extern char strngout[];
  184. void transout(void)
  185. {
  186. int i;
  187. int maxm = 13;       /* number of lines to output to the trans wind */
  188. char *pt;
  189.    p = trnsend;
  190.    for (i = 0;i < maxm;++i){           /* count up max from trnsend */
  191.       if (p->up == NULL) break;                /* stop if top found */
  192.       p = p->up;
  193.    }
  194.    for (i = 0;i <= maxm;++i){       /* output max fields to viddisp */
  195.       pt = p->lineloc;                 /* pt now points to the line */
  196.       strcpy(strngout,p->strval);
  197.       strngdis(8+i,1,trnsattr);       /* output the formatted value */
  198.       strcpy(strngout,pt);
  199.       blnkline(8+i,16);                     /* write blanks to line */
  200.       if (p->marked)
  201.          chardis(8+i,15,trnsattr,'*');          /* marked indicator */
  202.       else
  203.          chardis(8+i,15,trnsattr,' ');                     /* blank */
  204.       strngdis(8+i,17,trnsattr);
  205.       if (arrow == p)
  206.          chardis(8+i,14,trnsattr,16);                 /* arrow char */
  207.       else
  208.          chardis(8+i,14,trnsattr,' ');                     /* blank */
  209.       if (p->dn == NULL) break;             /* stop if bottom found */
  210.       p = p->dn;
  211.    }
  212.    poscurs(23,3);
  213.    printf("%4d",arrowln);
  214. }
  215.  
  216. /* ******************************************************* movarrow */
  217. /* This function is used to move the arrow up or down in the window */
  218. /* and to control where the window begins and ends in the transcript*/
  219. /* data. The arrow is always two lines from the top or bottom if it */
  220. /* is possible to do so.                                            */
  221. void movarrow(int where)
  222. {
  223. int index;
  224. struct lines *temp;
  225. int iend, iarrow, itrnsend;
  226.    iend = iarrow = itrnsend = 0;
  227.    if (where > 0) {
  228.       for (index = where;index && (arrow != bot);--index)
  229.          arrow = arrow->dn;                  /* move arrow down one */
  230.       for (temp = top,index = 0;temp != bot;index++) {
  231.          if (temp == arrow) iarrow = index;         /* locate arrow */
  232.          if (temp == trnsend) itrnsend = index;  /* loc display end */
  233.          temp = temp->dn;
  234.       }
  235.       if (temp == arrow) iarrow = index;          /* if they are at */
  236.       if (temp == trnsend) itrnsend = index;      /* the bottom end */
  237.       iend = index;
  238.            /* now trnsend must be >= arrow, but not by more than 10 */
  239.       if (iarrow == iend) index = iend - itrnsend;
  240.       else if (itrnsend < (iarrow+1)) index = iarrow - itrnsend + 1;
  241.       else index = 0;
  242.    }
  243.    else {
  244.       for (index = -where;index && (arrow != top);--index)
  245.          arrow = arrow->up;                    /* move arrow up one */
  246. /*    if (arrow == top) arrow = arrow->dn;      move one field down */
  247.       for (temp = top,index = 0;temp != bot;index++) {
  248.          if (temp == arrow) iarrow = index;         /* locate arrow */
  249.          if (temp == trnsend) itrnsend = index;  /* loc display end */
  250.          temp = temp->dn;
  251.       }
  252.       if (temp == arrow) iarrow = index;          /* if they are at */
  253.       if (temp == trnsend) itrnsend = index;      /* the bottom end */
  254.       iend = index;
  255.            /* now trnsend must be >= arrow, but not by more than 12 */
  256.       if (iarrow == 0) index = (iend > 13?13:iend) - itrnsend;
  257.       else if ((itrnsend - iarrow) > 12) index = iarrow-itrnsend+12;
  258.       else index = 0;
  259.    }
  260.    if (index > 0)
  261.       for (;index > 0;--index)
  262.          trnsend = trnsend->dn;
  263.    else if (index < 0)
  264.       for (;index < 0;++index)
  265.          trnsend = trnsend->up;
  266.    arrowln = iarrow;
  267.    transout();
  268. }
  269.