home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / program / c / gpr140s / textmem.c < prev    next >
C/C++ Source or Header  |  1994-09-10  |  6KB  |  171 lines

  1. /*********************************************************/
  2. /* textmem.c                                             */
  3. /* Text laden und gemaess den Benutzerwuenschen umformen */
  4. /*********************************************************/
  5. #include <portab.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <osbind.h>
  9. #include <vdibind.h>
  10. #include <aesbind.h>
  11. #include "gprint.h"
  12. #include "gdos.h"
  13.  
  14. extern long load_datei (const char *name, unsigned long *laenge,
  15.                         unsigned long *z_mem);
  16.  
  17. long text_laden      (const char *text_name, unsigned long *laenge);
  18. void text_relozieren (char *text_anfang, unsigned long *laenge,
  19.                       unsigned long zmemory);
  20. /**********************************************************/
  21. /* Einsprungpunkt in dieses Modul. Von hier aus wird der  */
  22. /* Text geladen und anschliessend entsprechend der        */
  23. /* Benutzerwuensche (Umlaute, Tab-> SPACE usw.)           */
  24. /* modifiziert.                                           */
  25. /**********************************************************/
  26. long text_laden(const char *text_name, unsigned long *laenge)
  27. {
  28.   unsigned long mem, len, zmemory;
  29.  
  30.   mem = load_datei(text_name, &len, &zmemory);
  31.   text_relozieren((char *)mem, (unsigned long *)&len, zmemory);
  32.   *laenge = len;
  33.  
  34.   return mem;
  35.  
  36. } /* text_laden() */
  37.  
  38. /***********************************************************/
  39. /* Den geladenen Text umformen
  40.    Folgende Moeglichkeiten:
  41.    Tab in SPACE umwandeln, Umlaute ersetzen, Absaetze neu formatieren
  42.    Diese Dinge koennen beliebig gemischt auftreten.
  43.    Dabei wird der Text von der ersten Speicherposition immer weiter
  44.    nach unten verschoben.
  45. ***********************************************************/
  46. void text_relozieren(char *text_anfang, unsigned long *laenge, unsigned long zusaetz_mem)
  47. {
  48.   unsigned int count;
  49.   unsigned char *ptext1, *ptext2;
  50.  
  51.   ptext1 = (unsigned char *)(text_anfang + 1024);
  52.   ptext2 = (unsigned char *)(text_anfang + zusaetz_mem);
  53.  
  54.   if(PF.tab2space && !PF.umlaut_ers)
  55.   {
  56.     do
  57.     {
  58.       switch(*ptext2)
  59.       {
  60.         case 9   :  for(count = 1; count <= PF.tabspace; count++)
  61.                       *ptext1++ = ' ';
  62.                     break;
  63.         default  :  *ptext1++ = *ptext2;
  64.       }
  65.       ptext2++;
  66.     } while((char *)ptext2 < (char *)(text_anfang + *laenge + zusaetz_mem));
  67.     *laenge = (char *)ptext1 - (char *)text_anfang - 1024;
  68.   }
  69.  
  70.   if(PF.umlaut_ers)   /* Umlaute ersetzen */
  71.   {
  72.     do
  73.     {
  74.       switch(*ptext2)
  75.       {
  76.         case 142 :  *ptext1++ = 'A'; *ptext1++ = 'e';
  77.                     break;
  78.         case 132 :  *ptext1++ = 'a'; *ptext1++ = 'e';
  79.                     break;
  80.         case 153 :  *ptext1++ = 'O'; *ptext1++ = 'e';
  81.                     break;
  82.         case 148 :  *ptext1++ = 'o'; *ptext1++ = 'e';
  83.                     break;
  84.         case 154 :  *ptext1++ = 'U'; *ptext1++ = 'e';
  85.                     break;
  86.         case 129 :  *ptext1++ = 'u'; *ptext1++ = 'e';
  87.                     break;
  88.         case 158 :  *ptext1++ = 's'; *ptext1++ = 's';
  89.                     break;
  90.         case 9   :  if(PF.tab2space)             /* auch TAB's ersetzen ? */
  91.                     {
  92.                       for(count = 1; count <= PF.tabspace; count++)
  93.                         *ptext1++ = ' ';
  94.                     }
  95.                     break;
  96.         default  :  *ptext1++ = *ptext2;         /* sonst uebernehmen     */
  97.       }
  98.       ptext2++;
  99.     } while((char *)ptext2 < (char *)(text_anfang + zusaetz_mem + *laenge));
  100.     *laenge = ((char *)ptext1 - (char *)text_anfang) - 1024;
  101.   }
  102.  
  103.   if(!PF.tab2space && !PF.umlaut_ers)          /* fuer Absatzformatierung */
  104.   {
  105.     ptext1 = (unsigned char *)text_anfang + 1024;
  106.     ptext2 = (unsigned char *)(text_anfang + zusaetz_mem);
  107.     do
  108.     {
  109.       *ptext1++ = *ptext2++;
  110.     } while((char *)ptext2 < (char *)(text_anfang + zusaetz_mem + *laenge));
  111.   }
  112.  
  113.   if(PF.absatz)                            /* Absaetze neu formatieren */
  114.   {
  115.     /* Ende eines Absatzes: Return + SPACE
  116.                             Return + Return
  117.        Zeilenende         : 0xD 0xA   =>    \r\n
  118.     */
  119.     unsigned char *cp;
  120.     unsigned int  *ip, iz;
  121.     unsigned long *lp;
  122.  
  123.     ptext1 = (unsigned char *)text_anfang;
  124.     ptext2 = (unsigned char *)(text_anfang + 1024);
  125.     do
  126.     {
  127.       switch(*ptext2)
  128.       {
  129.         case 0xD :                            /* Zeilenende?            */
  130.           cp = ptext2;
  131.           ip = (unsigned int *)ptext2;
  132.           lp = (unsigned long *)ptext2;
  133.  
  134.           if(*lp == 0x0D0A0D0AL)     /* zwei Zeilenenden hintereinander */
  135.           {
  136.             lp++;                             /* ueberspringen          */
  137.             *ptext1++ = 0x00;                 /* Stringende eintragen   */
  138.             *ptext1++ = 0x0A;                 /* Leerzeile              */
  139.             ptext2 = (unsigned char *)lp;     /* weiterkopieren ab hier */
  140.             break;
  141.           }
  142.           if(*ip == 0x0D0A)                   /* Zeilenende             */
  143.           {
  144.             *ptext1++ = 0x20;                /* sonst kein Zwischenraum */
  145.             ip++;                             /* Zeilenende uebergehen  */
  146.             ptext2 = (unsigned char *)ip;     /* hier gehts weiter      */
  147.             if(*ptext2 == 0x20)    /* beginnt naechste Zeile mit SPACE? */
  148.             {
  149.               *ptext1++ = 0x0;                /* Stringende markieren   */
  150.               break;
  151.             }
  152.           }
  153.           break;
  154.         default  :  *ptext1++ = *ptext2++;        /* sonst uebernehmen  */
  155.       }
  156.     } while((char *)ptext2 < (char *)(text_anfang + 1024 + *laenge));
  157.     *ptext1 = 0x0;
  158.     *laenge = (char *)ptext1 - (char *)text_anfang;
  159.   }
  160.   else                                     /* keine Absatzformatierung  */
  161.   {
  162.     ptext1 = (unsigned char *)text_anfang; /* Text an Bereichsanfang kopieren */
  163.     ptext2 = (unsigned char *)(text_anfang + 1024);
  164.     do
  165.     {
  166.       *ptext1++ = *ptext2++;
  167.     } while((char *)ptext2 < (char *)(text_anfang + 1024 + *laenge));
  168.   }
  169.  
  170. } /* text_reolozieren() */
  171.