home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / vipf.zip / ipfdump.mod < prev    next >
Text File  |  1994-03-01  |  5KB  |  139 lines

  1. IMPLEMENTATION MODULE IPFDump;
  2.  
  3.   IMPORT Str, Out, IPF;
  4.  
  5.   PROCEDURE OutSlot (i: IPF.anIndex);
  6.     VAR
  7.       j, k:     IPF.anIndex;
  8.       w:        IPF.aWord;
  9.       word:     IPF.aString;
  10.       id:       IPF.aWord;
  11.       len:      IPF.anIndex;
  12.       base:     IPF.anIndex;
  13.       spc:      BOOLEAN;
  14.       mono:     BOOLEAN;
  15.       leftMargin,
  16.       rightMargin,
  17.       style,
  18.       align,
  19.       color:    SHORTCARD;
  20.       ref:      IPF.anIndex;
  21.       ch:       CHAR;
  22.     BEGIN
  23.       WITH IPF.Slot^[i]^ DO
  24.         spc:= TRUE; mono:= FALSE;
  25.         leftMargin:= 0; rightMargin:= 1;
  26.         style:= 0; align:= 0;
  27.         FOR j:= 0 TO textCnt-1 DO
  28.           w:= text^[j];
  29.           IF w >= localCnt THEN
  30.             CASE w OF
  31.  
  32.             | 0FAH: (* paragraph *)
  33.               Out.S( "{par}" );
  34.               Out.Ln; Out.Ln; spc:= TRUE;
  35.  
  36.             | 0FCH: (* space control *)
  37.               IF spc THEN Out.S( "{spc-}" ) ELSE Out.S( "{spc+}" ) END;
  38.               spc:= NOT spc;
  39.  
  40.             | 0FDH: (* line break *)
  41.               Out.S( "{line}" );
  42.               Out.Ln; spc:= TRUE;
  43.  
  44.             | 0FEH: (* space *)
  45.               Out.S( "{spc}" );
  46.               Out.S( " " );
  47.  
  48.             | 0FFH: (* escape *)
  49.               len:= VAL(IPF.anIndex, text^[j+1] ); id:= text^[j+2]; base:= j+3;
  50.               INC( j, len ); DEC(len,2);
  51.               Out.S( "{esc" );
  52.               FOR k:= base-1 TO base+len-1 DO
  53.                 Out.S( ":" ); Out.CL( VAL(CARDINAL,text^[k]),0 );
  54.               END;
  55.               Out.S( ">" ); Out.CL( VAL(CARDINAL,text^[base+len]),0 );
  56.               Out.S( "}" );
  57.               CASE id OF
  58.  
  59.               | 2, 17, 18:  (* set left margin *)
  60.                 Out.S( "{left" ); Out.CL(VAL(CARDINAL,text^[base]),0); Out.S( "}" );
  61.                 IF (id = 17) OR (leftMargin >= text^[base]) THEN
  62.                   Out.Ln;
  63.                 END;
  64.                 leftMargin:= text^[base];
  65.                 FOR k:= 1 TO VAL(CARDINAL,leftMargin) DO Out.S( " " ) END;
  66.                 spc:= TRUE;
  67.  
  68.               | 3: (* set right margin *)
  69.                 Out.S( "{right" ); Out.CL(VAL(CARDINAL,text^[base]),0); Out.S( "}" );
  70.                 rightMargin:= text^[base];
  71.  
  72.               | 4: (* change style *)
  73.                 Out.S( "{style" ); Out.CL(VAL(CARDINAL,text^[base]),0); Out.S( "}" );
  74.                 style:= text^[base];
  75.  
  76.               | 5, 7: (* reference *)
  77.                 ref:= VAL(IPF.anIndex,text^[base]) + 256 * VAL(IPF.anIndex,text^[base+1]);
  78.                 Out.S( "{ref+" ); Out.CL(ref,0);
  79.                 Out.S( ";" ); Out.CL( VAL(CARDINAL,id),0 );
  80.                 FOR k:= base+2 TO base+len-1 DO
  81.                   Out.S( ":" ); Out.CL( VAL(CARDINAL,text^[k]),0 );
  82.                 END;
  83.                 Out.S( "}" );
  84.                 Out.S( "[" );
  85.  
  86.               | 8: (* end of reference *)
  87.                 Out.S( "{ref-}" );
  88.                 Out.S( "]" );
  89.  
  90.               | 11: (* begin monospace example *)
  91.                 Out.S( "{mono+}" );
  92.                 Out.Ln; mono:= TRUE;
  93.  
  94.               | 12: (* end monospace example *)
  95.                 Out.S( "{mono-}" );
  96.                 Out.Ln; mono:= FALSE;
  97.  
  98.               | 15: (* inline reference *)
  99.                 IF len = 3 THEN k:= 1 ELSE k:= 0 END;
  100.                 ref:= VAL(IPF.anIndex,text^[base+k]) + 256 * VAL(IPF.anIndex,text^[base+k+1]);
  101.                 Out.S( "{ref+" ); Out.CL(ref,0);
  102.                 Out.S( ";" ); Out.CL( VAL(CARDINAL,id),0 );
  103.                 Out.S( "}" );
  104.                 Out.S( "[" );
  105.                 Out.S( IPF.Toc^[ref]^.title^ );
  106.                 Out.S( "]" );
  107.  
  108.               | 26: (* begin lines *)
  109.                 Out.S( "{lines+}" );
  110.                 Out.Ln;
  111.                 align:= text^[base];
  112.  
  113.               | 27: (* end lines *)
  114.                 Out.S( "{lines-}" );
  115.                 Out.Ln;
  116.  
  117.               ELSE
  118.                 Out.S( "{esc" ); Out.CL( VAL(CARDINAL,id),0 );
  119.                 Out.S( ";" ); Out.CL( VAL(CARDINAL,len),0 );
  120.                 Out.S( "}" );
  121.               END;
  122.  
  123.             ELSE (*plain control*)
  124.               Out.S( "{" ); Out.CL( VAL(CARDINAL,w),0 ); Out.S( "}" );
  125.             END;
  126.  
  127.           ELSE (*plain word*)
  128.             Str.Assign( word, IPF.Dict^[local^[w]]^ );
  129.             Out.S( word );
  130.             IF spc AND NOT mono THEN Out.S( " " ) END;
  131.  
  132.           END (*if control or word*);
  133.         END (*for words*);
  134.       END (*with slot*);
  135.     END OutSlot;
  136.  
  137.  
  138. END IPFDump.
  139.