home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 2 / RISC_DISC_2.iso / pd_share / program / language / oberon / potsrc / src / mod / cocp < prev    next >
Encoding:
Text File  |  1995-01-22  |  4.8 KB  |  167 lines

  1. MODULE COCP; (* DT 23 10 1993 00:23 *)
  2.   IMPORT Strings, COCT, COCQ, COCN;
  3.  
  4.   CONST
  5.    (*object and item modes*)
  6.     Var = 1; Ind = 3; Con = 8; Fld = 12; Typ = 13;
  7.  
  8.    (*structure forms*)    
  9.     Undef = 0; Byte = 1; Bool = 2; Char = 3; SInt = 4; Int = 5; LInt = 6;    
  10.     Real = 7; LReal = 8; Set = 9; String = 10; NilTyp = 11; NoTyp = 12;    
  11.     Pointer = 13; ProcTyp = 14; Array = 15; DynArr = 16; Record = 17;    
  12.  
  13.   PROCEDURE AssignPfx*(VAR x: COCT.Item; typchk: BOOLEAN);
  14.     VAR np: INTEGER;
  15.   BEGIN
  16.     CASE x.typ.form OF
  17.       Undef:
  18.     | Byte .. SInt: COCQ.Append("=")
  19.     | Int .. LReal, Pointer:
  20.       COCQ.Append("=(");
  21.       COCN.CTDenoter(x.typ, COCQ.cslen, np);
  22.       COCQ.Append(")(")
  23.     | Set, ProcTyp: COCQ.Append("=")
  24.     | String .. NoTyp:
  25.     | Array: 
  26.       COCQ.Prepend("pOt__arr_assign((pOt__ArrTypDsc**)&", x.qoffs, np);
  27.       COCQ.Append(",(pOt__ArrTypDsc**)&");
  28.     | DynArr:
  29.     | Record:
  30.       IF typchk & ((x.obj = COCT.wasderef) OR (x.obj # NIL) & (x.obj.mode = Ind)) THEN
  31.         COCQ.Prepend("pOt__varrec_assign(__FILE__,__LINE__,(pOt__RecTypDsc**)&", x.qoffs, np);
  32.         COCQ.Append(",(pOt__RecTypDsc**)&")
  33.       ELSE
  34.         COCQ.Prepend("pOt__rec_assign((pOt__RecTypDsc**)&", x.qoffs, np);
  35.         COCQ.Append(",(pOt__RecTypDsc**)&")
  36.       END
  37.     END
  38.   END AssignPfx;  
  39.  
  40.   PROCEDURE AssignSfx*(VAR x, y: COCT.Item);
  41.   BEGIN
  42.     CASE x.typ.form OF
  43.       Undef:
  44.     | Byte .. SInt:
  45.     | Int .. LReal, Pointer: COCQ.Append(")")
  46.     | Set, ProcTyp:
  47.     | String .. NoTyp:
  48.     | Array: COCQ.Append(")")
  49.     | DynArr:
  50.     | Record: COCQ.Append(")")
  51.     END
  52.   END AssignSfx;
  53.  
  54.   PROCEDURE ParamPfx*(f: COCT.Object);
  55.     VAR np: INTEGER;
  56.   BEGIN
  57.     IF f.mode = Ind THEN
  58.       CASE f.typ.form OF Undef:
  59.       | Byte: COCQ.Append("(pOt_BYTE_SYSTEM*)&")
  60.       | Bool .. Array: COCQ.Append("&");
  61.       | DynArr: 
  62.         IF f.typ.BaseTyp.form = Byte THEN COCQ.Append("pOt__make_byte_arr((void*)&")
  63.         ELSE COCQ.Append("(pOt__ArrTypDsc**)&")
  64.         END;
  65.       | Record: 
  66.         COCQ.Append("("); 
  67.         COCN.CTDenoter(f.typ, COCQ.cslen, np); 
  68.         COCQ.Append("*)&")
  69.       END
  70.     ELSE
  71.       CASE f.typ.form OF 
  72.         Undef .. SInt:
  73.       | Int .. LReal, Pointer:  
  74.         COCQ.Append("("); 
  75.         COCN.CTDenoter(f.typ, COCQ.cslen, np);
  76.         COCQ.Append(")(")
  77.       | Set, ProcTyp:
  78.       | String .. NoTyp:
  79.       | Array: 
  80.         COCQ.Append("("); 
  81.         COCN.CTDenoter(f.typ, COCQ.cslen, np);
  82.         COCQ.Append("*)");
  83.         COCQ.Append("pOt__dup_arr(__FILE__,__LINE__,(pOt__ArrTypDsc**)&")
  84.       | DynArr: 
  85.         IF f.typ.BaseTyp.form = Byte THEN COCQ.Append("pOt__dup_byte_arr(__FILE__,__LINE__,(void*)&")
  86.         ELSE COCQ.Append("pOt__dup_arr(__FILE__,__LINE__,(pOt__ArrTypDsc**)&")
  87.         END
  88.       | Record: 
  89.         COCQ.Append("("); 
  90.         COCN.CTDenoter(f.typ, COCQ.cslen, np);
  91.         COCQ.Append("*)");
  92.         COCQ.Append("pOt__dup_rec(__FILE__,__LINE__,(pOt__RecTypDsc**)&")
  93.       END
  94.     END
  95.   END ParamPfx;
  96.  
  97.   PROCEDURE ParamSfx*(VAR ap: COCT.Item; f: COCT.Object);
  98.     VAR np: INTEGER;
  99.   BEGIN
  100.     IF f.mode = Ind THEN
  101.       CASE f.typ.form OF Undef, Byte:  
  102.       | Bool .. Array: 
  103.       | DynArr: 
  104.         IF f.typ.BaseTyp.form = Byte THEN 
  105.           COCQ.Append(",");
  106.           CASE ap.typ.form OF Byte .. Set: 
  107.             COCQ.Append("0,"); 
  108.             COCN.CTSize(ap.typ, COCQ.cslen, np);
  109.             COCQ.Append(")")
  110.           | Array, DynArr: 
  111.             IF (ap.typ.form = DynArr) & 
  112.                  (ap.intval = 0) & (ap.typ.BaseTyp.form = Byte) THEN 
  113.               COCQ.Append("0,0)")
  114.             ELSIF ap.typ.BaseTyp.form IN {Byte .. SInt} THEN 
  115.               COCQ.Append("1,0)")
  116.             ELSE 
  117.               COCQ.Append("2,0)")
  118.             END
  119.           | Record: COCQ.Append("3,0)")
  120.           END
  121.         END
  122.       | Record:
  123.       END
  124.     ELSE
  125.       CASE f.typ.form OF 
  126.         Undef .. SInt:
  127.       | Int .. LReal, Pointer: COCQ.Append(")")
  128.       | Set, ProcTyp:
  129.       | String .. NoTyp:
  130.       | Array: COCQ.Append(")")
  131.       | DynArr: 
  132.         IF f.typ.BaseTyp.form = Byte THEN 
  133.           IF (ap.typ.form = DynArr) & (ap.intval = 0) THEN 
  134.             COCQ.Append(",0)") 
  135.           ELSE 
  136.             COCQ.Append(",1)")
  137.           END
  138.         ELSE COCQ.Append(")")
  139.         END
  140.       | Record: 
  141.         COCQ.Append(",(pOt__RecTypDsc*)&"); COCN.CTDName(f.typ, COCQ.cslen, np); 
  142.         COCQ.Append(")")
  143.       END
  144.     END
  145.   END ParamSfx;
  146.  
  147.   PROCEDURE ParamListPfx*;
  148.   BEGIN COCQ.Append("(")
  149.   END ParamListPfx;
  150.  
  151.   PROCEDURE NextParam*;
  152.   BEGIN COCQ.Append(",")
  153.   END NextParam;
  154.  
  155.   PROCEDURE ParamListSfx*;
  156.   BEGIN COCQ.Append(")")
  157.   END ParamListSfx;
  158.  
  159.   PROCEDURE Trap*(VAR x: COCT.Item);
  160.     VAR s: ARRAY 9 OF CHAR;
  161.   BEGIN Strings.FromLInt(x.intval, 16, s);
  162.     COCQ.Append("pOt__halt(__FILE__,__LINE__,0x");
  163.     COCQ.Append(s); COCQ.Append(")")
  164.   END Trap;
  165.  
  166. END COCP.
  167.