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 / blockE.c < prev    next >
C/C++ Source or Header  |  1990-08-08  |  14KB  |  530 lines

  1. /*
  2.  *          blockE.c             © by Martin Steppler
  3.  */
  4.  
  5. int laufs=-1, laufz=-1;
  6.  
  7. FastLoad(FName)
  8. UBYTE *FName;
  9. {
  10.    int fehler=FALSE, txan=meld;
  11.  
  12.    meld=FALSE;
  13.    sprintf(buffer,"Loading %s!", FName);
  14.    Meldung();
  15.    if((fehler=Laden(FName)) == TRUE) {
  16.       if(txan!=5) { NamenSetzen(FName); strcpy(titel,FName); }
  17.       SText(); meld=FALSE;
  18.    }
  19.    return(fehler);
  20. }
  21. Speichern(fn, as, az, es, ez)
  22. UBYTE *fn;
  23. int as, az, es, ez;
  24. {
  25.    FILE *file;
  26.    struct FileHandle *handle;
  27.    int ln, i, st, e1, e2, txp=FALSE;
  28.  
  29.    if((ln=strlen(fn))>=4) {     /* File schon mit `.txp` - Endung */
  30.       if((fn[ln-1]==80||fn[ln-1]==112)&&(fn[ln-2]==120||fn[ln-2]==88)&&
  31.          (fn[ln-3]==84||fn[ln-3]==116)&&fn[ln-4]==46) txp=TRUE;
  32.    }
  33.    if(!txp && !br) strcat(fn, ".txp");
  34.    if(bak) {   /* Backup-Mode ist an */
  35.       if(handle=Open(fn, MODE_OLDFILE)) { /* File existiert */
  36.          Close(handle); strcpy(buffer,fn); strcat(buffer, ".bak");
  37.          DeleteFile(buffer); /* Altes Backup löschen */
  38.          if(!Rename(fn,buffer)) {
  39.             sprintf(buffer, "Can't open %s!", fn);
  40.          }
  41.       }
  42.    }
  43.    if(!(file=fopen((char *)fn,"w"))) {
  44.       sprintf(buffer,"Can't open  %s!",fn);
  45.       Meldung();
  46.       return(FALSE);
  47.    }
  48.    else {
  49.       sprintf(buffer, "Saving %s!", fn);
  50.       Meldung(); ln=0;
  51.       FOREVER {
  52.          i=SL(as, az); st=SC(as,az,i);
  53.          if(br && st) {
  54.             for(e1=0,e2=0; e2<i; e2++) {
  55.                if(a[as] [az] [e2] <9) continue;
  56.                buffer[e1++] = a[as] [az] [e2];
  57.             }
  58.             buffer[e1]= EOS;
  59.             fprintf(file, "%s\n", buffer);
  60.             ln+= e1+1;
  61.          }
  62.          else {
  63.             fprintf(file, "%s\n", a[as] [az]);
  64.             ln += i+1;
  65.          }
  66.          az+=1;
  67.          if(az>SEITE) {
  68.             az=0; as+=1;
  69.          }
  70.          if(as>=es) {
  71.             if(az>ez) break;
  72.             if(as>es) break;
  73.          }
  74.       }
  75.       fclose(file);
  76.       if(blo<3) { NamenSetzen(fn); strcpy(titel,fn); }
  77.       sprintf(buffer, "Length: %d Bytes", ln);
  78.       Meldung();
  79.       sicher = TRUE;
  80.    }
  81.    return(TRUE);
  82. }
  83. auto_frage(frage)
  84. char *frage;
  85. {
  86.    request_text.IText = (UBYTE *)frage;
  87.    return(AutoRequest(Fenster,&request_text,&ja_text,&nein_text,0,0,319,60));
  88. }
  89. SpeicherMangel()
  90. {
  91.    char *frage;
  92.  
  93.    sprintf(frage, "OUT OF MEMORY! The GURU is soon to come! Save file?");
  94.    request_text.IText = (UBYTE *)frage;
  95.    if(AutoRequest(Fenster,&request_text,&ja_text,&nein_text,0,0,640,256))
  96.       Speichern("I_escaped_the_guru", 0,0,se,ze);
  97.    Schluss();
  98.    exit(FALSE);
  99. }
  100. TLoeschen(miteb)
  101. int miteb;
  102. {
  103.    int i;
  104.  
  105.    FOREVER {
  106.       FreeMem(a[se] [ze], SL(se,ze)+2);
  107.       if(--ze<0) {
  108.          ze=SEITE; if(--se<0) break;
  109.       }
  110.    }
  111.    se=ze=s=z=0; x=MIX; y=MIY; if(miteb) ErstBel(s,z);
  112.    SetAPen(RP,0);
  113.    RectFill(RP,0,32,RRAND,YKOD+2);
  114.    SetAPen(RP,1);
  115.    ZSDisplay();
  116.    sicher = TRUE;
  117. }
  118. TLaden(fname)
  119. UBYTE *fname;
  120. {
  121.    TLoeschen(FALSE);
  122.  
  123.    if(!FastLoad(fname)) ErstBel(s,z);
  124.    ZSDisplay();
  125.    sprintf(buffer,"%s",str); Meldung();
  126. }
  127. TextAnhaengen(fname)
  128. UBYTE *fname;
  129. {
  130.    int sealt=se, zealt=ze, salt=s, zalt=z, yalt=y;
  131.  
  132.    if(++ze>SEITE) {
  133.       ze=0;
  134.       if(++se>MAS) {
  135.          ze=SEITE; se=MAS;
  136.          sprintf(buffer, "%s", FehlerText[2]);
  137.          Meldung();
  138.          return(0);
  139.        }
  140.    }
  141.    s = se; z = ze;
  142.    meld=5; y=MIY+1;
  143.    if(FastLoad(fname)==TRUE) {
  144.       sicher = FALSE;
  145.    }
  146.    else {
  147.       ze=zealt; se=sealt; z=zalt; s=salt; y=yalt;
  148.    }
  149.    ZSDisplay();
  150.    sprintf(buffer, "%s",str);
  151.    Meldung();
  152. }
  153. BlockLoeschen(as,az,es,ez)
  154. int as,az,es,ez;
  155. {
  156.    int s1=es, z1=ez;
  157.  
  158.    FOREVER {                /* Löschen */
  159.       FreeMem(a[es] [ez], SL(es,ez)+2);
  160.       if(es==as && ez==az) break;
  161.       if(--ez<0) { ez=SEITE; es--; }
  162.    }
  163.    if(s1==se && z1==ze) {                /* Blockende    == Textende    */
  164.       if(!es && !ez) ErstBel(0,0);     /* Blockanfang  == Textanfang  */
  165.       else {
  166.          if(--az<0) { az=SEITE; as--; }
  167.       }
  168.    }
  169.    else {                                /* Blockende    != Textende    */
  170.       es=s1; if((ez=z1+1)>SEITE) { ez=0; es++; }
  171.       FOREVER {
  172.          a[as] [az] = a[es] [ez];
  173.          if(es==se && ez==ze) break;
  174.          if(++az>SEITE) { az=0; as++; }
  175.          if(++ez>SEITE) { ez=0; es++; }
  176.       }
  177.    }
  178.    se=as; ze=az; sicher=FALSE;
  179.    if(meld>1) return(0);
  180.    blo=0; MenueUeberwachung(0);
  181.    if(!(bas>s || (s==bas && baz>z))) {
  182.       if(BloPruef()) {
  183.          s=bes;
  184.          if((z=bez+1)>SEITE) { z=0; s++; }
  185.       }
  186.       for(s1=(bes-bas)*(SEITE+1)+bez-baz; s1>=0; s1--) {
  187.          if(--z<0) { z=SEITE; s--; }
  188.       }
  189.       if(s<0) s=0; if(s==se && z>ze) z=ze;
  190.       if(!s && z<=(MAY-MIY)) y=MIY+z;
  191.    }
  192.    SText(); ZSDisplay();
  193.    sprintf(buffer, "Block deleted!");
  194.    meld = TRUE;
  195. }
  196. BlockMarkieren()
  197. {
  198.    int len;
  199.  
  200.    if(!blo) blo=1;
  201.    if(blo==2) {
  202.       bes=s; bez=z;
  203.       if(bes<bas) {
  204.          len=bas; bas=bes; bes=len;
  205.          len=baz; baz=bez; bez=len;
  206.       }
  207.       if(bes==bas) {
  208.          if(bez<baz) {
  209.             len=bez; bez=baz; baz=len;
  210.          }
  211.       }
  212.       blo++; /* SText(); */
  213.       ZSDisplay();
  214.       sprintf(buffer, "End of block marked!");
  215.       meld = TRUE;
  216.       MenueUeberwachung(2);
  217.    }
  218.    else if(blo==1) {
  219.       bas=s; baz=z; blo++;
  220.       SetAPen(RP, 0); RectFill(RP, 0, y*8-8, RRAND, y*8-1);
  221.       SetAPen(RP, 1); Rolling(); BloRel(0);
  222.       sprintf(buffer, "Begin of block marked!");
  223.       meld=TRUE;
  224.       MenueUeberwachung(1);
  225.    }
  226.    return(0);
  227. }
  228. MarkierungLoeschen()
  229. {
  230.    MenueUeberwachung(0);
  231.    blo=0; SText();
  232.    ZSDisplay();
  233.    sprintf(buffer, "Mark deleted!");
  234.    meld=TRUE;
  235. }
  236. MenueUeberwachung(bl)
  237. int bl;
  238. {
  239.    int len, h=SHIFTMENU(1);
  240.  
  241.    if(bl==3) {
  242.       if(ein) EinItem[3].Flags |= CHECKED; else EinItem[3].Flags = CFLAG;
  243.       if(!br) EinItem[4].Flags |= CHECKED; else EinItem[4].Flags = CFLAG;
  244.       if(!au) EinItem[5].Flags |= CHECKED; else EinItem[5].Flags = CFLAG;
  245.       if(bak) EinItem[6].Flags |= CHECKED; else EinItem[6].Flags = CFLAG;
  246.    }
  247.    if(bl==1) {
  248.       /* Dokument: Laden, Anhängen, Löschen, 3*Speichern u. Drucken aus */
  249.       OffMenu(Fenster, SHIFTMENU(0));
  250.       OffMenu(Fenster, SHIFTMENU(0)|SHIFTITEM(6));
  251.       for(len=1; len<=9; len=len+2)
  252.          OffMenu(Fenster, SHIFTMENU(0)|SHIFTITEM(len));
  253.       OffMenu(Fenster, SHIFTMENU(2));               /* Seitenlänge    aus */
  254.       for(len=4;len<=6;len++)                       /* Ersetzen 3*    aus */
  255.          OffMenu(Fenster, SHIFTMENU(4)|SHIFTITEM(len));
  256.       OffMenu(Fenster, h|SHIFTITEM(7));             /* Block Laden    aus */
  257.       OnMenu(Fenster,  h|SHIFTITEM(5));             /* Mark. Löschen   an */
  258.    }
  259.    if(bl==2) {
  260.       OnMenu(Fenster, h|SHIFTITEM(2));              /* Block Kopieren  an */
  261.       OnMenu(Fenster, h|SHIFTITEM(3));              /* Block Löschen   an */
  262.       OnMenu(Fenster, h|SHIFTITEM(8));              /* Block Speichern an */
  263.       OnMenu(Fenster, h|SHIFTITEM(10));             /* Block Drucken   an */
  264.       OffMenu(Fenster, h);                          /* Block Markier. aus */
  265.    }
  266.    if(bl==0) {
  267.       /* Dokument: Laden, Anhängen, Löschen, 3*Speichern u. Drucken an */
  268.       OnMenu(Fenster, SHIFTMENU(0));
  269.       OnMenu(Fenster, SHIFTMENU(0)|SHIFTITEM(6));
  270.       for(len=1; len<=9; len=len+2)
  271.          OnMenu(Fenster, SHIFTMENU(0)|SHIFTITEM(len));
  272.       OnMenu(Fenster,  SHIFTMENU(2));               /* Seitenlänge     an */
  273.       for(len=4;len<=6;len++)                       /* Ersetzen 3*     an */
  274.          OnMenu(Fenster, SHIFTMENU(4)|SHIFTITEM(len));
  275.       OnMenu(Fenster,  h|SHIFTITEM(7));             /* Block Laden     an */
  276.       OnMenu(Fenster,  h);                          /* Block Markier.  an */
  277.       OffMenu(Fenster, h|SHIFTITEM(5));             /* Mark. Löschen  aus */
  278.       OffMenu(Fenster, h|SHIFTITEM(2));             /* Block Kopieren aus */
  279.       OffMenu(Fenster, h|SHIFTITEM(3));             /* Block Löschen  aus */
  280.       OffMenu(Fenster, h|SHIFTITEM(8));             /* Block Speich.  aus */
  281.       OffMenu(Fenster, h|SHIFTITEM(10));            /* Block Drucken  aus */
  282.    }
  283. }
  284. BLaden(fname)
  285. UBYTE *fname;
  286. {
  287.    int es=se, ez=ze, ss=s, zz=z, sh, zh, blockende=FALSE;
  288.    UBYTE buf[512];
  289.  
  290.    if(++ze>SEITE) {
  291.       ze=0;
  292.       if(++se>MAS) {
  293.          ze=SEITE; se=MAS;
  294.          sprintf(buffer, "%s", FehlerText[2]);
  295.          Meldung();
  296.          return(0);
  297.       }
  298.    }
  299.    blo=3;
  300.    if(!Laden(fname)) {
  301.       se=es; ze=ez; blo=0;
  302.    }
  303.    else {
  304.       if(!(s==es && z==ez)) { /* kein bloßes Anhängen */
  305.          if(++ez>SEITE) { ez=0; es++; }
  306.          bas=es; baz=ez;
  307.          FOREVER {  /* Text scheibchenweise einfügen. 1 Scheibe <= 1 SEITE */
  308.             bes=se; bez=ze;
  309.             if(((bes-bas)*(SEITE+1)+bez-baz)>SEITE) {
  310.                bes=bas+1; if((bez=baz-1)<0) { bez=SEITE; bes--; }
  311.                sh=bes; if((zh=bez+1)>SEITE) { zh=0; sh++; }
  312.             }
  313.             else {
  314.                blockende=TRUE; zh=(se-bas)*(SEITE+1)+ze-baz;
  315.             }
  316.             meld=2; BlockEinfuegen(bas,baz,bes,bez); BlockLoeschen(bas,baz,bes,bez);
  317.             if(blockende) break;
  318.             bas=sh; baz=zh;
  319.             s++; if(--z<0) { z=SEITE; s--; }
  320.          }
  321.          for(sh=0, bes=s, bez=z; sh<=zh; sh++) {
  322.             if(++bez>SEITE) { bez=0; bes++; }
  323.          }
  324.       }
  325.       else { bes=se; bez=ze; }
  326.       meld=sicher=FALSE; blo=3; MenueUeberwachung(1); MenueUeberwachung(2);
  327.       bas=s=ss; baz=z=zz; if(++baz>SEITE) { baz=0; bas--; }
  328.       SText();
  329.       ZSDisplay();
  330.       if(str[0] == 'B') sprintf(buffer, "%s Seite %d Zeile %d!",
  331.                                 str, bes+1, bez+1);
  332.       else strcpy(buffer, str);
  333.       Meldung();
  334.    }
  335. }
  336. Textlaenge()
  337. {
  338.    int len,i, zaehler=0;
  339.  
  340.    for(len=0;len<=se;len++) {
  341.       for(i=0;i<=SEITE;i++) {
  342.          zaehler += SL(len,i) +1;
  343.          if(len==se && i==ze) break;
  344.       }
  345.    }
  346.    sprintf(buffer, "Length: %d End: page %d line %d!",
  347.        zaehler, se+1, ze+1);
  348.    meld=TRUE;
  349. }
  350. BlockEinfuegen(as,az,es,ez)
  351. int as,az,es,ez;
  352. {
  353.    int bs=se, bz=ze, ps, pz, i, st;
  354.  
  355.    if((BloPruef()==TRUE)&&(!(bes==s && bez==z))&&meld!=2) {
  356.       sprintf(buffer, "Cursor inside block!");
  357.       meld=TRUE;
  358.       return(0);
  359.    }
  360.    ze++; if(ze>SEITE) { ze=0; se++; }
  361.    i= (MAS-se )*(SEITE+1)+SEITE-ze;     /* Anzahl der freien Zeilen */
  362.    st=(es-as)*(SEITE+1)+ez-az;     /* Blocklänge     in Zeilen */
  363.    se=bs; ze=bz;
  364.    if(i<=0 || i<st) {
  365.       sprintf(buffer, "Out of memory!");
  366.       meld=TRUE;
  367.       return(0);
  368.    }
  369.    for(ps=0; ps<=st; ps++) { if(++ze>SEITE) { ze=0; se++; } }
  370.    ps=se; pz=ze;
  371.    if(!(bs==s && bz==z)) {
  372.       FOREVER {                                /* Text verschieben */
  373.          a[ps] [pz] = a[bs] [bz];
  374.          if(--bz<0) {bz=SEITE; bs--; }
  375.          if(--pz<0) {pz=SEITE; ps--; }
  376.          if(bs==s && bz==z) break;
  377.       }
  378.    }
  379.    if(s<bas || (s==bas && z<baz)) {
  380.       for(ps=0; ps<=st; ps++) {     /* Block mitverschoben ? */
  381.          if(++baz>SEITE) { baz=0; bas++; }
  382.          if(++bez>SEITE) { bez=0; bes++; }
  383.       }
  384.    }
  385.    else if(meld==2 && (s<bes || (s==bes && z<=bez))) {
  386.       for(ps=0; ps<=st; ps++) {     /* im Block mitverschoben ? */
  387.          if(++bez>SEITE) { bez=0; bes++; }
  388.       }
  389.    }
  390.    if(s<as || (s==as && z<az)) {
  391.       for(ps=0; ps<=st; ps++) {     /* Block mitverschoben ? */
  392.          if(++az>SEITE) { az=0; as++; }
  393.          if(++ez>SEITE) { ez=0; es++; }
  394.       }
  395.    }
  396.    ps=as; pz=az; bs=s; bz=z; if(++bz>SEITE) { bz=0; bs++; }
  397.    FOREVER {
  398.       st=SC(ps, pz, (i=SL(ps,pz)));
  399.       ErstBelAend(bs, bz, st, i, ps, pz);
  400.       if(ps==es && pz==ez) break;
  401.       if(++pz>SEITE) { pz=0; ps++; }
  402.       if(++bz>SEITE) { bz=0; bs++; }
  403.    }
  404.    sicher=FALSE;
  405.    if(meld==2) return(1);
  406.    SText(); ZSDisplay();
  407.    sprintf(buffer, "Block copied!");
  408.    meld=TRUE;
  409. }
  410. Schriftart(art)
  411. int art;
  412. {
  413.    int i,r;
  414.  
  415.    if(!art||laufs!=s||(laufs==s && laufz!=z)) { laufs=s; laufz=z; stil=art; }
  416.    else {
  417.       if(art&4 && !(stil&4))   stil+=4;
  418.       else if(art&4 && stil&4) stil-=4;
  419.       if(art&2 && !(stil&2))   stil+=2;
  420.       else if(art&2 && stil&2) stil-=2;
  421.       if(art&1 && !(stil&1))   stil+=1;
  422.       else if(art&1 && stil&1) stil-=1;
  423.    }
  424.    SetSoftStyle(RP, stil, AskSoftStyle(RP));
  425.    if(blo>2) BlockSchrift();
  426.    else {
  427.       i=SL(s,z); r=SC(s,z,i);
  428.       if(i-r>=x) {
  429.          SpeicherSchrift();
  430.          SetAPen(RP, 0);
  431.          RectFill(RP, 0, y*8-8, RRAND, y*8-1);
  432.          SetAPen(RP, 1);
  433.          SonderDruck(y, SL(s,z), 0);
  434.       }
  435.    }
  436. }
  437. BlockSchrift()
  438. {
  439.    int i, r, len, st, su, ss=bas, zz=baz;
  440.  
  441.    FOREVER {
  442.       r=0; su=st=SC(ss, zz, (i=SL(ss, zz)));
  443.       while(st) {
  444.          if(a[ss] [zz] [r] < 9) {
  445.             for(len=r; len<i-su+st;len++) a[ss] [zz] [len]=a[ss] [zz] [len+1];
  446.             st--;
  447.          }
  448.          else r++;
  449.       }
  450.       if(su) BelAend(ss, zz, 0, i-su, i);
  451.       if(stil) {
  452.          BelAend(ss, zz, 1, i-su+1, i-su);
  453.          for(len=i-su; len>=0; len--)
  454.             a[ss] [zz] [len+1] = a[ss] [zz] [len];
  455.          a[ss] [zz] [0] = stil;
  456.       }
  457.       if(++zz>SEITE) { zz=0; ss++; }
  458.       if(ss>bes || (ss==bes && zz>bez)) break;
  459.    }
  460.    sicher=FALSE;
  461.    SText();
  462.    ZSDisplay();
  463. }
  464. SpeicherSchrift()
  465. {
  466.    int st,i,r,o,q=0;
  467.  
  468.    oflag=FALSE;
  469.    st=SC(s, z, (i=SL(s,z)));
  470.    if(i) r=Testen(stil);
  471.    else  r=0;
  472.    if(r) {
  473.       if(a[s] [z] [x+r-2] <9) {
  474.          if(oflag) {
  475.             for(o=x-1+r; o<=i-1; o++)
  476.                a[s] [z] [o-1] = a[s] [z] [o];
  477.             a[s] [z] [i-1] = EOS; st--;
  478.             BelAend(s,z,st,i-1,i);
  479.          }
  480.          else {
  481.             o=stil; if(!stil) o=8; a[s] [z] [x+r-2] = o;
  482.          }
  483.       }
  484.       else {
  485.          if(oflag) stil = 0;
  486.          SpeicherStil(i, ++st, r);
  487.       }
  488.    }
  489.    else {
  490.       if(stil) SpeicherStil(i, ++st, r);
  491.    }
  492. }
  493. SpeicherStil(i, st, r)
  494. int i, st, r;
  495. {
  496.    int o;
  497.  
  498.    BelAend(s,z,st,i+1,i);
  499.    if(i) {
  500.       for(o=i; o>x-1+r; o--)
  501.          a[s] [z] [o] = a[s] [z] [o-1];
  502.    }
  503.    a[s] [z] [i+1] = EOS; o=stil; if(!stil) o=8;
  504.    a[s] [z] [x-1+r] = o;
  505. }
  506. Testen(vergleich)
  507. int vergleich;
  508. {
  509.    int i=0, r=0;
  510.  
  511.    oflag=FALSE; letztes = 0; if(!vergleich) vergleich=8;
  512.    while(i <= x-1+r) {
  513.       if(a[s] [z] [i] <9) {
  514.          r++;
  515.          if((letztes=a[s] [z] [i]) == vergleich) oflag = TRUE;
  516.          else oflag = FALSE;
  517.       }
  518.       i++;
  519.    }
  520.    return(r);
  521. }
  522. StilAn()
  523. {
  524.    SetSoftStyle(RP, stil, AskSoftStyle(RP));
  525. }
  526. StilAus()
  527. {
  528.    SetSoftStyle(RP,  0, AskSoftStyle(RP));
  529. }
  530.