home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d5xx / d537 / cross.lha / Cross / Source / CPCDosIO.mod < prev    next >
Text File  |  1991-08-26  |  32KB  |  1,175 lines

  1. IMPLEMENTATION MODULE CPCDosIO;
  2.  
  3.  
  4.  
  5. IMPORT Arts;
  6. IMPORT ASCII;
  7. IMPORT Conversions;
  8. IMPORT FileReq;
  9. IMPORT CPCGlobal;
  10. IMPORT CPCRequesters;
  11. IMPORT CPCSleep;
  12. IMPORT DosD,DosL;
  13. IMPORT ExecD,ExecL;
  14. IMPORT ExecSupport;
  15. IMPORT FileMessage;
  16. IMPORT FileSystem;
  17. IMPORT GraphicsD,GraphicsL;
  18. IMPORT InOut;
  19. IMPORT IntuiIO;
  20. IMPORT Printer;
  21. IMPORT RandomNumber;
  22. IMPORT RealConversions;
  23. IMPORT Requester;
  24. IMPORT RequesterSet;
  25. IMPORT String;
  26. IMPORT SYSTEM;
  27.  
  28.  
  29.  
  30. CONST
  31.  errReadingMsg="ERROR READING MSGTXT.DATA:";
  32.  ioErrReadingMsg="I/O-ERROR READING MSGTXT.DATA:";
  33.  defworddir="Cross:data/";
  34.  defwordfile="words01.crw";
  35.  defdatadir="Cross:data/";
  36.  defdatafile="puzzle01.crd";
  37.  deftexdir="Cross:data/";
  38.  deftexfile="puzzle01.tex";
  39.  defmsg="Cross:data/msgtxt.data";
  40.  
  41.  
  42.  
  43. TYPE
  44.  IOMode=(readW,readC,writeC,printC,printS);
  45.  CharPtr=POINTER TO CHAR;
  46.  
  47.  
  48.  
  49. VAR
  50.  printer,parallel: DosD.FileHandlePtr;
  51.  myfile: FileSystem.File;
  52.  filepresent: BOOLEAN;
  53.  initialized: BOOLEAN;
  54.  dataReq,wordReq,texReq: FileReq.FileRequestData;
  55.  scr: IntuiIO.SCREEN;
  56.  
  57.  
  58. PROCEDURE InitCPCDosIO;
  59.  BEGIN
  60.   IF NOT initialized THEN
  61.    FileReq.MakeFRD("",defwordfile,defworddir,
  62.                    SYSTEM.CAST(SYSTEM.ADDRESS,CPCGlobal.window),10,10,wordReq);
  63.    FileReq.MakeFRD("",defdatafile,defdatadir,
  64.                    SYSTEM.CAST(SYSTEM.ADDRESS,CPCGlobal.window),10,10,dataReq);
  65.    FileReq.MakeFRD("",deftexfile,deftexdir,
  66.                    SYSTEM.CAST(SYSTEM.ADDRESS,CPCGlobal.window),10,10,texReq);
  67.    CPCGlobal.words[0]:=NIL;
  68.    CPCGlobal.words[1]:=NIL;
  69.   END;
  70.   initialized:=TRUE;
  71.  END InitCPCDosIO;
  72.  
  73.  
  74.  
  75. PROCEDURE Value(a: ARRAY OF CHAR): INTEGER;
  76.  VAR err,sgn: BOOLEAN;
  77.      val: LONGINT;
  78.      l: INTEGER;
  79.  BEGIN
  80.   FOR l:=0 TO String.Length(a) DO
  81.    IF (a[l]=" ") THEN
  82.     a[l]:="0";
  83.    END;
  84.   END;
  85.   sgn:=FALSE;
  86.   Conversions.StrToVal(a,val,sgn,10,err);
  87.   IF err THEN
  88.    RETURN -1;
  89.   ELSE
  90.    RETURN INTEGER(val);
  91.   END;
  92.  END Value;
  93.  
  94.  
  95.  
  96. PROCEDURE MakeComStr(VAR s: ARRAY OF CHAR; c0,c1,c2,c3,c4,c5,c6,c7: CHAR);
  97.  BEGIN
  98.   s[0]:=c0;
  99.   s[1]:=c1;
  100.   s[2]:=c2;
  101.   s[3]:=c3;
  102.   s[4]:=c4;
  103.   s[5]:=c5;
  104.   s[6]:=c6;
  105.   s[7]:=c7;
  106.   s[8]:="\o";
  107.  END MakeComStr;
  108.  
  109.  
  110.  
  111. PROCEDURE Put(fileh: DosD.FileHandlePtr; s: FileMessage.StrPtr;
  112.               l: LONGINT): BOOLEAN; (* TRUE if error *)
  113.  BEGIN
  114.   IF l=0 THEN
  115.    l:=String.Length(s^);
  116.   END;
  117.   RETURN DosL.Write(fileh,s,l)#l;
  118.  END Put;
  119.  
  120.  
  121.  
  122. PROCEDURE readline(VAR f: FileSystem.File; VAR a,number: CPCGlobal.LString; m: MsgMode);
  123.  VAR c: CHAR;
  124.      n: INTEGER;
  125.      sp: FileMessage.StrPtr;
  126.  BEGIN
  127.   n:=0;
  128.   FileSystem.ReadChar(f,c);
  129.   IF (c>="0") AND (c<="9") THEN
  130.    a[n]:=c;
  131.    INC(n);
  132.    REPEAT
  133.     CPCGlobal.myAssert(n<=CPCGlobal.lStringLen,SYSTEM.ADR(errReadingMsg),SYSTEM.ADR("STRING TOO LONG"));
  134.     FileSystem.ReadChar(f,c);
  135.     FileMessage.ResponseText(f.res,sp);
  136.     CPCGlobal.myAssert(f.res=FileSystem.done,SYSTEM.ADR(ioErrReadingMsg),sp);
  137.     a[n]:=c;
  138.     INC(n);
  139.    UNTIL (c=" ");
  140.    a[n-1]:="\o";
  141.    number:=a;
  142.    IF (m=nonumbers) THEN
  143.     n:=0;
  144.     a[0]:="\o";
  145.    ELSE
  146.     DEC(n);
  147.    END;
  148.   ELSE
  149.    number:="illegal";
  150.    a[0]:=c;
  151.    n:=1;
  152.   END;
  153.   REPEAT
  154.    CPCGlobal.myAssert(n<=CPCGlobal.lStringLen,SYSTEM.ADR(errReadingMsg),SYSTEM.ADR("STRING TOO LONG"));
  155.    FileSystem.ReadChar(f,c);
  156.    FileMessage.ResponseText(f.res,sp);
  157.    CPCGlobal.myAssert(f.res=FileSystem.done,SYSTEM.ADR(ioErrReadingMsg),sp);
  158.    IF (c="@") THEN
  159.     c:=" ";
  160.    END;
  161.    a[n]:=c;
  162.    INC(n);
  163.   UNTIL (c=ASCII.lf);
  164.   a[n-1]:="\o";
  165.  END readline;
  166.  
  167.  
  168.  
  169. PROCEDURE ReadMsg(m: MsgMode);
  170.  VAR c: CHAR;
  171.      lcount,i,k,l,n,langno: INTEGER;
  172.      a,num: CPCGlobal.LString;
  173.      b: ARRAY[1..9] OF CPCGlobal.LString;
  174.      sp: FileMessage.StrPtr;
  175.  BEGIN
  176.   FileSystem.Lookup(myfile,defmsg,5000,FALSE);
  177.   filepresent:=TRUE;
  178.   CPCGlobal.myAssert(myfile.res=FileSystem.done,SYSTEM.ADR(ioErrReadingMsg),SYSTEM.ADR("CAN'T OPEN MSGTXT.DATA"));
  179.   FileSystem.ReadChar(myfile,c);
  180.   CPCGlobal.myAssert((c>"0")&(c<":"),SYSTEM.ADR(errReadingMsg),SYSTEM.ADR("ILLEGAL LANGUAGE COUNT"));
  181.   lcount:=(ORD(c)-ORD("0"));
  182.   FileSystem.ReadChar(myfile,c);
  183.   FileMessage.ResponseText(myfile.res,sp);
  184.   CPCGlobal.myAssert(myfile.res=FileSystem.done,SYSTEM.ADR(ioErrReadingMsg),sp);
  185.   CPCGlobal.myAssert(c=ASCII.lf,SYSTEM.ADR(errReadingMsg),SYSTEM.ADR("LC IS LONGER THAN ONE CHAR"));
  186.   InOut.WriteLn; InOut.WriteLn;
  187.   InOut.WriteString("Crossword Puzzle Creator: Language selection.");
  188.   InOut.WriteLn; InOut.WriteLn;
  189.   FOR l:=1 TO lcount DO
  190.    n:=0;
  191.    REPEAT
  192.     CPCGlobal.myAssert(n<=CPCGlobal.lStringLen,SYSTEM.ADR("ERROR IN MSG.TXT:"),SYSTEM.ADR("STRING TOO LONG"));
  193.     FileSystem.ReadChar(myfile,c);
  194.     FileMessage.ResponseText(myfile.res,sp);
  195.     CPCGlobal.myAssert(myfile.res=FileSystem.done,SYSTEM.ADR(ioErrReadingMsg),sp);
  196.     a[n]:=c;
  197.     INC(n);
  198.    UNTIL (c=ASCII.lf);
  199.    a[n-1]:="\o";
  200.    String.Copy(b[l],a);
  201.    InOut.WriteInt(l,1); InOut.WriteString(": ");
  202.    InOut.WriteString(b[l]);
  203.    InOut.WriteLn;
  204.   END;
  205.   InOut.WriteLn;
  206.   REPEAT
  207.    InOut.WriteString("Please select (press return when finished): ");
  208.    InOut.Read(c);
  209.    langno:=ORD(c)-ORD("0");
  210.   UNTIL ((langno>=1) AND (langno<=lcount));
  211.   InOut.WriteLn; InOut.WriteLn;
  212.   InOut.WriteString("Reading program messages... please wait!");
  213.   InOut.WriteLn;
  214.   InOut.WriteString("LANGUAGE="); InOut.WriteString(b[langno]);
  215.   InOut.WriteLn;
  216.   k:=1;
  217.   REPEAT
  218.    FOR l:=1 TO lcount DO
  219.     readline(myfile,a,num,m);
  220.     IF (l=langno) THEN
  221.      String.Copy(CPCGlobal.msg[k],a);
  222.      IF ((k#Value(num)) AND (Value(num)#999)) THEN
  223.       IF (Value(num)>=0) THEN
  224.        InOut.WriteString("illegal message number encountered in msgtxt.data...\n");
  225.        InOut.WriteString("message number should be..... "); InOut.WriteInt(k,0);
  226.        InOut.WriteString("\nmessage number is actually... "); InOut.WriteInt(Value(num),0);
  227.        InOut.WriteString("\nstring read: '"); InOut.WriteString(a); InOut.WriteString("'\n");
  228.        CPCGlobal.myAssert(FALSE,SYSTEM.ADR(errReadingMsg),
  229.                       SYSTEM.ADR("ILLEGAL MESSAGE NUMBER"));
  230.       ELSE
  231.        InOut.WriteString("message number missing in msgtxt.data...\n");
  232.        InOut.WriteString("message number should be "); InOut.WriteInt(k,0);
  233.        InOut.WriteString("\nstring read: '"); InOut.WriteString(a); InOut.WriteString("'\n");
  234.        CPCGlobal.myAssert(FALSE,SYSTEM.ADR(errReadingMsg),
  235.                       SYSTEM.ADR("MESSAGE NUMBER MISSING"));
  236.       END;
  237.      END;
  238.     END;
  239.    END;
  240.    INC(k);
  241.    CPCGlobal.myAssert((k<=CPCGlobal.maxmsg) OR (Value(num)=999),
  242.                       SYSTEM.ADR(errReadingMsg),
  243.                       SYSTEM.ADR("TOO MANY MESSAGES"));
  244.   UNTIL (Value(num)=999);
  245.   InOut.WriteLn; InOut.WriteLn;
  246.   IF filepresent THEN
  247.    filepresent:=FALSE;
  248.    FileSystem.Close(myfile);
  249.   END;
  250.  END ReadMsg;
  251.  
  252.  
  253.  
  254. PROCEDURE HandleIOErr(action: IOMode; body: ARRAY OF CHAR): BOOLEAN;
  255.  VAR
  256.   header: CPCGlobal.LString;
  257.   t: ARRAY[0..1] OF Requester.Text;
  258.   res: BOOLEAN;
  259.  BEGIN
  260.   CASE action OF
  261.    |readW:  String.Copy(t[0],CPCGlobal.msg[5]);
  262.    |readC:  String.Copy(t[0],CPCGlobal.msg[6]);
  263.    |writeC: String.Copy(t[0],CPCGlobal.msg[7]);
  264.    |printC: String.Copy(t[0],CPCGlobal.msg[8]);
  265.    |printS: String.Copy(t[0],CPCGlobal.msg[9]);
  266.    |ELSE    CPCGlobal.myAssert(FALSE,SYSTEM.ADR(CPCGlobal.msg[10]),SYSTEM.ADR(CPCGlobal.msg[11]));
  267.   END;
  268.   String.Copy(t[1],body);
  269.   Requester.SetReqBorderPen(1);
  270.   Requester.SetReqTextPen(0);
  271.   CPCSleep.NormalPointer;
  272.   res:=RequesterSet.BooleanRequest(CPCGlobal.window,50,50,540,50,t,
  273.                      SYSTEM.ADR(CPCGlobal.msg[12]),
  274.                      SYSTEM.ADR(CPCGlobal.msg[13]),"\o","\o",
  275.                      Requester.ReqFlagSet{Requester.reqBorder,Requester.reqShadow});
  276.   CPCSleep.SleepPointer;
  277.   RETURN res;
  278.  END HandleIOErr;
  279.  
  280.  
  281.  
  282. PROCEDURE GetWordFileName(VAR name: FileReq.FileString; force: BOOLEAN): BOOLEAN;
  283.  VAR
  284.   quit: BOOLEAN;
  285.  BEGIN
  286.   String.Copy(wordReq.h,CPCGlobal.msg[69]);
  287.   REPEAT
  288.    CPCSleep.NormalPointer;
  289.    FileReq.FileReq(wordReq,name);
  290.    CPCSleep.SleepPointer;
  291.    quit:=FALSE;
  292.    IF (force) AND (String.Length(name)=0) THEN
  293.     CPCSleep.NormalPointer;
  294.     quit:=CPCRequesters.YesOrNo(CPCGlobal.msg[79]);
  295.     CPCSleep.SleepPointer;
  296.    END;
  297.   UNTIL (NOT force) OR (String.Length(name)>0) OR quit;
  298.   RETURN quit;
  299.  END GetWordFileName;
  300.  
  301.  
  302.  
  303. PROCEDURE DoWord(VAR inx: CharPtr; VAR num: INTEGER): BOOLEAN;
  304.  BEGIN
  305.   INC(num);
  306.   CPCGlobal.words[num]:=SYSTEM.CAST(CPCGlobal.StringPtr,inx);
  307.   WHILE (inx^#"\n") AND (inx^#"\o") DO
  308.    inx^:=String.ANSICap(inx^);
  309.    INC(inx);
  310.   END;
  311.   IF inx^="\o" THEN
  312.    INC(inx);
  313.    RETURN TRUE
  314.   ELSE
  315.    inx^:="\o";
  316.    INC(inx);
  317.    RETURN FALSE;
  318.   END;
  319.  END DoWord;
  320.  
  321.  
  322.  
  323. PROCEDURE ReadWords(forcewords: BOOLEAN): INTEGER;
  324.  VAR again: BOOLEAN;
  325.      num: INTEGER;
  326.      filesize,dummy: LONGINT;
  327.      body: CPCGlobal.LString;
  328.      inx: CharPtr;
  329.      name: FileReq.FileString;
  330.      wordfh: DosD.FileHandlePtr;
  331.  BEGIN
  332.   body:="";
  333.   LOOP
  334.    num:=0;
  335.    IF GetWordFileName(name,forcewords) THEN Arts.Terminate END;
  336.    IF String.Length(name)=0 THEN EXIT END;
  337.  
  338.    LOOP
  339.     wordfh:=DosL.Open(SYSTEM.ADR(name),DosD.readOnly);
  340.     IF wordfh=NIL THEN
  341.      String.Copy(body,CPCGlobal.msg[16]);
  342.      EXIT;
  343.     END;
  344.     dummy:=DosL.Seek(wordfh,0,DosD.end);
  345.     filesize:=DosL.Seek(wordfh,0,DosD.beginning);
  346.     IF (CPCGlobal.words[0]#NIL) AND (CPCGlobal.words[1]#NIL) THEN
  347.      ExecL.FreeMem(CPCGlobal.words[1],SYSTEM.CAST(LONGINT,CPCGlobal.words[0]));
  348.     END;
  349.     CPCGlobal.words[0]:=SYSTEM.CAST(SYSTEM.ADDRESS,filesize+1);
  350.     CPCGlobal.words[1]:=ExecL.AllocMem(filesize+1,ExecD.MemReqSet{ExecD.public});
  351.     dummy:=DosL.Read(wordfh,CPCGlobal.words[1],filesize);
  352.     DosL.Close(wordfh);
  353.     wordfh:=NIL;
  354.     IF dummy#filesize THEN
  355.      String.Copy(body,CPCGlobal.msg[22]);
  356.      EXIT;
  357.     END;
  358.  
  359.     inx:=SYSTEM.CAST(CharPtr,SYSTEM.CAST(LONGINT,CPCGlobal.words[1])+filesize);
  360.     (* now inx points to the last byte of the word buffer, one beyond the *)
  361.     (* last byte of our file... *)
  362.     inx^:="\o";
  363.     (* make sure the buffer ends with a "\o"; saves us a range check in DoWord *)
  364.  
  365.     inx:=SYSTEM.CAST(CharPtr,CPCGlobal.words[1]);
  366.     num:=0;
  367.     REPEAT UNTIL (DoWord(inx,num)) OR (num=CPCGlobal.maxwords);
  368.     IF num=CPCGlobal.maxwords THEN
  369.      String.Copy(body,CPCGlobal.msg[21]);
  370.      EXIT;
  371.     END;
  372.     EXIT;
  373.    END;
  374.  
  375.    IF String.Length(body)#0 THEN
  376.     again:=forcewords OR HandleIOErr(readW,body);
  377.    ELSE
  378.     again:=FALSE;
  379.    END;
  380.    IF (NOT again) THEN
  381.     EXIT;
  382.    END;
  383.   END;
  384.   IF String.Compare(CPCGlobal.words[num]^,"***END***")=0 THEN
  385.    DEC(num);
  386.   END;
  387.   RETURN num;
  388.  END ReadWords;
  389.  
  390.  
  391.  
  392. PROCEDURE SaveData();
  393.  VAR a: FileReq.FileString;
  394.      s: CPCGlobal.String;
  395.      act: LONGINT;
  396.      x,y,l: INTEGER;
  397.      err,again: BOOLEAN;
  398.      body: CPCGlobal.LString;
  399.  BEGIN
  400.   LOOP
  401.    String.Copy(dataReq.h,CPCGlobal.msg[70]);
  402.    CPCSleep.NormalPointer;
  403.    FileReq.FileReq(dataReq,a);
  404.    CPCSleep.SleepPointer;
  405.    IF String.Length(a)=0 THEN EXIT END;
  406.    LOOP
  407.     String.Copy(body,CPCGlobal.msg[16]);
  408.     FileSystem.Lookup(myfile,a,5000,TRUE);
  409.     filepresent:=TRUE;
  410.     IF (myfile.res#FileSystem.done) THEN EXIT END;
  411.     String.Copy(body,CPCGlobal.msg[25]);
  412.     FileSystem.WriteBytes(myfile,SYSTEM.ADR("cpcdata!"),8,act);
  413.     IF (myfile.res#FileSystem.done) THEN EXIT END;
  414.     Conversions.ValToStr(CPCGlobal.hori,FALSE,s,10,4," ",err);
  415.     FileSystem.WriteBytes(myfile,SYSTEM.ADR(s),4,act);
  416.     IF (myfile.res#FileSystem.done) THEN EXIT END;
  417.     Conversions.ValToStr(CPCGlobal.vert,FALSE,s,10,4," ",err);
  418.     FileSystem.WriteBytes(myfile,SYSTEM.ADR(s),4,act);
  419.     IF (myfile.res#FileSystem.done) THEN EXIT END;
  420.     Conversions.ValToStr(CPCGlobal.xmax,FALSE,s,10,4," ",err);
  421.     FileSystem.WriteBytes(myfile,SYSTEM.ADR(s),4,act);
  422.     IF (myfile.res#FileSystem.done) THEN EXIT END;
  423.     Conversions.ValToStr(CPCGlobal.ymax,FALSE,s,10,4," ",err);
  424.     FileSystem.WriteBytes(myfile,SYSTEM.ADR(s),4,act);
  425.     IF (myfile.res#FileSystem.done) THEN EXIT END;
  426.     FOR y:=1 TO CPCGlobal.ymax DO
  427.      FOR x:=1 TO CPCGlobal.xmax DO
  428.       FileSystem.WriteChar(myfile,CPCGlobal.text[x,y]);
  429.       IF (myfile.res#FileSystem.done) THEN EXIT END;
  430.      END;
  431.     END;
  432.     FOR l:=0 TO CPCGlobal.hori+CPCGlobal.vert-1 DO
  433.      FileSystem.WriteBytes(myfile,SYSTEM.ADR(CPCGlobal.kwr[l]),String.Length(CPCGlobal.kwr[l]),act);
  434.      IF (myfile.res#FileSystem.done) THEN EXIT END;
  435.      FileSystem.WriteChar(myfile,ASCII.lf);
  436.      IF (myfile.res#FileSystem.done) THEN EXIT END;
  437.     END;
  438.     EXIT;
  439.    END;
  440.    IF (myfile.res#FileSystem.done) THEN
  441.     again:=HandleIOErr(writeC,body);
  442.    ELSE
  443.     again:=FALSE;
  444.    END;
  445.    IF (NOT again) THEN EXIT END;
  446.    IF filepresent THEN
  447.     filepresent:=FALSE;
  448.     FileSystem.Close(myfile);
  449.    END;
  450.   END;
  451.   IF filepresent THEN
  452.    filepresent:=FALSE;
  453.    FileSystem.Close(myfile);
  454.   END;
  455.  END SaveData;
  456.  
  457.  
  458.  
  459. PROCEDURE LoadData();
  460.  VAR a: FileReq.FileString;
  461.      s: CPCGlobal.String;
  462.      act: LONGINT;
  463.      x,y,l,cnt: INTEGER;
  464.      err,again: BOOLEAN;
  465.      val: LONGINT;
  466.      body: CPCGlobal.LString;
  467.  BEGIN
  468.   LOOP
  469.    String.Copy(dataReq.h,CPCGlobal.msg[71]);
  470.    CPCSleep.NormalPointer;
  471.    FileReq.FileReq(dataReq,a);
  472.    CPCSleep.SleepPointer;
  473.    IF String.Length(a)=0 THEN EXIT END;
  474.    LOOP
  475.     String.Copy(body,CPCGlobal.msg[16]);
  476.     FileSystem.Lookup(myfile,a,5000,FALSE);
  477.     filepresent:=TRUE;
  478.     IF (myfile.res#FileSystem.done) THEN EXIT END;
  479.     String.Copy(body,CPCGlobal.msg[34]);
  480.     FileSystem.ReadBytes(myfile,SYSTEM.ADR(s),8,act);
  481.     IF (myfile.res#FileSystem.done) THEN EXIT END;
  482.     IF String.Compare(s,"cpcdata!")#0 THEN
  483.      String.Copy(body,CPCGlobal.msg[35]);
  484.      myfile.res:=FileSystem.notdone;
  485.      EXIT;
  486.     ELSE
  487.      s[4]:="\o";
  488.      FileSystem.ReadBytes(myfile,SYSTEM.ADR(s),4,act);
  489.      IF (myfile.res#FileSystem.done) THEN EXIT END;
  490.      CPCGlobal.hori:=Value(s);
  491.      FileSystem.ReadBytes(myfile,SYSTEM.ADR(s),4,act);
  492.      IF (myfile.res#FileSystem.done) THEN EXIT END;
  493.      CPCGlobal.vert:=Value(s);
  494.      FileSystem.ReadBytes(myfile,SYSTEM.ADR(s),4,act);
  495.      IF (myfile.res#FileSystem.done) THEN EXIT END;
  496.      CPCGlobal.xmax:=Value(s);
  497.      FileSystem.ReadBytes(myfile,SYSTEM.ADR(s),4,act);
  498.      IF (myfile.res#FileSystem.done) THEN EXIT END;
  499.      CPCGlobal.ymax:=Value(s);
  500.      FOR x:=0 TO CPCGlobal.maxgrid DO
  501.       FOR y:=0 TO CPCGlobal.maxgrid DO
  502.        CPCGlobal.text[x,y]:="\o";
  503.       END;
  504.      END;
  505.      FOR y:=1 TO CPCGlobal.ymax DO
  506.       FOR x:=1 TO CPCGlobal.xmax DO
  507.        FileSystem.ReadChar(myfile,CPCGlobal.text[x,y]);
  508.        IF (myfile.res#FileSystem.done) THEN EXIT END;
  509.       END;
  510.      END;
  511.      FOR l:=0 TO CPCGlobal.hori+CPCGlobal.vert-1 DO
  512.       cnt:=-1;
  513.       REPEAT
  514.        INC(cnt);
  515.        FileSystem.ReadChar(myfile,s[cnt]);
  516.        IF (myfile.res#FileSystem.done) THEN EXIT END;
  517.       UNTIL (s[cnt]=ASCII.lf);
  518.       s[cnt]:="\o";
  519.       String.Copy(CPCGlobal.kwr[l],s);
  520.      END;
  521.     END;
  522.     EXIT;
  523.    END;
  524.    IF (myfile.res#FileSystem.done) THEN
  525.     again:=HandleIOErr(readC,body);
  526.    ELSE
  527.     again:=FALSE;
  528.    END;
  529.    IF (NOT again) THEN EXIT END;
  530.    IF filepresent THEN
  531.     filepresent:=FALSE;
  532.     FileSystem.Close(myfile);
  533.    END;
  534.   END;
  535.   IF filepresent THEN
  536.    filepresent:=FALSE;
  537.    FileSystem.Close(myfile);
  538.   END;
  539.  END LoadData;
  540.  
  541.  
  542.  
  543. PROCEDURE PrintSolution;
  544.  VAR s: CPCGlobal.String;
  545.      a,b: INTEGER;
  546.      body: CPCGlobal.LString;
  547.      err,again: BOOLEAN;
  548.  BEGIN
  549.   LOOP
  550.    LOOP
  551.     err:=TRUE;
  552.     String.Copy(body,CPCGlobal.msg[36]);
  553.     printer:=DosL.Open(SYSTEM.ADR("PRT:"),DosD.newFile);
  554.     IF (printer=NIL) THEN
  555.      String.Copy(body,CPCGlobal.msg[37]);
  556.      EXIT;
  557.     END;
  558.  
  559.     MakeComStr(s,ASCII.esc,"c","\o","\o","\o","\o","\o","\o");
  560.     IF Put(printer,SYSTEM.ADR(s),3) THEN EXIT END;
  561.  
  562.     MakeComStr(s,ASCII.esc,"[","0","z","\o","\o","\o","\o");
  563.     IF Put(printer,SYSTEM.ADR(s),5) THEN EXIT END;
  564.  
  565.     FOR a:=1 TO CPCGlobal.ymax DO
  566.      FOR b:=1 TO CPCGlobal.xmax DO
  567.       IF (CPCGlobal.text[b,a]="\o") THEN
  568.        s[0]:=" ";
  569.        IF Put(printer,SYSTEM.ADR(s),1) THEN EXIT END;
  570.       ELSE
  571.        IF Put(printer,SYSTEM.ADR(CPCGlobal.text[b,a]),1) THEN EXIT END;
  572.       END;
  573.      END;
  574.      s[0]:=ASCII.lf;
  575.      IF Put(printer,SYSTEM.ADR(s),1) THEN EXIT END;
  576.     END;
  577.  
  578.     MakeComStr(s,ASCII.esc,"c","\o","\o","\o","\o","\o","\o");
  579.     IF Put(printer,SYSTEM.ADR(s),0) THEN EXIT END;
  580.     err:=FALSE;
  581.     EXIT;
  582.    END;
  583.    IF (err) THEN
  584.     again:=HandleIOErr(printS,body);
  585.    ELSE
  586.     again:=FALSE;
  587.    END;
  588.    IF (NOT again) THEN EXIT END;
  589.    DosL.Close(printer);
  590.    printer:=NIL;
  591.   END;
  592.  
  593.   DosL.Close(printer);
  594.   printer:=NIL;
  595.  END PrintSolution;
  596.  
  597.  
  598.  
  599. PROCEDURE PutWordList(medium: DosD.FileHandlePtr; tex: BOOLEAN): BOOLEAN;
  600.  VAR
  601.   sorted,converr: BOOLEAN;
  602.   n,l1,l2,lastlen,pos: INTEGER;
  603.   temp: CPCGlobal.String;
  604.   out: ARRAY[0..100] OF CHAR;
  605.  BEGIN
  606.   REPEAT
  607.    sorted:=TRUE;
  608.    FOR n:=1 TO CPCGlobal.hori+CPCGlobal.vert-1 DO
  609.     l1:=String.Length(CPCGlobal.kwr[n-1]);
  610.     l2:=String.Length(CPCGlobal.kwr[n]);
  611.     IF (l1<l2) OR ((l1=l2) AND (String.Compare(CPCGlobal.kwr[n-1],CPCGlobal.kwr[n])<0)) THEN
  612.      String.Copy(temp,CPCGlobal.kwr[n-1]);
  613.      String.Copy(CPCGlobal.kwr[n-1],CPCGlobal.kwr[n]);
  614.      String.Copy(CPCGlobal.kwr[n],temp);
  615.      sorted:=FALSE;
  616.     END;
  617.    END;
  618.   UNTIL sorted;
  619.  
  620.   out:="\n\n\n";
  621.  
  622.   IF Put(medium,SYSTEM.ADR(out),3) THEN RETURN TRUE END;
  623.   IF tex THEN
  624.    IF Put(medium,SYSTEM.ADR("  \\begin{list}{}{\\listparindent0pt}\n"),0) THEN
  625.     RETURN TRUE;
  626.    END;
  627.   END;
  628.   n:=-1;
  629.   lastlen:=10000;
  630.   REPEAT
  631.    INC(n);
  632.    IF String.Length(CPCGlobal.kwr[n])#lastlen THEN
  633.     lastlen:=String.Length(CPCGlobal.kwr[n]);
  634.     Conversions.ValToStr(String.Length(CPCGlobal.kwr[n]),FALSE,out,10,2," ",converr);
  635.     out[2]:=":";
  636.     out[3]:="\o";
  637.     IF tex THEN
  638.      IF Put(medium,SYSTEM.ADR("    \\item[\\bf "),0) THEN RETURN TRUE END;
  639.      IF Put(medium,SYSTEM.ADR(out),0) THEN RETURN TRUE END;
  640.      IF Put(medium,SYSTEM.ADR("]\n"),0) THEN RETURN TRUE END;
  641.      out:="      ";
  642.     ELSE
  643.      out[3]:=" ";
  644.      out[4]:="\o";
  645.     END;
  646.    ELSE
  647.     out:="      ";
  648.    END;
  649.    String.Concat(out,CPCGlobal.kwr[n]);
  650.    String.ConcatChar(out," ");
  651.    REPEAT
  652.     INC(n);
  653.     IF String.Length(CPCGlobal.kwr[n])=lastlen THEN
  654.      String.Insert(out,String.last,CPCGlobal.kwr[n]);
  655.      String.ConcatChar(out," ");
  656.     END;
  657.    UNTIL (n>=CPCGlobal.hori+CPCGlobal.vert-1) OR (String.Length(out)+String.Length(CPCGlobal.kwr[n+1])+2>=78)
  658.                           OR (String.Length(CPCGlobal.kwr[n])#lastlen);
  659.    IF (n>=CPCGlobal.hori+CPCGlobal.vert-1) THEN
  660.     REPEAT
  661.      pos:=String.Length(out);
  662.      IF (out[pos-1]=" ") THEN
  663.       out[pos-1]:="\o";
  664.      END;
  665.     UNTIL (out[pos-1]#"\o");
  666.    END;
  667.    IF String.Length(CPCGlobal.kwr[n])#lastlen THEN
  668.     DEC(n);
  669.    END;
  670.    IF Put(medium,SYSTEM.ADR(out),0) THEN RETURN TRUE END;
  671.    out[0]:="\n";
  672.    IF Put(medium,SYSTEM.ADR(out),1) THEN RETURN TRUE END;
  673.   UNTIL (n>=CPCGlobal.hori+CPCGlobal.vert-1);
  674.   IF tex THEN
  675.    IF Put(medium,SYSTEM.ADR("\\end{list}\n"),0) THEN RETURN TRUE END;
  676.   END;
  677.   RETURN FALSE;
  678.  END PutWordList;
  679.  
  680.  
  681.  
  682. PROCEDURE PrintEpsonCross;
  683.  VAR
  684.   full: ARRAY [0..10] OF CPCGlobal.String;
  685.   mt: ARRAY [1..2] OF CPCGlobal.String;
  686.   graphon,graphoff,temp: CPCGlobal.String;
  687.   out: ARRAY [0..100] OF CHAR;
  688.   POW2: ARRAY[0..7] OF INTEGER;
  689.   m,n,ou,x,y,width: INTEGER;
  690.   s: CHAR;
  691.   act: LONGINT;
  692.   sorted,err,again: BOOLEAN;
  693.   pos,dotno: INTEGER;
  694.   body: CPCGlobal.LString;
  695.   l1,l2: INTEGER;
  696.   lastlen: INTEGER;
  697.   converr: BOOLEAN;
  698.  BEGIN
  699.   LOOP
  700.    LOOP
  701.     err:=TRUE;
  702.     String.Copy(body,CPCGlobal.msg[38]);
  703.     parallel:=DosL.Open(SYSTEM.ADR("PAR:"),DosD.newFile);
  704.     IF (parallel=NIL) THEN
  705.      String.Copy(body,CPCGlobal.msg[39]);
  706.      EXIT;
  707.     END;
  708.  
  709.     width:=640 DIV CPCGlobal.xmax;
  710.     IF (width>16) THEN
  711.      width:=16;
  712.     END;
  713.     POW2[0]:=1; POW2[1]:=2; POW2[2]:=4; POW2[3]:=8;
  714.     POW2[4]:=16; POW2[5]:=32; POW2[6]:=64; POW2[7]:=128;
  715.     FOR m:=0 TO 10 DO
  716.      FOR n:=0 TO width-1 DO
  717.       dotno:=RandomNumber.RND(8);
  718.       temp[n]:=CHAR(POW2[dotno]);
  719.      END;
  720.      temp[width]:="\o";
  721.      String.Copy(full[m],temp);
  722.     END;
  723.     mt[1,0]:=CHAR(255);
  724.     mt[2,0]:=CHAR(255);
  725.     FOR n:=1 TO width-2 DO
  726.      mt[1,n]:=CHAR(128);
  727.      mt[2,n]:=CHAR(1);
  728.     END;
  729.     mt[1,width-1]:=CHAR(255);
  730.     mt[2,width-1]:=CHAR(255);
  731.  
  732.     MakeComStr(graphon,ASCII.esc,"A",CHAR(8),ASCII.esc,"*",CHAR(4),
  733.                CHAR((CPCGlobal.xmax*width) MOD 256),CHAR((CPCGlobal.xmax*width) DIV 256));
  734.     MakeComStr(graphoff,ASCII.esc,"A",ASCII.lf,"\o","\o","\o","\o","\o");
  735.  
  736.     FOR y:=1 TO CPCGlobal.ymax DO
  737.      FOR ou:=1 TO 2 DO
  738.       IF Put(parallel,SYSTEM.ADR(graphon),0) THEN EXIT END;
  739.       FOR x:=1 TO CPCGlobal.xmax DO
  740.        IF (CPCGlobal.text[x,y]="\o") THEN
  741.         n:=RandomNumber.RND(11);
  742.         IF Put(parallel,SYSTEM.ADR(full[n]),width) THEN EXIT END;
  743.        ELSE
  744.         IF Put(parallel,SYSTEM.ADR(mt[ou]),width) THEN EXIT END;
  745.        END;
  746.       END;
  747.       s:=ASCII.lf;
  748.       IF Put(parallel,SYSTEM.ADR(s),1) THEN EXIT END;
  749.      END;
  750.     END;
  751.     IF Put(parallel,SYSTEM.ADR(graphoff),0) THEN EXIT END;
  752.     DosL.Close(parallel);
  753.     parallel:=NIL;
  754.  
  755.     printer:=DosL.Open(SYSTEM.ADR("PRT:"),DosD.newFile);
  756.     IF printer=NIL THEN
  757.      String.Copy(body,CPCGlobal.msg[37]);
  758.      EXIT;
  759.     END;
  760.     IF PutWordList(printer,FALSE) THEN EXIT END;
  761.  
  762.     err:=FALSE;
  763.     EXIT;
  764.    END;
  765.    IF (err) THEN
  766.     again:=HandleIOErr(printC,body);
  767.    ELSE
  768.     again:=FALSE;
  769.    END;
  770.    IF (NOT again) THEN EXIT END;
  771.    IF parallel#NIL THEN
  772.     DosL.Close(parallel);
  773.     parallel:=NIL;
  774.    END;
  775.    IF printer#NIL THEN
  776.     DosL.Close(printer);
  777.     printer:=NIL;
  778.    END;
  779.   END;
  780.  
  781.   IF parallel#NIL THEN
  782.    DosL.Close(parallel);
  783.    parallel:=NIL;
  784.   END;
  785.   IF printer#NIL THEN
  786.    DosL.Close(printer);
  787.    printer:=NIL;
  788.   END;
  789.  END PrintEpsonCross;
  790.  
  791.  
  792.  
  793. PROCEDURE DoField(x,y,xfac,yfac: INTEGER; frame: BOOLEAN;
  794.                   rport: GraphicsD.RastPortPtr);
  795.  VAR
  796.   i: INTEGER;
  797.   bdum: BOOLEAN;
  798.  BEGIN
  799.   IF frame THEN
  800.    GraphicsL.SetAPen(rport,1);
  801.    GraphicsL.Move(rport,x*xfac,y*yfac);
  802.    GraphicsL.Draw(rport,x*xfac+xfac,y*yfac);
  803.    GraphicsL.Draw(rport,x*xfac+xfac,y*yfac+yfac);
  804.    GraphicsL.Draw(rport,x*xfac,y*yfac+yfac);
  805.    GraphicsL.Draw(rport,x*xfac,y*yfac);
  806.   ELSE
  807.    GraphicsL.SetAPen(rport,1);
  808.    FOR i:=0 TO (xfac*yfac) DIV 7 DO
  809.     bdum:=GraphicsL.WritePixel(rport,x*xfac+RandomNumber.RND(xfac),
  810.                                      y*yfac+RandomNumber.RND(yfac));
  811.    END;
  812.   END;
  813.  END DoField;
  814.  
  815.  
  816.  
  817. PROCEDURE PrintFancyCross;
  818.  VAR
  819.   x,y: INTEGER;
  820.   scr: IntuiIO.SCREEN;
  821.   xfac,yfac: INTEGER;
  822.   rport: GraphicsD.RastPortPtr;
  823.   vport: GraphicsD.ViewPortPtr;
  824.   n: ARRAY[0..20] OF CHAR;
  825.   prtport: ExecD.MsgPortPtr;
  826.   again: BOOLEAN;
  827.   drpreq: Printer.IODRPReq;
  828.  BEGIN
  829.   xfac:=900 DIV CPCGlobal.xmax;
  830.   IF xfac>30 THEN
  831.    xfac:=30;
  832.   END;
  833.  
  834.   yfac:=900 DIV CPCGlobal.ymax;
  835.   IF yfac>30 THEN
  836.    yfac:=30;
  837.   END;
  838.   IF xfac>yfac THEN
  839.    xfac:=yfac;
  840.   ELSE
  841.    yfac:=xfac;
  842.   END;
  843.  
  844.   n:="";
  845.   scr:=IntuiIO.OpenScreen(n,0,1000,CPCGlobal.xmax*xfac+5,CPCGlobal.ymax*yfac+5,1,
  846.                           IntuiIO.ScreenTypeSet{IntuiIO.hires,IntuiIO.interlace});
  847.   rport:=IntuiIO.ScreenRastPort(scr);
  848.   vport:=IntuiIO.GetViewPort(scr);
  849.   GraphicsL.ClearScreen(rport);
  850.  
  851.   FOR x:=1 TO CPCGlobal.xmax DO
  852.    FOR y:=1 TO CPCGlobal.ymax DO
  853.     DoField(x-1,y-1,xfac,yfac,CPCGlobal.text[x,y]#"\o",rport);
  854.    END;
  855.   END;
  856.   GraphicsL.SetRGB4(vport,0,15,15,15);
  857.   GraphicsL.SetRGB4(vport,1,0,0,0);
  858.  
  859.   REPEAT
  860.    prtport:=ExecSupport.CreatePort(SYSTEM.ADR("cross.printer.port"),0);
  861.    IF prtport=NIL THEN
  862.     again:=HandleIOErr(printC,CPCGlobal.msg[19]);
  863.    ELSE
  864.     again:=FALSE;
  865.    END;
  866.   UNTIL NOT again;
  867.  
  868.   IF prtport#NIL THEN
  869.    REPEAT
  870.     ExecL.OpenDevice(SYSTEM.ADR("printer.device"),0,
  871.                      SYSTEM.ADR(drpreq),SYSTEM.LONGSET{});
  872.     IF drpreq.device=NIL THEN
  873.      again:=HandleIOErr(printC,CPCGlobal.msg[20]);
  874.     ELSE
  875.      again:=FALSE;
  876.     END;
  877.    UNTIL NOT again;
  878.  
  879.    IF drpreq.device#NIL THEN
  880.     drpreq.message.replyPort:=prtport;
  881.     drpreq.command:=Printer.dumpRPort;
  882.     drpreq.rastPort:=rport;
  883.     drpreq.colorMap:=vport^.colorMap;
  884.     drpreq.modes:=vport^.modes;
  885.     drpreq.srcX:=0;
  886.     drpreq.srcY:=0;
  887.     drpreq.srcWidth:=CPCGlobal.xmax*xfac+5;
  888.     drpreq.srcHeight:=CPCGlobal.ymax*yfac+5;
  889.     drpreq.destCols:=(CPCGlobal.xmax*xfac+5)*4;
  890.     drpreq.destRows:=0;
  891.     drpreq.special:=Printer.SpecialSet{Printer.noFormFeed,
  892.                                        Printer.aspect,Printer.center};
  893.  
  894.     ExecL.DoIO(SYSTEM.ADR(drpreq));
  895.    END;
  896.   END;
  897.  
  898.   IF drpreq.device#NIL THEN
  899.    ExecL.CloseDevice(SYSTEM.ADR(drpreq));
  900.    drpreq.device:=NIL;
  901.   END;
  902.  
  903.   IF prtport#NIL THEN
  904.    ExecSupport.DeletePort(prtport);
  905.    prtport:=NIL;
  906.   END;
  907.  
  908.   IntuiIO.CloseScreen(scr);
  909.   scr:=SYSTEM.CAST(IntuiIO.SCREEN,NIL);
  910.  
  911.   REPEAT
  912.    printer:=DosL.Open(SYSTEM.ADR("PRT:"),DosD.newFile);
  913.    IF printer=NIL THEN
  914.     again:=HandleIOErr(printC,CPCGlobal.msg[37]);
  915.    ELSE
  916.     again:=FALSE;
  917.    END;
  918.   UNTIL NOT again;
  919.  
  920.   n:="\n\e#1\e[1z\n\o";
  921.   again:=Put(printer,SYSTEM.ADR(n),0);
  922.  
  923.   REPEAT
  924.    IF PutWordList(printer,FALSE) THEN
  925.     again:=HandleIOErr(printC,CPCGlobal.msg[36]);
  926.    ELSE
  927.     again:=FALSE;
  928.    END;
  929.   UNTIL NOT again;
  930.  
  931.   IF printer#NIL THEN
  932.    DosL.Close(printer);
  933.    printer:=NIL;
  934.   END;
  935.  END PrintFancyCross;
  936.  
  937.  
  938.  
  939. PROCEDURE PrintPlainCross;
  940.  VAR
  941.   linea,lineb: ARRAY[0..CPCGlobal.maxgrid*2+5] OF CHAR;
  942.   i,x,y: INTEGER;
  943.   err,again: BOOLEAN;
  944.   body: CPCGlobal.LString;
  945.  BEGIN
  946.   LOOP
  947.    LOOP
  948.     err:=TRUE;
  949.     String.Copy(body,CPCGlobal.msg[36]);
  950.     printer:=DosL.Open(SYSTEM.ADR("PRT:"),DosD.newFile);
  951.     IF printer=NIL THEN
  952.      String.Copy(body,CPCGlobal.msg[37]);
  953.      EXIT;
  954.     END;
  955.  
  956.     MakeComStr(linea,"\e","[","0","z","\o","\o","\o","\o");
  957.     IF Put(printer,SYSTEM.ADR(linea),0) THEN EXIT END;
  958.     linea:="+";
  959.     FOR i:=1 TO CPCGlobal.xmax DO
  960.      String.Concat(linea,"-+");
  961.     END;
  962.     String.ConcatChar(linea,"\n");
  963.  
  964.     IF Put(printer,SYSTEM.ADR(linea),0) THEN EXIT END;
  965.     FOR y:=1 TO CPCGlobal.ymax DO
  966.      lineb:="|";
  967.      FOR x:=1 TO CPCGlobal.xmax DO
  968.       IF CPCGlobal.text[x,y]="\o" THEN
  969.        String.Concat(lineb,"#|");
  970.       ELSE
  971.        String.Concat(lineb," |");
  972.       END;
  973.      END;
  974.      String.ConcatChar(lineb,"\n");
  975.      IF Put(printer,SYSTEM.ADR(lineb),0) THEN EXIT END;
  976.      IF Put(printer,SYSTEM.ADR(linea),0) THEN EXIT END;
  977.     END;
  978.  
  979.     MakeComStr(linea,"\e","[","1","z","\n","\o","\o","\o");
  980.     IF Put(printer,SYSTEM.ADR(linea),0) THEN EXIT END;
  981.     IF PutWordList(printer,FALSE) THEN EXIT END;
  982.  
  983.     err:=FALSE;
  984.     EXIT;
  985.    END;
  986.  
  987.    IF err THEN
  988.     again:=HandleIOErr(printC,body);
  989.    ELSE
  990.     again:=FALSE;
  991.    END;
  992.    IF NOT again THEN EXIT END;
  993.   END;
  994.  
  995.   IF printer#NIL THEN
  996.    DosL.Close(printer);
  997.    printer:=NIL;
  998.   END;
  999.  END PrintPlainCross;
  1000.  
  1001.  
  1002.  
  1003. PROCEDURE Real2Str(r: REAL; VAR s: ARRAY OF CHAR);
  1004.  VAR
  1005.   dum: BOOLEAN;
  1006.  BEGIN
  1007.   RealConversions.RealToStr(r,s,8,2,FALSE,dum);
  1008.   WHILE s[0]=" " DO
  1009.    String.DeleteChar(s,String.first);
  1010.   END;
  1011.  END Real2Str;
  1012.  
  1013.  
  1014.  
  1015. PROCEDURE Int2Str(i: INTEGER; VAR s: ARRAY OF CHAR);
  1016.  VAR
  1017.   dum: BOOLEAN;
  1018.  BEGIN
  1019.   Conversions.ValToStr(i,FALSE,s,10,0," ",dum);
  1020.  END Int2Str;
  1021.  
  1022.  
  1023.  
  1024. PROCEDURE PrintTexCross;
  1025.  VAR
  1026.   x,y: INTEGER;
  1027.   err,again,dum: BOOLEAN;
  1028.   out: DosD.FileHandlePtr;
  1029.   fac: REAL;
  1030.   nums: ARRAY[0..20] OF CHAR;
  1031.   name: FileReq.FileString;
  1032.   body: CPCGlobal.LString;
  1033.  BEGIN
  1034.   name:="";
  1035.   REPEAT
  1036.    String.Copy(texReq.h,CPCGlobal.msg[90]);
  1037.    CPCSleep.NormalPointer;
  1038.    FileReq.FileReq(texReq,name);
  1039.    CPCSleep.SleepPointer;
  1040.    IF String.Length(name)=0 THEN
  1041.     err:=FALSE;
  1042.    ELSE
  1043.     out:=DosL.Open(SYSTEM.ADR(name),DosD.newFile);
  1044.     IF out=NIL THEN
  1045.      err:=TRUE;
  1046.      String.Copy(body,CPCGlobal.msg[91]);
  1047.     ELSE
  1048.      String.Copy(body,CPCGlobal.msg[92]);
  1049.      fac:=18.0/REAL(CPCGlobal.xmax);
  1050.      IF 18.0/REAL(CPCGlobal.ymax)<fac THEN
  1051.       fac:=18.0/REAL(CPCGlobal.ymax);
  1052.      END;
  1053.      err:=err OR Put(out,SYSTEM.ADR("\\documentstyle{article}\n"),0);
  1054.      err:=err OR Put(out,
  1055.                SYSTEM.ADR("\\hoffset-2cm \\oddsidemargin0pt \\textwidth18.5cm\n"),0);
  1056.      err:=err OR Put(out,SYSTEM.ADR("\\begin{document}\n"),0);
  1057.      err:=err OR Put(out,SYSTEM.ADR("  \\unitlength"),0);
  1058.      Real2Str(fac,nums);
  1059.      err:=err OR Put(out,SYSTEM.ADR(nums),0);
  1060.      err:=err OR Put(out,SYSTEM.ADR("cm\n"),0);
  1061.      err:=err OR Put(out,SYSTEM.ADR("  \\begin{picture}("),0);
  1062.      Int2Str(CPCGlobal.xmax,nums);
  1063.      err:=err OR Put(out,SYSTEM.ADR(nums),0);
  1064.      err:=err OR Put(out,SYSTEM.ADR(",\o"),0);
  1065.      Int2Str(CPCGlobal.ymax,nums);
  1066.      err:=err OR Put(out,SYSTEM.ADR(nums),0);
  1067.      err:=err OR Put(out,SYSTEM.ADR(")\n"),0);
  1068.  
  1069.      FOR x:=1 TO CPCGlobal.xmax DO
  1070.       FOR y:=1 TO CPCGlobal.ymax DO
  1071.        IF CPCGlobal.text[x,y]#"\o" THEN
  1072.         (*=====================================================================*)
  1073.         (*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
  1074.         (*  WARNING TO ALL YOU LaTeX-USERS OUT THERE:                          *)
  1075.         (*  DO NOT REPLACE THE FOLLOWING \line COMMANDS WITH \framebox         *)
  1076.         (*  THIS WOULD BE SHORTER, BUT WILL NOT WORK PROPERLY!!!!!             *)
  1077.         (*¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡*)
  1078.         (*=====================================================================*)
  1079.  
  1080.         IF CPCGlobal.text[x,y-1]="\o" THEN
  1081.          err:=err OR Put(out,SYSTEM.ADR("    \\linethickness{0.35mm}\n"),0);
  1082.         ELSE
  1083.          err:=err OR Put(out,SYSTEM.ADR("    \\linethickness{0.15mm}\n"),0);
  1084.         END;
  1085.         err:=err OR Put(out,SYSTEM.ADR("    \\put("),0);
  1086.         Int2Str(x-1,nums);
  1087.         err:=err OR Put(out,SYSTEM.ADR(nums),0);
  1088.         Int2Str(CPCGlobal.ymax-(y-1)+1,nums);
  1089.         err:=err OR Put(out,SYSTEM.ADR(",\o"),0);
  1090.         err:=err OR Put(out,SYSTEM.ADR(nums),0);
  1091.         err:=err OR Put(out,SYSTEM.ADR("){\\line(1,0){1}}\n"),0);
  1092.  
  1093.         IF CPCGlobal.text[x-1,y]="\o" THEN
  1094.          err:=err OR Put(out,SYSTEM.ADR("    \\linethickness{0.35mm}\n"),0);
  1095.         ELSE
  1096.          err:=err OR Put(out,SYSTEM.ADR("    \\linethickness{0.15mm}\n"),0);
  1097.         END;
  1098.         err:=err OR Put(out,SYSTEM.ADR("    \\put("),0);
  1099.         Int2Str(x-1,nums);
  1100.         err:=err OR Put(out,SYSTEM.ADR(nums),0);
  1101.         Int2Str(CPCGlobal.ymax-(y-1)+1,nums);
  1102.         err:=err OR Put(out,SYSTEM.ADR(",\o"),0);
  1103.         err:=err OR Put(out,SYSTEM.ADR(nums),0);
  1104.         err:=err OR Put(out,SYSTEM.ADR("){\\line(0,-1){1}}\n"),0);
  1105.  
  1106.         IF CPCGlobal.text[x,y+1]="\o" THEN
  1107.          err:=err OR Put(out,SYSTEM.ADR("    \\linethickness{0.35mm}\n"),0);
  1108.          err:=err OR Put(out,SYSTEM.ADR("    \\put("),0);
  1109.          Int2Str(x-1,nums);
  1110.          err:=err OR Put(out,SYSTEM.ADR(nums),0);
  1111.          Int2Str(CPCGlobal.ymax-y+1,nums);
  1112.          err:=err OR Put(out,SYSTEM.ADR(",\o"),0);
  1113.          err:=err OR Put(out,SYSTEM.ADR(nums),0);
  1114.          err:=err OR Put(out,SYSTEM.ADR("){\\line(1,0){1}}\n"),0);
  1115.         END;
  1116.  
  1117.         IF CPCGlobal.text[x+1,y]="\o" THEN
  1118.          err:=err OR Put(out,SYSTEM.ADR("    \\linethickness{0.35mm}\n"),0);
  1119.          err:=err OR Put(out,SYSTEM.ADR("    \\put("),0);
  1120.          Int2Str(x,nums);
  1121.          err:=err OR Put(out,SYSTEM.ADR(nums),0);
  1122.          Int2Str(CPCGlobal.ymax-(y-1)+1,nums);
  1123.          err:=err OR Put(out,SYSTEM.ADR(",\o"),0);
  1124.          err:=err OR Put(out,SYSTEM.ADR(nums),0);
  1125.          err:=err OR Put(out,SYSTEM.ADR("){\\line(0,-1){1}}\n"),0);
  1126.         END;
  1127.        END;
  1128.       END;
  1129.      END;
  1130.      err:=err OR Put(out,SYSTEM.ADR("  \\end{picture}\n"),0);
  1131.      err:=err OR PutWordList(out,TRUE);
  1132.      err:=err OR Put(out,SYSTEM.ADR("\\end{document}\n"),0);
  1133.      DosL.Close(out);
  1134.      out:=NIL;
  1135.     END;
  1136.    END;
  1137.    IF err THEN
  1138.     again:=HandleIOErr(printC,body);
  1139.    ELSE
  1140.     again:=FALSE;
  1141.    END;
  1142.   UNTIL NOT again;
  1143.   IF out#NIL THEN
  1144.    DosL.Close(out);
  1145.    out:=NIL;
  1146.   END;
  1147.  END PrintTexCross;
  1148.  
  1149.  
  1150.  
  1151. BEGIN
  1152.  printer:=NIL;
  1153.  parallel:=NIL;
  1154.  scr:=SYSTEM.CAST(IntuiIO.SCREEN,NIL);
  1155.  filepresent:=FALSE;
  1156. CLOSE
  1157.  IF scr#NIL THEN
  1158.   IntuiIO.CloseScreen(scr);
  1159.   scr:=SYSTEM.CAST(IntuiIO.SCREEN,NIL);
  1160.  END;
  1161.  IF printer#NIL THEN
  1162.   DosL.Close(printer);
  1163.   printer:=NIL;
  1164.  END;
  1165.  IF parallel#NIL THEN
  1166.   DosL.Close(parallel);
  1167.   parallel:=NIL;
  1168.  END;
  1169.  IF (CPCGlobal.words[0]#NIL) AND (CPCGlobal.words[1]#NIL) THEN
  1170.   ExecL.FreeMem(CPCGlobal.words[1],SYSTEM.CAST(LONGINT,CPCGlobal.words[0]));
  1171.   CPCGlobal.words[0]:=NIL;
  1172.   CPCGlobal.words[1]:=NIL;
  1173.  END;
  1174. END CPCDosIO.
  1175.