home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / ratfor / r0.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  1.4 KB  |  84 lines

  1. #include "r.h"
  2.  
  3. int    swlevel    = -1;
  4. int    swexit[5];
  5. int    nextcase[5];
  6.  
  7. swcode() {
  8.     transfer = 0;
  9.     putcom("switch");
  10.     swlevel++;
  11.     if (swlevel >= 5)
  12.         error("Switches nested > 5");
  13.     swexit[swlevel] = yyval = genlab(1);
  14.     outcode("\tI");
  15.     outnum(yyval);
  16.     outcode(" = ");
  17.     balpar();
  18.     outdon();
  19.     nextcase[swlevel] = 0;
  20.     indent++;
  21. }
  22.  
  23. getcase() {
  24.     int t, lpar;
  25.     char token[100];
  26.  
  27.     if (nextcase[swlevel] != 0) {
  28.         outgoto(swexit[swlevel]);
  29.         outcont(nextcase[swlevel]);
  30.     }
  31.     indent--;
  32.     outcode("\tif(.not.(");
  33.     do {
  34.         outcode("I");
  35.         outnum(swexit[swlevel]);
  36.         outcode(".eq.(");
  37.         lpar = 0;
  38.         do {
  39.             if ((t=gtok(token)) == ':')
  40.                 break;
  41.             if (t == '(')
  42.                 lpar++;
  43.             else if (t == ')')
  44.                 lpar--;
  45.             else if (t == ',') {
  46.                 if (lpar == 0)
  47.                     break;
  48.                 }
  49.             outcode(token);
  50.         } while (lpar >= 0);
  51.         if (lpar < 0)
  52.             error("Missing left parenthesis in case");
  53.         if (t == ',')
  54.             outcode(").or.");
  55.     } while (t != ':');
  56.     if (lpar != 0)
  57.         error("Missing parenthesis in case");
  58.     outcode(")))");
  59.     nextcase[swlevel] = genlab(1);
  60.     outgoto(nextcase[swlevel]);
  61.     indent++;
  62. }
  63.  
  64. getdefault() {
  65.     char token[20];
  66.     if (gnbtok(token) != ':')
  67.         error("Missing colon after default");
  68.     outgoto(swexit[swlevel]);
  69.     outcont(nextcase[swlevel]);
  70.     indent--;
  71.     putcom("default");
  72.     indent++;
  73. }
  74.  
  75. endsw(n, def) {
  76.     if (def == 0)
  77.         outcont(nextcase[swlevel]);
  78.     swlevel--;
  79.     if (swlevel < -1)
  80.         error("Switches unwound too far");
  81.     indent--;
  82.     outcont(n);
  83. }
  84.