home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 1: Collection A / 17Bit_Collection_A.iso / files / 1065.dms / 1065.adf / TextPlus / SrcE.lzh / SrcE / printerE.c < prev   
C/C++ Source or Header  |  1990-08-10  |  29KB  |  903 lines

  1. /*
  2.  *          printerE.c             © by Martin Steppler
  3.  */
  4.  
  5. extern LONG FileSelect();
  6. extern VOID ReleaseFileSelect();
  7. BYTE pfadundfile[PATHSTRSIZE+FILESTRSIZE+12];
  8. struct FSRequest MyFSReq;
  9. /* DEFINES */
  10. #define MAUSKLICK while((nclass=message()) != MOUSEBUTTONS);
  11. #define DRAWGAD    1
  12. #define ZAHLGADI   2
  13. #define ZAHLGADII  3
  14. #define ZAHLGADIII 4
  15. #define ZAHLGADIV  5
  16. #define ZAHLGADV   6
  17. #define ZAHLGADVI  7
  18. #define OK         8
  19. #define STOP       9
  20. #define SUCHEN     10
  21. #define ERSETZEN   11
  22. #define GROSSKLEIN 12
  23.  
  24. /* VARIABLEN */
  25. union Drucker *DruckerReq;     /* für die Druckerausgabe */
  26. union Drucker {
  27.    struct IOStdReq drucker_std;
  28.    struct IODRPReq drucker_drp;
  29.    struct IOPrtCmdReq drucker_pcr;
  30. };
  31. struct MsgPort *DP;
  32. extern union Drucker *CreateExtIO();
  33.  
  34. UBYTE itaein[] = { 27,'[','3',    'm',EOS },
  35.       itaaus[] = { 27,'[','2','3','m',EOS },
  36.       untein[] = { 27,'[','4',    'm',EOS },
  37.       untaus[] = { 27,'[','2','4','m',EOS },
  38.       fetein[] = { 27,'[','4', 34,'z',EOS },
  39.       fetaus[] = { 27,'[','3', 34,'z',EOS };
  40.  
  41. int    spa,zei;
  42. static int nclass;
  43. static int first=0, fahne=0;   /* flags */
  44. static unsigned char backup[32]   = EOS, upback [32]   = EOS;
  45. static unsigned char suchen[32]   = EOS, suchII [32]   = EOS;
  46. static unsigned char ersetzen[32] = EOS, ersetzII [32] = EOS;
  47. static UBYTE zgad1[5]=EOS, undozgad1[5];
  48. static UBYTE zgad2[5]=EOS, undozgad2[5];
  49. static UBYTE zgad3[5]=EOS, undozgad3[5];
  50. static UBYTE zgad4[5]=EOS, undozgad4[5];
  51. static UBYTE zgad5[5]=EOS, undozgad5[5];
  52. static UBYTE zgad6[6]=EOS, undozgad6[6];
  53.  
  54. static struct Window       *fenster2;
  55. static struct RastPort       *RP1;
  56.  
  57. static struct StringInfo infoN3={      /* Info für Gehezu */
  58.    (UBYTE *) backup, (UBYTE *) upback, 0,31,0,0,0,0,0,0,0,0,NULL };
  59. static struct StringInfo infoN2={      /* Info für Suchen */
  60.    (UBYTE *) suchen, (UBYTE *) suchII, 0,31,0,0,0,0,0,0,0,0,NULL };
  61. static struct StringInfo infoN1={      /* Info für Ersetzen */
  62.    (UBYTE *) ersetzen, (UBYTE *) ersetzII, 0,31,0,0,0,0,0,0,0,0,NULL };
  63.  
  64. static struct StringInfo info1={    /* Info für ZAHLGADI */
  65.    (UBYTE *)zgad1,(UBYTE *)undozgad1, 0,4,0,0,0,0,0,0,0,0,NULL };
  66. static struct StringInfo info2={    /* Info für ZAHLGADII */
  67.    (UBYTE *)zgad2,(UBYTE *)undozgad2, 0,4,0,0,0,0,0,0,0,0,NULL };
  68. static struct StringInfo info3={    /* Info für ZAHLGADIII */
  69.    (UBYTE *)zgad3,(UBYTE *)undozgad3, 0,4,0,0,0,0,0,0,0,0,NULL };
  70. static struct StringInfo info4={    /* Info für ZAHLGADIV */
  71.    (UBYTE *)zgad4,(UBYTE *)undozgad4, 0,4,0,0,0,0,0,0,0,0,NULL };
  72. static struct StringInfo info5={    /* Info für ZAHLGADV */
  73.    (UBYTE *)zgad5,(UBYTE *)undozgad5, 0,4,0,0,0,0,0,0,0,0,NULL };
  74. static struct StringInfo info6={    /* 2. Info für ZAHLGADV */
  75.    (UBYTE *)zgad6,(UBYTE *)undozgad6, 0,5,0,0,0,0,0,0,0,0,NULL };
  76.  
  77. struct IntuiText oktext = {
  78.    BLAU, WEISS, JAM2, 0, 0, NL, (UBYTE *) "  OKAY  ", NL };
  79. struct IntuiText stoptext = {
  80.    ROT,  WEISS, JAM2, 0, 0, NL, (UBYTE *) "  STOP  ", NL };
  81. struct IntuiText grosstext = {
  82.    BLAU,  WEISS, JAM2, 0, 0, NL, (UBYTE *) "OFF", NL };
  83.  
  84.  
  85. static struct Gadget *gaddy;
  86.  
  87. static struct Gadget Gad2={        /* Textgadget */
  88.    NULL, 12, 28, 237, 8,         /* 115 */
  89.    GADGHCOMP,RELVERIFY,STRGADGET,
  90.    NULL,NULL,NULL,0,
  91.    (APTR)&infoN3,DRAWGAD,NULL };
  92. static struct Gadget Gad3={        /* Textgadget Suchen */
  93.    NULL, 96, 28, 237, 8,
  94.    GADGHCOMP,RELVERIFY,STRGADGET,
  95.    NULL,NULL,NULL,0,
  96.    (APTR)&infoN2,SUCHEN,NULL };
  97. static struct Gadget Gad4={        /* Textgadget Ersetzen */
  98.    &Gad3, 96, 50, 237, 8,
  99.    GADGHCOMP,RELVERIFY,STRGADGET,
  100.    NULL,NULL,NULL,0,
  101.    (APTR)&infoN1,ERSETZEN,NULL };
  102. static struct Gadget grossgad ={   /* Groß/Klein */
  103.     &Gad4,308,72,24,8,GADGHCOMP,RELVERIFY,BOOLGADGET,0,NULL,
  104.     &grosstext,EOS,NULL,GROSSKLEIN,NULL};
  105.  
  106. static struct Gadget IntGad6={           /* 6. Intgadget */
  107.    NULL, 110, 28, 40, 8,           /* Gehe zur x. Zeile */
  108.    GADGHCOMP,RELVERIFY|LONGINT|GADGIMMEDIATE,STRGADGET,
  109.    NULL,NULL,NULL,0,
  110.    (APTR)&info6,ZAHLGADVI,NULL };
  111. static struct Gadget okgad  ={
  112.    NULL,53,149,64,8,
  113.    GADGHCOMP,RELVERIFY,BOOLGADGET,0,NULL,
  114.    &oktext,EOS,NULL,OK,NULL };
  115. static struct Gadget stopgad ={
  116.    &okgad,223,149,64,8,GADGHCOMP,RELVERIFY,BOOLGADGET,0,NULL,
  117.    &stoptext,EOS,NULL,STOP,NULL};
  118. static struct Gadget IntGad5={           /* 5. Intgadget */
  119.    &stopgad, 42, 130, 32, 8,           /* Papierlänge */
  120.    GADGHCOMP,RELVERIFY|LONGINT|GADGIMMEDIATE,STRGADGET,
  121.    NULL,NULL,NULL,0,
  122.    (APTR)&info5,ZAHLGADV,NULL };
  123. static struct Gadget IntGad4={           /* 4. Intgadget */
  124.    &IntGad5, 267, 84, 32, 8,           /* rechter Rand */
  125.    GADGHCOMP,RELVERIFY|LONGINT|GADGIMMEDIATE,STRGADGET,
  126.    NULL,NULL,NULL,0,
  127.    (APTR)&info4,ZAHLGADIV,NULL };
  128. static struct Gadget IntGad3={           /* 3. Intgadget */
  129.    &IntGad4, 153, 84, 32, 8,           /* linker Rand */
  130.    GADGHCOMP,RELVERIFY|LONGINT|GADGIMMEDIATE,STRGADGET,
  131.    NULL,NULL,NULL,0,
  132.    (APTR)&info3,ZAHLGADIII,NULL };
  133. static struct Gadget IntGad2={           /* 2. Intgadget */
  134.    &IntGad3, 267, 40, 32, 8,           /* bis Seite */
  135.    GADGHCOMP,RELVERIFY|LONGINT|GADGIMMEDIATE,STRGADGET,
  136.    NULL,NULL,NULL,0,
  137.    (APTR)&info2,ZAHLGADII,NULL };
  138. static struct Gadget IntGad1={           /* 1. Intgadget */
  139.    &IntGad2, 153, 40, 32, 8,           /* von Seite */
  140.    GADGHCOMP,RELVERIFY|LONGINT|GADGIMMEDIATE,STRGADGET,
  141.    NULL,NULL,NULL,0,
  142.    (APTR)&info1,ZAHLGADI,NULL };
  143.  
  144. static struct NewWindow FensterVereinbarung = { /* Fenster */
  145.    145,16,350,168,-1,-1,
  146.    MOUSEBUTTONS|GADGETDOWN|GADGETUP,
  147.    BORDERLESS|ACTIVATE,
  148.    &Gad2,NULL,NULL,NULL,NULL,0,0,0,0,
  149.    CUSTOMSCREEN };
  150.  
  151. message()
  152. {
  153.    int nklasse=0;
  154.    if(nachricht2 = (struct IntuiMessage *)GetMsg(fenster2->UserPort)) {
  155.       nklasse = nachricht2->Class;
  156.       gaddy   = (struct Gadget *)nachricht2->IAddress;
  157.       ReplyMsg(nachricht2);
  158.    }
  159.    return(nklasse);
  160. }
  161. print(text, col, xpos, ypos)
  162. char *text;
  163. int col, xpos, ypos;
  164. {
  165.    SetAPen(RP1, col);  SetDrMd(RP1, JAM1);
  166.    Move(RP1, xpos, ypos); Text(RP1, text, strlen(text));
  167. }
  168. block(col,x1,y1,x2,y2)
  169. int col,x1,y1,x2,y2;
  170. {
  171.    SetAPen(RP1, col); SetDrMd(RP1, JAM1); RectFill(RP1, x1,y1,x2,y2);
  172. }
  173. disk(anzeige)
  174. char *anzeige;
  175. {
  176.    MyFSReq.titlestr = (BYTE *)anzeige;
  177.    if(FileSelect(&MyFSReq)) {
  178.       if(!MyFSReq.fullname[0]) return(FALSE);
  179.       return(TRUE);
  180.    }
  181.    return(FALSE);
  182. }
  183. MaskeSetzen()    /* Druckerfenster zeichnen */
  184. {
  185.    int i,k;
  186.    block(2,10,5,350,168);
  187.    block(1,0,0,340,163);
  188.    for(i=0;i<2;i++) {
  189.       block(2,i*170+51,148,i*170+118,157);
  190.      /*  block(0,i*170+50,148,i*170+120,158); */
  191.    }
  192.    /* print("OK",1,75,156);
  193.    print("STOP",1,239,156); */
  194.    for(i=0;i<4;i++) {
  195.       block(2, 8,i*20+19,96,(i+1)*20+19);
  196.       block(0,10,i*20+20,94,(i+1)*20+18);
  197.    }
  198.    print("NLQ",1,40,32);
  199.    print("Pica",1,36,52);
  200.    print("Elite",1,32,72);
  201.    print("Condensed",1,16,92);
  202.    block(2,8,107,96,127);
  203.    block(0,10,108,94,126);
  204.    print("paper-",1,28,116);
  205.    print("length", 1,28,124);
  206.    block(2,8,127,96,139);
  207.    block(0,10,128,94,138);
  208.    for(k=0;k<2;k++) {   /* Wenn Blockmodus, dann keine Seitenabfrage */
  209.       for(i=0;i<2;i++) {
  210.          if(!(blo>0 && (i==0 || i==1) && (k==0 || k==1))) {
  211.              block(2,114*k+104,i*16+19,114*k+219,i*16+35);
  212.              block(0,114*k+106,i*16+20,114*k+217,i*16+34);
  213.          }
  214.          block(2,114*k+104,i*16+63,114*k+219,i*16+79);
  215.          block(0,114*k+106,i*16+64,114*k+217,i*16+78);
  216.          block(2,57*k+104+i*114,127,57*k+162+i*114,139);
  217.          block(0,57*k+106+i*114,128,57*k+160+i*114,138);
  218.       }
  219.    }
  220.    print("ON", 1,125,136); print("ON", 1,125+114,136);
  221.    print("OFF",1,178,136); print("OFF",1,178+114,136);
  222.    if(blo==0) { print("from page",1,125,30);
  223.       print("to page",1,248,30); }
  224.    print("left margin",1,117,74);
  225.    print("right martin",1,227,74);
  226.    block(2,104,107,333,127);
  227.    block(0,106,108,331,126);
  228.    print("numbering of",1,170,116);
  229.    print("pages",1,141,124);
  230.    print("lines",1,255,124);
  231. }
  232. Hell2(zahl)  /* complementäre Darstellung des jeweiligen Gadgets */
  233. int zahl;
  234. {
  235.    SetDrMd(RP1, COMPLEMENT);
  236.    if(zahl<=3)
  237.       RectFill(RP1,10,zahl*20+20,94,(zahl+1)*20+18);
  238.    else if(zahl<=5)
  239.       RectFill(RP1,57*(zahl-4)+220,128,57*(zahl-4)+274,138);
  240.    else
  241.       RectFill(RP1,(zahl-6)*57+106,128,(zahl-6)*57+160,138);
  242.    SetDrMd(RP1, JAM1);
  243. }
  244. drucken(anzeige, anfse, anfze, seit, zeile)  /* Druckroutine */
  245. char *anzeige;
  246. int anfse, anfze, seit, zeile; /* Übergabe der maximal druckbaren Zeilen */
  247. {
  248.    int xa,xb,xc,ende,st,i,ii,r,os;
  249.    char c;
  250.  
  251.    spa=seit; zei=zeile;
  252.    zg2=spa+1;
  253.    if(zg1>zg2)   zg1=1;
  254.    if(blo==0) {
  255.       strcpy(zgad1,itoa(zg1));
  256.       strcpy(zgad2,itoa(zg2));
  257.    }
  258.    strcpy(zgad3,itoa(zg3));
  259.    strcpy(zgad4,itoa(zg4));
  260.    strcpy(zgad5,itoa(zg5));
  261.    if(blo==0) FensterVereinbarung.FirstGadget = &IntGad1;
  262.    else       FensterVereinbarung.FirstGadget = &IntGad3;
  263.    FensterVereinbarung.Screen = Scheibe;
  264.    if(!(fenster2 = (struct Window *)OpenWindow(&FensterVereinbarung))) {
  265.       FensterVereinbarung.FirstGadget = &Gad2;
  266.       return(0);
  267.    }
  268.    RP1 = fenster2->RPort;
  269.    MaskeSetzen();
  270.    if(blo==0) RefreshGadgets(&IntGad1,fenster2,NULL);
  271.    else       RefreshGadgets(&IntGad3,fenster2,NULL);
  272.    xb = strlen(anzeige)*8;
  273.    xa = 170 - xb /2;
  274.    block(2,xa-19,3,xa+xb+19,15);
  275.    block(0,xa-17,4,xa+xb+17,14);
  276.    print(anzeige,1,xa,12);
  277.    Hell2(schrift); Hell2(znum); Hell2(snum+6);
  278.    ende = checkit();
  279.    CloseWindow(fenster2);
  280.    FensterVereinbarung.FirstGadget = &Gad2;
  281.    if(blo==0) {
  282.       strcpy(zgad1,itoa(zg1));
  283.       strcpy(zgad2,itoa(zg2));
  284.    }
  285.    strcpy(zgad3,itoa(zg3));
  286.    strcpy(zgad4,itoa(zg4));
  287.    strcpy(zgad5,itoa(zg5));
  288.    if(ende==2) return(0); /* 2 -> Stopgadget im Printerfenster */
  289.    DP=(struct MsgPort *)CreatePort(0,0); /* prt: öffnen */
  290.    DruckerReq=(union Drucker *)
  291.        CreateExtIO(DP,sizeof(union Drucker));
  292.    if(OpenDevice("printer.device",0,DruckerReq,0) != 0) {
  293.       sprintf(buffer, "Kann printer.device nicht öffnen!");
  294.       Meldung();
  295.       DeleteExtIO(DruckerReq, sizeof(union Drucker));
  296.       DeletePort(DP);
  297.       return(0);
  298.    }        /* Schriftart u. Rand einstellen */
  299.    sprintf(hel, "%cc%c[%d;%ds",27,27,zg3,zg4);  /* Reset + l. + r. Rand */
  300.    switch(schrift) {
  301.       case 0:  sprintf(buffer, "%c[2%cz",27,34);      /* NLQ */
  302.           strcat(hel, buffer); break;
  303.       case 1:  sprintf(buffer, "%c[0m",27);           /* Pica */
  304.           strcat(hel, buffer); break;
  305.       case 2:  sprintf(buffer, "%c[2w",27);           /* Elite */
  306.           strcat(hel, buffer); break;
  307.       case 3:  sprintf(buffer, "%c[4w", 27);          /* Schmal */
  308.           strcat(hel, buffer); break;
  309.    }
  310.    xa =zg1-1; xb=0; xc=anfze; if(znum==5) znum=0; else znum=1;
  311.    if(blo>0)  xa=anfse;
  312.    while((ende=ausdruck(hel))==1) ;
  313.    if(!ende) goto fin;
  314.    FOREVER {  /* Hauptdruckroutine */
  315.       if(xb==0) {  /* Anfang einer Textseite */
  316.          if(blo>0)
  317.             sprintf(buffer, "(P)rint block or (A)bort!");
  318.          else
  319.             sprintf(buffer, "Page %d! (S)kip (A)bort (P)rint!",xa+1);
  320.          Meldung();
  321. sleep:   while((c=ConsoleGetKey())<=0) ;
  322.          if((c == 's' || c == 'S') && !(blo>0)) {
  323.             xa++; if(xa>zg2-1) { ende=1; break; }
  324.             continue;
  325.          }
  326.          else if(c=='a' || c=='A') { ende =1; break; }
  327.          else if(c!='p' && c!='P') goto sleep;
  328.       }
  329.       if(SC(xa,xc,(i=SL(xa,xc)))) { st=8;   /* Steuercodes in Zeile */
  330.          if(znum) { sprintf(buffer, "%4d ",znum++); ii=5; }
  331.          else ii=0;
  332.          for(r=0; r<=i-1; r++) {
  333.             if(a[xa] [xc] [r] <9) {
  334.                buffer[ii] = EOS;
  335.                if(!br) { ii+=SetzeStil(a[xa] [xc] [r],st); st=a[xa] [xc] [r]; }
  336.             }
  337.             else buffer[ii++] = a[xa] [xc] [r];
  338.             if(r==i-1 && a[xa] [xc] [r] == '­') buffer[ii-1]='-';
  339.          }
  340.          buffer[ii]=EOS; ii+=SetzeStil(8,st);
  341.          buffer[ii++]=27; buffer[ii++] = 'E'; buffer[ii]=EOS;
  342.       }
  343.       else if(znum) sprintf(buffer,"%4d %s\n", znum++, a[xa] [xc]);
  344.       else sprintf(buffer, "%s\n", a[xa] [xc]);
  345.       if(!(ende=ausdruck(buffer))) break;
  346.       else if(ende==1) continue;
  347.       xb++; xc++;
  348.       if(xa==zg2-1 && xc>zei) { ende=2; break; }
  349.       if(xc>SEITE)  { xc=0; xa++; if(xa>zg2-1) {ende=2; break; } }
  350.       if(xb>SEITE) { linefd(xb,xa); xb=0; }
  351.    }
  352. fin:  if(ende==2) linefd(xb,xa);
  353.    if(ende) CloseDevice(DruckerReq);
  354.    znum = (znum) ? 4:5;
  355.    sprintf(buffer, "Finished printing!");
  356.    Meldung();
  357. }
  358. linefd(xb,xa)    /* Papier zum Anfang der nächsten Seite schieben */
  359. int xb,xa;       /* und Seitenmarkierung anbringen                */
  360. {
  361.    int i,r;
  362.  
  363.    sprintf(hel, "\n");
  364.    if(zg5>xb) {
  365.       while(ausdruck(hel)) {
  366.          xb++;
  367.          if(!snum && xb==zg5-9) {
  368.             sprintf(buffer,"- %d -\n", xa+1);
  369.             for(r=0, i=(zg4-zg3-strlen(buffer))/2; r<i; r++) hel[r] = 32;
  370.             hel[r] = EOS; strcat(hel, buffer);
  371.             if(!ausdruck(hel)) break;
  372.             sprintf(hel, "\n"); xb++;
  373.          }
  374.          if(xb==zg5) break;
  375.       }
  376.    }
  377. }
  378. SetzeStil(neu,alt)
  379. int neu,alt;
  380. {
  381.    int i=0;
  382.  
  383.    if(neu&4 && !(alt&4))      { strcat(buffer,itaein); i+=4; }
  384.    else if(!(neu&4) && alt&4) { strcat(buffer,itaaus); i+=5; }
  385.    if(neu&2 && !(alt&2))      { strcat(buffer,fetein); i+=5; }
  386.    else if(!(neu&2) && alt&2) { strcat(buffer,fetaus); i+=5; }
  387.    if(neu&1 && !(alt&1))      { strcat(buffer,untein); i+=4; }
  388.    else if(!(neu&1) && alt&1) { strcat(buffer,untaus); i+=5; }
  389.    return(i);
  390. }
  391. ausdruck(ausdr)   /* Senden einer Textzeile zum Drucken und Fehlerabfrage */
  392. UBYTE *ausdr;
  393. {
  394.    char c;
  395.  
  396.    DruckerReq->drucker_std.io_Command = CMD_WRITE;
  397.    DruckerReq->drucker_std.io_Data    = (APTR) ausdr;
  398.    DruckerReq->drucker_std.io_Length  = strlen(ausdr);
  399.    DruckerReq->drucker_pcr.io_Command = CMD_WRITE;
  400.    if(DoIO(DruckerReq)) {
  401.       sprintf(buffer, "ERROR! (A)bort or (T)ry again?");
  402.       Meldung();
  403. wi1:  if((c=ConsoleGetKey()) == 'a' || c=='A') {
  404.          DeleteExtIO(DruckerReq, sizeof(union Drucker));
  405.          DeletePort(DP);
  406.          return(0);
  407.       }
  408.       else if(c=='t' || c=='T')   return(1);
  409.       goto wi1;
  410.    }
  411.    return(2);
  412. }
  413.  
  414. checkit()  /* Betätigung eines Gadgets überprüfen */
  415. {
  416.    int ende = 0, gnr;
  417.  
  418.    while(ende==0){
  419.       nclass = message();
  420.       switch(nclass){
  421.          case GADGETDOWN:
  422.             break;
  423.          case GADGETUP:
  424.             switch(gaddy->GadgetID) {
  425.                case ZAHLGADI:    /* je nach Gadget, die Richtigkeit der */
  426.                   pruefzg1();    /* Eingabe überprüfen */
  427.                   break;
  428.                case ZAHLGADII:
  429.                   pruefzg2();
  430.                   break;
  431.                case ZAHLGADIII:
  432.                   pruefzg3();
  433.                   break;
  434.                case ZAHLGADIV:
  435.                   pruefzg4();
  436.                   break;
  437.                case ZAHLGADV:
  438.                   pruefzg5();
  439.                   break;
  440.                case OK:
  441.                   pruefalles(); ende++;
  442.                   break;
  443.                case STOP:
  444.                   ende=2;
  445.                   break;
  446.             }
  447.             break;
  448.          case MOUSEBUTTONS:
  449.             gnr=Mausabfrage();
  450.             if(gnr>=0 && gnr<=3) {  /* Schriftart ausgewählt */
  451.                if(schrift!=gnr) {
  452.                   Hell2(schrift); schrift=gnr; Hell2(schrift);
  453.                }
  454.             }
  455.             else if(gnr>=4 && gnr<=5) {  /* Zeilennummerierung An/Aus */
  456.                if(znum!=gnr) {
  457.                   Hell2(znum); Hell2(znum=gnr);
  458.                }
  459.             }
  460.             else if(gnr>=6 && gnr<=7) { /* Seitennummerierung An/Aus */
  461.                if(snum+6!=gnr) {
  462.                   Hell2(snum+6); Hell2(gnr); snum=gnr-6;
  463.                }
  464.             }
  465.             break;
  466.          default:
  467.             break;
  468.       }
  469.    }
  470.    return(ende);
  471. }
  472. pruefalles()
  473. {
  474.    if (blo==0) {
  475.       pruefzg1();
  476.       pruefzg2();
  477.    }
  478.    pruefzg3();
  479.    pruefzg4();
  480.    pruefzg5();
  481. }
  482.  
  483. Mausabfrage()  /* Überprüfung, ob bei Betätigung der linken Maustaste ein */
  484. {          /* Gadget angewählt wurde */
  485.    int i,xk,yk;
  486.  
  487.    xk=fenster2->MouseX;
  488.    yk=fenster2->MouseY;
  489.    if(xk>10 && xk<94){
  490.       for(i=0;i<4;i++){       /* Schriftart */
  491.          if(yk>i*20+20 && yk<(i+1)*20+18) return(i);
  492.       }
  493.    }
  494.    if(yk>128 && yk<138){
  495.       for(i=0;i<2;i++) {   /* Zeilennummerierung an/aus */
  496.          if(xk>57*i+106 && xk<57*i+160) return(i+6);
  497.          if(xk>57*i+220 && xk<57*i+274) return(i+4);
  498.       }
  499.    }
  500.    return(8);
  501. }
  502. pruefzg1() /* Richtigkeit der Eingaben in die IntegerGadgets überprüfen */
  503. {      /* von Seite */
  504.    int zg1alt = zg1;
  505.    zg1 = atoin(zgad1);
  506.    if(zg1<1 || zg1>zg2) {
  507.       zg1 = zg1alt;
  508.       strcpy(zgad1,itoa(zg1));
  509.       RefreshGadgets(&IntGad1,fenster2,NULL);
  510.    }
  511. }
  512. pruefzg2()            /* bis Seite */
  513. {
  514.    int zg2alt = zg2;
  515.    zg2 = atoin(zgad2);
  516.    if(zg2<zg1 || zg2>spa+1) {
  517.       zg2 = zg2alt;
  518.       strcpy(zgad2,itoa(zg2));
  519.       RefreshGadgets(&IntGad1,fenster2,NULL);
  520.    }
  521. }
  522. pruefzg3()           /* linker Rand */
  523. {
  524.    int zg3alt = zg3;
  525.    zg3 = atoin(zgad3);
  526.    if(zg3<0 || zg3>zg4) {
  527.       zg3 = zg3alt;
  528.       strcpy(zgad3,itoa(zg3));
  529.       if(blo>0) RefreshGadgets(&IntGad3,fenster2,NULL);
  530.       else   RefreshGadgets(&IntGad1,fenster2,NULL);
  531.    }
  532. }
  533. pruefzg4()           /* rechter Rand */
  534. {
  535.    int zg4alt = zg4;
  536.    zg4 = atoin(zgad4);
  537.    if(zg4<zg3 || zg4>137) {
  538.       zg4 = zg4alt;
  539.       strcpy(zgad4,itoa(zg4));
  540.       if(blo>0) RefreshGadgets(&IntGad3,fenster2,NULL);
  541.       else   RefreshGadgets(&IntGad1,fenster2,NULL);
  542.    }
  543. }
  544. pruefzg5()         /* Papierlänge */
  545. {
  546.    int zg5alt = zg5;
  547.    zg5 = atoin(zgad5);
  548.    if(zg5<1 || zg5>72) {
  549.       zg5 = zg5alt;
  550.       strcpy(zgad5,itoa(zg5));
  551.       if(blo>0) RefreshGadgets(&IntGad3,fenster2,NULL);
  552.       else   RefreshGadgets(&IntGad1,fenster2,NULL);
  553.    }
  554. }
  555. itoa(n)          /* Integer in ASCII-String umwandeln */
  556. int n;
  557. {
  558.    UBYTE nach[5];
  559.    int i=0, k, l, signum=FALSE;
  560.  
  561.    if(n<0) { signum=TRUE; n=-n; }
  562.    do nach[i++] = n % 10 + '0'; while(n /= 10);
  563.    if(signum) nach[i++] = '-';
  564.    nach[i] = EOS;
  565.    for(i=0, k=strlen(nach)-1; i<k; i++, k--) {
  566.       l = nach[i]; nach[i] = nach[k]; nach[k] = l;
  567.    }
  568.    return((int)nach);
  569. }
  570. atoin(von)    /* ASCII-String in Integer umwandeln */
  571. UBYTE *von;
  572. {
  573.    int n, signum=1;
  574.  
  575.    while(*von == ' ') von++;
  576.    if(*von == '+' || *von == '-')
  577.       signum = (*von++ == '+') ? 1 : -1;
  578.    for(n=0; *von >= '0' && *von <= '9'; ++von)
  579.       n = 10 * n + *von - '0';
  580.    return(signum * n);
  581. }
  582. einstell(anzeige, flaggy, seit, zeil)  /* Seitenlänge o. Textbreite */
  583. UBYTE *anzeige;              /* einstellen */
  584. int flaggy, seit, zeil;
  585. {
  586.    int xa,xb,ende=0,erinnern=zg5;
  587.  
  588.    if(flaggy) zg5=MAX; else zg5=SEITE+1;
  589.    strcpy(zgad5,itoa(zg5));
  590.  
  591.    FensterVereinbarung.LeftEdge = 242; FensterVereinbarung.TopEdge = 74;
  592.    FensterVereinbarung.Width = 156; FensterVereinbarung.Height = 52;
  593.    IntGad5.LeftEdge = 65; IntGad5.TopEdge = 28;
  594.    FensterVereinbarung.FirstGadget = &IntGad5;
  595.    FensterVereinbarung.Screen = Scheibe;
  596.    if(!(fenster2 = (struct Window *)OpenWindow(&FensterVereinbarung))) {
  597.       tschuess();
  598.       return(0);
  599.    }
  600.    RP1 = fenster2->RPort;
  601.    block(2,10,5,156,52);
  602.    block(1,0,0,146,47);
  603.    xb = strlen(anzeige)*8;
  604.    xa = 73 - xb /2;
  605.    block(2,xa-19,3,xa+xb+19,15);
  606.    block(0,xa-17,4,xa+xb+17,14);
  607.    print(anzeige,1,xa,12);
  608.    block(2,45,25,101,37);
  609.    block(0,47,26,99,36);
  610.    RefreshGadgets(&IntGad5,fenster2,NULL);
  611.    ActivateGadget(&IntGad5,fenster2,NULL );
  612.    while(!ende){
  613.       if(message() == GADGETUP && gaddy->GadgetID == ZAHLGADV) ende++;
  614.    }
  615.    CloseWindow(fenster2);
  616.    zg5 = atoin(zgad5);
  617.    if(flaggy==0 && zg5>=10 && zg5<=72) Seitenlaenge(zg5);
  618.    else if(flaggy==1 && zg5>=10 && zg5<=ABSMAX) Textbreite(zg5);
  619.    tschuess();
  620.    zg5 = erinnern;
  621. }
  622. Gehezu(faehnrich)
  623. int faehnrich;
  624. {
  625.    int xa,xb,ende=0, laen1;
  626.  
  627.    if(faehnrich==3)      sprintf(hel, "Replace");
  628.    else if(faehnrich==2) sprintf(hel, "Find");
  629.    else if(faehnrich==1) {
  630.       sprintf(hel, "Go to line x");
  631.       FensterVereinbarung.FirstGadget = &IntGad6;
  632.    }
  633.    else {
  634.       sprintf(hel, "Go to ...");
  635.       FensterVereinbarung.FirstGadget = &Gad2;
  636.    }
  637.    if(faehnrich>=2) {
  638.       FensterVereinbarung.Width = 354; FensterVereinbarung.Height = 96;
  639.       FensterVereinbarung.FirstGadget = &grossgad;
  640.       FensterVereinbarung.LeftEdge = 143; FensterVereinbarung.TopEdge = 52;
  641.    }
  642.    else {
  643.       FensterVereinbarung.Width = 270; FensterVereinbarung.Height = 52;
  644.       FensterVereinbarung.LeftEdge = 185; FensterVereinbarung.TopEdge = 74;
  645.    }
  646.    FensterVereinbarung.Screen = Scheibe;
  647.    if(!(fenster2 = (struct Window *)OpenWindow(&FensterVereinbarung))) {
  648.       tschuess();
  649.       return(0);
  650.    }
  651.    RP1 = fenster2->RPort;
  652.    xb = strlen(hel)*8;
  653.    if(faehnrich>=2) {
  654.       block(2,10,5,354,96); block(1,0,0,344,91);
  655.       xa = 172 - xb /2;
  656.    }
  657.    else {
  658.       block(2,10,5,270,52); block(1,0,0,260,47);
  659.       xa = 130 - xb /2;
  660.    }
  661.    block(2,xa-19,3,xa+xb+19,15); block(0,xa-17,4,xa+xb+17,14);
  662.    print(hel,1,xa,12);
  663.    if(faehnrich>=2) {
  664.       block(2,92,25,336,37); block(0,94,26,334,36);
  665.       block(2,92,47,336,59); block(0,94,48,334,58);
  666.       block(2,306,71,333,80); /* block(0,306,70,334,80); */
  667.       print("Find:",2,10,34);
  668.       print("Replace:",2,10,56);
  669.       print("Case-sensitive:",2,10,79);
  670.  
  671.       RefreshGadgets(&grossgad,fenster2,NULL);
  672.       ActivateGadget(&Gad3,fenster2,NULL);
  673.       while(!ende) {
  674.          if(message() == GADGETUP) {
  675.             if(gaddy->GadgetID == GROSSKLEIN) {
  676.                if(++grokle==1) {
  677.                   strcpy(grosstext.IText,"ON");
  678.                   grosstext.LeftEdge=4;
  679.                   block(1,308,72,331,79);
  680.                }
  681.                else {
  682.                   grokle=0; strcpy(grosstext.IText,"OFF");
  683.                   grosstext.LeftEdge=0;
  684.                }
  685.                RefreshGadgets(&grossgad,fenster2,NULL);
  686.                ActivateGadget(&Gad3,fenster2,NULL);
  687.             }
  688.             else if(gaddy->GadgetID == SUCHEN) {
  689.                if(faehnrich==2) ende++;
  690.                else {
  691.                   RefreshGadgets(&grossgad,fenster2,NULL);
  692.                   ActivateGadget(&Gad4,fenster2,NULL);
  693.                }
  694.             }
  695.             else if(gaddy->GadgetID == ERSETZEN) ende++;
  696.          }
  697.       }
  698.    }
  699.    else if(faehnrich) { block(2,106,25,154,37); block(0,108,26,152,36);
  700.       RefreshGadgets(&IntGad6,fenster2,NULL);
  701.       ActivateGadget(&IntGad6,fenster2,NULL);
  702.       while(!ende){
  703.          if(message() == GADGETUP && gaddy->GadgetID == ZAHLGADVI) ende++;
  704.       }
  705.    }
  706.    else { block(2,8,25,252,37);   block(0,10,26,250,36);
  707.       RefreshGadgets(&Gad2,fenster2,NULL);
  708.       ActivateGadget(&Gad2,fenster2,NULL);
  709.       while(!ende){
  710.         if(message() == GADGETUP && gaddy->GadgetID == DRAWGAD) ende++;
  711.       }
  712.    }
  713.    CloseWindow(fenster2); tschuess();
  714.    if(faehnrich>=2) Suchen(faehnrich-2);
  715.    else if(faehnrich) {
  716.       laen1=atoin(zgad6); ende = se*(SEITE+1)+ze+1;
  717.       if(laen1<1 || laen1>ende) {
  718.          sprintf(buffer, "Line %s doesn't exist!",zgad6);
  719.         if(meld != TRUE) { Meldung(); meld=FALSE; }
  720.       }
  721.       else {
  722.          if(laen1>72) {
  723.             xa = laen1 / (SEITE +1); xb = laen1 % (SEITE +1)-1; }
  724.          else {
  725.             xa =0; xb=laen1-1; }
  726.          y=MIY; s=xa; z=xb; x=MIX; off=0; meld=FALSE; SText();
  727.          ZSDisplay(); meld=FALSE;
  728.       }
  729.    }
  730.    else {
  731.       ende=0;
  732.       if(laen1=strlen(backup)) {
  733.          for(xa=0;xa<=se;xa++) {
  734.             for(xb=0;xb<=SEITE;xb++) {
  735.                if(xb>ze && xa==se) break;
  736.                if(laen1<=SL(xa,xb))
  737.                   ende = StrVer(backup, a[xa] [xb]);
  738.                 if(ende) break;
  739.             }
  740.             if(ende) break;
  741.          }
  742.       }
  743.       if(!ende) {
  744.          sprintf(buffer, "%s not found!", backup);
  745.          if(meld != TRUE) { Meldung(); meld=FALSE; }
  746.       }
  747.       else {
  748.          y=MIY; s=xa; z=xb; x=MIX; off=0; meld=FALSE; SText();
  749.          ZSDisplay(); meld=FALSE;
  750.       }
  751.    }
  752. }
  753. tschuess()
  754. {
  755.    FensterVereinbarung.FirstGadget = &Gad2;
  756.    FensterVereinbarung.Width = 350; FensterVereinbarung.Height = 168;
  757.    FensterVereinbarung.LeftEdge =155; FensterVereinbarung.TopEdge = 16;
  758.    IntGad5.LeftEdge = 42; IntGad5.TopEdge = 130;
  759. }
  760. StrVer(s,t)
  761. UBYTE *s, *t;
  762. {
  763.    int gleich = 0, laenge;
  764.  
  765.    laenge = strlen(s);
  766.    FOREVER {
  767.       if(*t<9 || *s++ == *t++) gleich++;
  768.       else { gleich = 0; break; }
  769.       if(gleich==laenge) break;
  770.    }
  771.    return(gleich);
  772. }
  773. StrVerII(s,t,ls,lt,pos)
  774. UBYTE *s, *t;
  775. int ls,lt,pos;
  776. {
  777.    int gleich=FALSE, xneu=1;
  778.    UBYTE *alts;
  779.  
  780.    alts=s;
  781.    if(pos) {
  782.       if((lt-=pos)>=ls) {
  783.          while(gleich<pos) { if(*t<9) t++; t++; gleich++; }
  784.       }
  785.       xneu=pos+1; gleich=FALSE;
  786.    }
  787.    FOREVER {
  788.       if(ls>lt) break;
  789.       if(*t<9) t++;
  790.       if(*s == *t) gleich++;
  791.       else if(!grokle && *s>=65 && *s<=90 && *t>=97 && *t<=122 && *s==*t-32)
  792.          gleich++;
  793.       else if(!grokle && *s>=97 && *s<=122 && *t>=65 && *t<=90 && *s-32==*t)
  794.          gleich++;
  795.       else {
  796.          if(gleich) { xneu+=gleich; lt-=gleich; s=alts; gleich=FALSE; }
  797.          else       { xneu++; lt--; t++; }
  798.          continue;
  799.       }
  800.       if(gleich==ls) { x=xneu; break; }
  801.       s++; t++;
  802.    }
  803.    return(gleich);
  804. }
  805. Suchen(auswahl)
  806. int auswahl;
  807. {
  808.    int ende=0, len, l2, xa=s, xb=z, st;
  809.    char c;
  810.  
  811.    if(len=strlen(suchen)) {
  812.       if(xa==s && xb==z && (l2=SL(xa,xb))) {
  813.          ende = StrVerII(suchen, a[xa] [xb], len, l2-SC(xa,xb,l2), x);
  814.       }
  815.       if(!(ende || (xa==se && xb==ze))) {
  816.          FOREVER {
  817.             if(auswahl<=1) {
  818.                if(ende || (xa==se && xb==ze)) break;
  819.                if(++xb>SEITE) { xb=0; xa++; }
  820.             }
  821.             else {
  822.                if(ende || (!xa && !xb)) break;
  823.                if(--xb<0) { xb=SEITE; xa--; }
  824.             }
  825.             if(l2=SL(xa,xb))
  826.                ende = StrVerII(suchen, a[xa] [xb], len, l2-SC(xa,xb,l2),0);
  827.          }
  828.       }
  829.    }
  830.    if(!ende) {
  831.       sprintf(buffer, "%s not found!", suchen);
  832.       if(meld != TRUE) { Meldung(); meld=FALSE; }
  833.    }
  834.    else {
  835.       s=xa; z=xb; meld=FALSE;
  836.       y=MIY; SText();
  837.       ZSDisplay(); meld=FALSE;
  838.       if(auswahl==1 || auswahl==3) {                 /* ERSETZEN */
  839.          SetAPen(RP, 3); SetDrMd(RP, INVERSVID|COMPLEMENT);
  840.          Move(RP, (x-1)*8, y*8-2);
  841.          for(ende=0; ende<len; ende++) buffer[ende] = ' '; buffer[ende] = EOS;
  842.          Text(RP, buffer, len);
  843.          SetAPen(RP, 1); SetDrMd(RP, JAM2);
  844.          sprintf(buffer, "Replace == RETURN! Abort == SPACE!");
  845.          Meldung();
  846.          do {
  847.             if((c=ConsoleGetKey())==13) {
  848.                if(strlen(ersetzen)) {
  849.                   xa=Testen(stil); x+=(len-1); xb=Testen(stil); x-=(len-1);
  850.                   st=SC(s,z,(l2=SL(s,z)));
  851.                   a[s] [z] [x+xa-1]=EOS;
  852.                   sprintf(buffer, "%s%s", a[s] [z], ersetzen);
  853.                   a[s] [z] += (x+len+xb-1); strcat(buffer, a[s] [z]);
  854.                   a[s] [z] -= (x+len+xb-1); st+=(xa-xb);
  855.                   if((ende=strlen(buffer))!=l2) BelAend(s,z,st,ende,l2);
  856.                   strcpy(a[s] [z], buffer);
  857.                   if(ende-st>MAX) {
  858.                      l2=x;
  859.                      while(ende-st>MAX) {
  860.                         ende--;
  861.                         for(;ende>=0;ende--) {
  862.                            if(a[s] [z] [ende] <9) st--;
  863.                            if(a[s] [z] [ende] == 32) {
  864.                               x = ende+2-st; break;
  865.                            }
  866.                         }
  867.                      }
  868.                      if(x>ABSMAX||ende<0) x=MAX;   /* voll ohne space */
  869.                      xa=s; xb=z; meld=500; CarRet(); meld=FALSE; s=xa; z=xb; x=l2;
  870.                   }
  871.                   y=MIY; SText();
  872.                   ZSDisplay(); meld=FALSE;
  873.                }
  874.             }
  875.             else if(c==32) { ZSDisplay();
  876.                SetAPen(RP, 3); SetDrMd(RP, INVERSVID|COMPLEMENT);
  877.                Move(RP, (x-1)*8, y*8-2);
  878.                for(ende=0; ende<len; ende++) buffer[ende] = ' '; buffer[ende] = EOS;
  879.                Text(RP, buffer, len);
  880.                SetAPen(RP, 1); SetDrMd(RP, JAM2);
  881.             }
  882.          }  while(c!=13 && c!=32);
  883.       }
  884.    }
  885. }
  886. ConsoleGetKey()
  887. {
  888.    int len=0;
  889.    UBYTE KeyBuffer[10];
  890.  
  891.    Wait(1 << Fenster -> UserPort -> mp_SigBit);
  892.    while((nachricht2=(struct IntuiMessage *) GetMsg(Fenster->UserPort))!=0L) {
  893.       if (!(nachricht2->Class != RAWKEY || (nachricht2->Code & IECODE_UP_PREFIX))) {
  894.          len = DeadKeyConvert(nachricht2, KeyBuffer, sizeof(KeyBuffer), NULL);
  895.          if(len==1) len=KeyBuffer[0];
  896.          else len=1;
  897.       }
  898.       else if(nachricht2->Class == MOUSEBUTTONS) len=-1;
  899.       ReplyMsg(nachricht2);
  900.    }
  901.    return(len);
  902. }
  903.