home *** CD-ROM | disk | FTP | other *** search
/ Between Heaven & Hell 2 / BetweenHeavenHell.cdr / 500 / 471 / rccl131 < prev    next >
Text File  |  1987-03-02  |  9KB  |  429 lines

  1. /*
  2.  *                            Author :  Vincent Hayward
  3.  *                                      School of Electrical Engineering
  4.  *                                      Purdue University
  5.  *      Dir     : uti
  6.  *      File    : dsp.c
  7.  *      Remarks : pseudo graphic terminal plotting
  8.  *      Usage   : cc dsp.c -ltermlib  -o mybin/dsp
  9.  */
  10.  
  11.  
  12. #include <stdio.h>
  13. #include <signal.h>
  14. #include <ctype.h>
  15. #include <sgtty.h>
  16.  
  17.  
  18. #define MAX     10000
  19. #define PREC    (1.e-2)
  20. #define YES 1
  21. #define NO  0
  22. #define GO(x, y)        fputs(tgoto(CM, y, x), stdout)
  23.  
  24. static struct sgttyb mode;
  25.  
  26. main(argc ,argv)
  27. int argc;
  28. char **argv;
  29. {
  30.     FILE *fp ,*nfp, *fptime ,*fpchar ,*fopen();
  31.     char *getenv(), *tgetstr(), *rdchar(), *tgoto();
  32.     char   chars[MAX];
  33.     int ind, dtime, scroll = NO, pro = YES, lx[24], ly[80], incr = 1;
  34.     int np, i, bias, c, pos_disp, vel_disp, acc_disp;
  35.     int abt(), ouf();
  36.     char name[30] ,base[30], root[30],
  37.          tfil[30], cfil[30], num[20],
  38.          nname[30], nbase[30];
  39.     char *nbp, *pre, *lab;
  40.     int timb[MAX];
  41.     double pos[MAX] ,vel[MAX] ,acc[MAX] ,*buffer;
  42.     double pmax, pmin, vmax, vmin, amax, amin, maxi ,mini, step, d;
  43.     char buf[1024],  cmbuff[30], *x;
  44.     char *CL, *CM;
  45.     int lin, col;
  46.  
  47.     signal (SIGINT ,abt);
  48.     if (argc > 2)
  49.         exit(1);
  50.     else {
  51.         if ((pre = getenv("GRAPHDIR")) == NULL) {
  52.             pre = "../g";
  53.         }
  54.         strcpy(root ,pre);
  55.         strcat(root ,"/");
  56.         do {
  57.             strcpy(name, root);
  58.             if (argc == 1) {
  59.                 printf("file ? ");
  60.                 if (scanf("%s", base) < 0) {
  61.                     printf("\n");
  62.                     exit(2);
  63.                 }
  64.             }
  65.             else {
  66.                 strcpy(base ,*++argv);
  67.             }
  68.             strcat(name, base);
  69.             strcat(name ,".out");
  70.             argc = 1;
  71.         } while ((fp = fopen(name ,"r")) == NULL);
  72.     }
  73.     strcpy(tfil, root);
  74.     strcat(tfil, "t.out");
  75.     if ((fptime = fopen(tfil ,"r")) != NULL) {
  76.         np = fread(timb ,sizeof(int) ,MAX ,fptime);
  77.         if (np < 0) {
  78.             printf("read error\n");
  79.             exit(1);
  80.         }
  81.         if (np == 0) {
  82.             printf("empty time file\n");
  83.             exit(2);
  84.         }
  85.         incr = timb[1] - timb[0];
  86.         bias = 6;
  87.     }
  88.     else {
  89.         bias = 4;
  90.     }
  91.  
  92.     np = fread(pos ,sizeof(double) ,MAX ,fp);
  93.     if (np < 0) {
  94.         printf("read error\n");
  95.         exit(1);
  96.     }
  97.     if (np == 0) {
  98.         printf("empty point file\n");
  99.         exit(2);
  100.     }
  101.  
  102.     strcpy(cfil, root);
  103.     strcat(cfil, "c.out");
  104.     if ((fpchar = fopen(cfil ,"r")) != NULL) {
  105.         if (fread(chars ,sizeof(char) ,MAX ,fpchar) != np) {
  106.             fprintf(stderr ,"dsp:invalid char file\n");
  107.             exit(3);
  108.         }
  109.     }
  110.  
  111.     tgetent(buf, getenv("TERM"));
  112.     x = cmbuff;
  113.     CL = tgetstr("cl", &x);
  114.     CM = tgetstr("cm", &x);
  115.     col = tgetnum("co");
  116.     lin = tgetnum("li") - 1;
  117.  
  118.     gtty(1, &mode);
  119.     mode.sg_flags |= CBREAK;
  120.     ioctl(1, TIOCSETP, &mode);
  121.  
  122.     signal(SIGINT, ouf);
  123.  
  124.     buffer = pos;
  125.     ind = 0;
  126. rinit:
  127.     pos_disp = vel_disp = acc_disp = YES;
  128.     pmax = -1.e+38; pmin = 1.e+38;
  129.     vmax = -1.e+38; vmin = 1.e+38;
  130.     amax = -1.e+38; amin = 1.e+38;
  131.  
  132.     for(i = 0; i < np; i++) {
  133.         if (pmax < pos[i])
  134.             pmax = pos[i];
  135.         if (pmin > pos[i])
  136.             pmin = pos[i];
  137.     }
  138.     if (pmax - pmin < PREC) {
  139.         pos_disp = vel_disp = acc_disp =NO;
  140.         GO(lin, 0);
  141.         printf(
  142.         "Flat curve at %8.3f type any character to continue", pos[0]);
  143.         getchar();
  144.         GO(lin, 0);
  145.         printf(
  146.         "                                                          ");
  147.     }
  148.     else {
  149.         for(i = 1; i < np; i++) {
  150.             vel[i] = pos[i] - pos[i-1];
  151.             if (vmax < vel[i])
  152.                 vmax = vel[i];
  153.             if (vmin > vel[i])
  154.                 vmin = vel[i];
  155.         }
  156.         vel[0] = vel[1];
  157.         if (vmax - vmin < PREC) {
  158.             vel_disp = acc_disp = NO;
  159.             GO(lin, 0);
  160.             printf(
  161.     "Constant velocity at %8.3f type any character to continue", vel[1]);
  162.             getchar();
  163.             GO(lin, 0);
  164.             printf(
  165.     "                                                                  ");
  166.         }
  167.         else {
  168.             for(i = 2; i < np; i++) {
  169.                 acc[i] = vel[i] - vel[i-1];
  170.                 if (amax < acc[i])
  171.                     amax = acc[i];
  172.                 if (amin > acc[i])
  173.                     amin = acc[i];
  174.             }
  175.             acc[0] = acc[1] = acc[2];
  176.             if (amax - amin < PREC) {
  177.                 acc_disp = NO;
  178.                 GO(lin, 0);
  179.                 printf(
  180. "Constant acceleration at %8.3f  type any character to continue", acc[2]);
  181.                 getchar();
  182.                 GO(lin, 0);
  183.                 printf(
  184. "                                                                          ");
  185.             }
  186.         }
  187.     }
  188.     for ( ; ;) {
  189.         if (buffer == pos && pos_disp == NO ||
  190.             buffer == vel && vel_disp == NO ||
  191.             buffer == acc && acc_disp == NO) {
  192.             goto promt;
  193.         }
  194.         if (!scroll) {
  195.             if (buffer == pos) {
  196.                 maxi = pmax;
  197.                 mini = pmin;
  198.                 lab = "POS";
  199.             }
  200.             if (buffer == vel) {
  201.                 maxi = vmax;
  202.                 mini = vmin;
  203.                 lab = "VEL";
  204.             }
  205.             if (buffer == acc) {
  206.                 maxi = amax;
  207.                 mini = amin;
  208.                 lab = "ACC";
  209.             }
  210.             fputs(CL, stdout);
  211.             if (pro) {
  212.                 GO(lin ,col - 9);
  213.                 printf("%8.3f" ,maxi);
  214.                 GO(lin ,0);
  215.                 printf("%8.3f" ,mini);
  216.                 GO(lin ,44);
  217.                 printf("%s " ,base);
  218.                 printf(lab);
  219.                 i = ind + lin - 1;
  220.                 i = (i > np) ? i - np : i;
  221.                 GO(lin ,col - 20);
  222.                 printf("         ");
  223.                 GO(lin ,col - 20);
  224.                 printf(" %-5g", buffer[i]);
  225.             }
  226.             else {
  227.                 step = (maxi - mini) / 10.;
  228.                 GO(lin,  0);
  229.                 i = col - 1;
  230.                 while(i--) {
  231.                     putchar(' ');
  232.                 }
  233.                 for (d = mini, i = 0;
  234.                      i < col;
  235.                      i += col / 10, d += step) {
  236.                     GO(lin, i);
  237.                     printf(" %-6.3g", d);
  238.                 }
  239.             }
  240.         }
  241.         else {
  242.             i = ind + lin - 1;
  243.             i = (i > np) ? i - np : i;
  244.             GO(lin ,col - 20);
  245.             printf("          ");
  246.             GO(lin, col - 20);
  247.             printf(" %-5g", buffer[i]);
  248.         }
  249.         for(i = 0; i < lin; i++) {
  250.             while(ind >= np)
  251.                 ind -= np;
  252.             while(ind < 0)
  253.                 ind += np;
  254.             if (scroll) {
  255.                 GO(lx[i], ly[i]);
  256.                 putchar(' ');
  257.             }
  258.             GO(i, 0);
  259.             if (fptime == NULL)
  260.                 printf("%4d|" ,ind);
  261.             else
  262.                 printf("%6d|" ,timb[ind]);
  263.             lx[i] = i;
  264.             ly[i] = bias + (int)((buffer[ind] - mini) /
  265.                 (maxi - mini + PREC) * (double)(col - bias));
  266.             GO(lx[i] , ly[i]);
  267.             putchar((fpchar == NULL) ? '#' : chars[ind]);
  268.             ind++;
  269.         }
  270. promt :
  271.         if (scroll) {
  272.             if (pro) {
  273.                 GO(lin ,42);
  274.             }
  275.             else {
  276.                 GO(lin, 0);
  277.             }
  278.             scroll = NO;
  279.         }
  280.         else {
  281.             if (pro) {
  282.                 GO(lin ,10);
  283.                 printf("!*/s/r/u/d/g/h/b/f/a/v/p/q/+-n/?");
  284.             }
  285.             else {
  286.                 GO(lin, 0);
  287.             }
  288.         }
  289.  
  290.         c = getchar();
  291.         nbp = num;
  292.         if (isdigit(c) || c == '+' || c == '-') {
  293.             do {
  294.                 *nbp++ = c;
  295.                 c = getchar();
  296.             } while(isdigit(c));
  297.             *nbp = ' ';
  298.             if (sscanf(num,"%d",&dtime) != 1)
  299.                 goto promt;
  300.             ind = dtime / incr;
  301.         }
  302.         else {
  303.             switch(c) {
  304.             case 'f' :
  305.                 break;
  306.             case 'h' :
  307.                 ind -= lin / 2;
  308.                 break;
  309.             case 'g' :
  310.                 ind -= lin + lin / 2 + 1;
  311.                 break;
  312.             case 'b' :
  313.                 ind -= lin + lin;
  314.                 break;
  315.             case 'p':
  316.                 buffer = pos;
  317.                 ind -= lin;
  318.                 break ;
  319.             case 'a':
  320.                 buffer = acc;
  321.                 ind -= lin;
  322.                 break;
  323.             case 'v':
  324.                 buffer = vel;
  325.                 ind -= lin;
  326.                 break ;
  327.             case 'd' :
  328.                 scroll = YES;
  329.                 ind -= lin - 1;
  330.                 break;
  331.             case 'u' :
  332.                 scroll = YES;
  333.                 ind -= lin + 1;
  334.                 break;
  335.             case 'r' :
  336.                 ind -= lin;
  337.                 break;
  338.             case 'q':
  339.                 ouf();
  340.             case 's':
  341.                 ind -= lin;
  342.                 pro = NO;
  343.                 break;
  344.             case '@':
  345.                 ind -= lin;
  346.                 pro = YES;
  347.                 break;
  348.             case '!':
  349.                 strcpy(nname, root);
  350.                 nbp = nbase;
  351.                 while((*nbp = getchar()) == ' ')
  352.                     ;
  353.                 while ((*++nbp = getchar()) != ' ')
  354.                     ;
  355.                 *nbp = '\0';
  356.                 strcat(nname, nbase);
  357.                 strcat(nname ,".out");
  358.                 if ((nfp = fopen(nname ,"r")) == NULL) {
  359.                     GO(lin, 0);
  360.                     printf(
  361.             "can't open %s ,type any character to continue", nname);
  362.                     getchar();
  363.                     GO(lin, 0);
  364.                     printf(
  365.         "                                                          ");
  366.                        ind -= lin;
  367.                 }
  368.                 else {
  369.                     fp = nfp;
  370.                     strcpy(base, nbase);
  371.                     np = fread(pos ,sizeof(double) ,MAX ,fp);
  372.                     if (np < 0) {
  373.                         printf("read error\n");
  374.                         exit(1);
  375.                     }
  376.                     if (np == 0) {
  377.                         printf("empty point file\n");
  378.                         exit(2);
  379.                     }
  380.                     ind -= lin;
  381.                     goto rinit;
  382.                 }
  383.                 break;
  384.             case '?' :
  385.                 fputs(CL, stdout);
  386.                 printf("!*/s/r/u/d/g/h/b/f/a/v/p/q/+-n/?\n\n");
  387.                 printf("\t?\this message\n");
  388.     printf("\t+-n\t[+,-]digits<space> : direct addressing\n");
  389.                 printf("\tq\tquit\n");
  390.                 printf("\tp\tposition display\n");
  391.                 printf("\tv\tvelocity display\n");
  392.                 printf("\ta\tacceleration display\n");
  393.                 printf("\tf\tforward one page\n");
  394.                 printf("\tb\tbackward one page\n");
  395.                 printf("\th\thalf page forward\n");
  396.                 printf("\tg\thalf page backward\n");
  397.                 printf("\td\tdown one line\n");
  398.                 printf("\tu\tup one line\n");
  399.                 printf("\tr\tredraw\n");
  400.                 printf("\ts\tscale\n");
  401.                 printf("\t@\tback to prompt\n");
  402.     printf("\t!*\t!<space>file<space> : show another file\n");
  403.                 printf("\n\ngraphic directory is %s\n", pre);
  404.                 printf("\n\nType any character to continue");
  405.                 getchar();
  406.                 ind -= lin;
  407.                 break;
  408.             default :
  409.                 goto promt;
  410.             }
  411.         }
  412.     }
  413. }
  414.  
  415. abt()
  416. {
  417.     putchar('\n');
  418.     exit(0);
  419. }
  420.  
  421. ouf()
  422. {
  423.     putchar('\n');
  424.     mode.sg_flags &= ~CBREAK;
  425.     ioctl(1, TIOCSETP, &mode);
  426.     exit(0);
  427. }
  428.  
  429.