home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / PROGRAMS / LIST / EP-MISC.ARK / FMERGE.C < prev    next >
Text File  |  1988-05-21  |  6KB  |  298 lines

  1. /*
  2.     Fmerge
  3.             Greg Lee, Oct '84.
  4. */
  5.  
  6. #include <bdscio.h>
  7.  
  8.  
  9. #define FF 0x0c        /* formfeed character, or zero if not supported */
  10. #define ESC    0x1B
  11. #define    FTSIZE     24000
  12.  
  13.  
  14. /* masks for mode bits */
  15. #define ELITE     0x01
  16. #define PRPTNL     0x02
  17. #define CMPRSSD  0x04
  18. #define EMPHSZD  0x08
  19. #define DBLSTRK  0x10
  20. #define EXPNDD     0x20
  21. #define UNDRLN     0x40
  22. #define ITALIC     0x80
  23. /*    So that's b0-b7; b8,b9,b10 are used for the
  24.     current graphics font, which is 'fo'-1.        */
  25. #define SUPSCRPT 0x0800
  26. #define SUBSCRPT 0x1000
  27. #define BENT     0x2000
  28. #define TALL     0x4000
  29. #define IGNORE     0x8000
  30. /*    All bits are committed                */
  31.  
  32.  
  33. #define TOPROW  0
  34. #define    BOTROW  23
  35. #define    LEFTCOL  0
  36. #define    RIGHTCOL  79
  37.  
  38.  
  39.  
  40. char    cmd, currch, edfnum, cch, cbyte, cbyteo, screen, mxflag;
  41. int    col, row, currlen, currfont;
  42.  
  43. char    ckeep[6][80], gxoff, gyoff, ib;
  44.  
  45. int colno;
  46.  
  47. int i, fd;
  48. char ftname[30], ftname2[30], *fname;
  49.  
  50.  
  51. char  duplflag, ovlflag;
  52. int fix[128];
  53. char  ft[FTSIZE];
  54.  
  55. int fix2[128];
  56. char ft2[FTSIZE];
  57.  
  58.  
  59. main(argc,argv)
  60. char **argv;
  61. {
  62.  
  63.     ovlflag = FALSE;
  64.     currlen = 0;
  65.     currfont = FALSE;
  66.  
  67.     if (argc-1)
  68.      {
  69.         fname = *++argv;
  70.         argc--;
  71.         strcpy(ftname, fname);
  72.         strcat(ftname,".FN2");
  73.      } else usage();
  74.     if (argc-1)
  75.      {
  76.         fname = *++argv;
  77.         argc--;
  78.         strcpy(ftname2, fname);
  79.         strcat(ftname2,".FN2");
  80.      } else usage();
  81.  
  82.     openwork();
  83.     tokeep();
  84.  
  85.     chkdupl();
  86.     currch = duplflag? ' ' : 1;
  87.  
  88.  
  89.     for ( ; ; currch++)
  90.     {    currfont = TRUE;
  91.         tokeep();
  92.         currfont = FALSE;
  93.         if (currlen) fromkeep();
  94.         if (ovlflag) abort("out of memory");
  95.         if (duplflag && currch > '_') break;
  96.         if (currch > '~') break;
  97.     }
  98.  
  99.  
  100.     savefnt();
  101.  
  102.  
  103. }  /* End main */
  104.  
  105.  
  106. usage()
  107. {    puts("need 2 font names\n");
  108.     exit(0);
  109. }
  110.  
  111. abort(s)
  112. char *s;
  113. {    puts(s);
  114.     exit(0);
  115. }
  116.  
  117. openwork()
  118. {    int fdft, i, ftrecs;
  119.  
  120.     setmem(ft, FTSIZE, 0);
  121.     setmem(fix, 128, 0);
  122.     setmem(ft2, FTSIZE, 0);
  123.     setmem(fix2, 128, 0);
  124.  
  125.     if ((fdft = open(ftname,0)) == ERROR) abort("no font"); else
  126.     {
  127.         if (read(fdft, fix, 2) != 2)
  128.         abort("bad font");
  129.  
  130.     /* only read enough of the font to get info for char's
  131.         up to ascii nul (which is not used)        */
  132.     ftrecs = (fix[127]+127)/128;
  133.  
  134.         if (read(fdft, ft, ftrecs) != ftrecs)
  135.         {puts("bad font"); exit(ERROR);}
  136.         fabort(fdft);
  137.         if (ftrecs > FTSIZE/128) ovlflag = TRUE;
  138.     }
  139.  
  140.     if (ovlflag) abort("no room");
  141.  
  142.     if ((fdft = open(ftname2,0)) == ERROR) abort("no font"); else
  143.     {
  144.         if (read(fdft, fix2, 2) != 2)
  145.         abort("bad font");
  146.  
  147.     /* only read enough of the font to get info for char's
  148.         up to ascii nul (which is not used)        */
  149.     ftrecs = (fix2[127]+127)/128;
  150.  
  151.         if (read(fdft, ft2, ftrecs) != ftrecs)
  152.         abort("bad font");
  153.         fabort(fdft);
  154.     }
  155.  
  156.     chkdupl();
  157. }
  158.  
  159. savefnt()
  160. {    int fdft, i, ftrecs;
  161.  
  162.   if (currfont)
  163.   {
  164.     if ((fdft = creat(ftname2)) == ERROR)
  165.         {abort("can't save"); return;}
  166.     if (write(fdft, fix2, 2) != 2)
  167.         {abort("save error"); return;}
  168.  
  169.     /* only write enough of the font to get info for char's
  170.         up to ascii nul (which is not used)        */
  171.     ftrecs = (fix2[127]+127)/128;
  172.  
  173.     if (write(fdft, ft2, ftrecs) != ftrecs)
  174.         {abort("save error"); return;}
  175.     if (close(fdft) == ERROR)
  176.         abort("can't close");
  177.   }
  178.   else
  179.   {
  180.     if ((fdft = creat(ftname)) == ERROR)
  181.         {abort("can't save"); return;}
  182.     if (write(fdft, fix, 2) != 2)
  183.         {abort("save error"); return;}
  184.  
  185.     /* only write enough of the font to get info for char's
  186.         up to ascii nul (which is not used)        */
  187.     ftrecs = (fix[127]+127)/128;
  188.  
  189.     if (write(fdft, ft, ftrecs) != ftrecs)
  190.         {abort("save error"); return;}
  191.     if (close(fdft) == ERROR)
  192.         abort("can't close");
  193.   }
  194.  
  195.  
  196. }
  197.  
  198.  
  199.  
  200. tokeep()
  201. {
  202.     tokepp(0, currch);
  203.     if (duplflag) tokepp(3, dtrans(currch, FALSE));
  204. }
  205.  
  206. tokepp(ib, currch)
  207. char ib, currch;
  208. {    int i, j, cbase;
  209.  
  210.     if (currfont)
  211.     {
  212.         cbase = fix2[currch];
  213.         currlen = (fix2[currch+1] - cbase) / 3;
  214.     }
  215.     else
  216.     {
  217.         cbase = fix[currch];
  218.         currlen = (fix[currch+1] - cbase) / 3;
  219.     }
  220.  
  221.     if (currlen > 80) currlen = 80;
  222.     for (i = 0; i < 3; i++)
  223.      for (j = 0; j < 80; j++)
  224.       if (j >= currlen) ckeep[ib+i][j] = 0;
  225.        else if (currfont) ckeep[ib+i][j] = ft2[cbase + j + i*currlen];
  226.                else  ckeep[ib+i][j] =  ft[cbase + j + i*currlen];
  227. }
  228.  
  229.  
  230. fromkeep()
  231. {
  232.     frommkeep(0,currch);
  233.     if (duplflag) frommkeep(3, dtrans(currch, FALSE));
  234. }
  235.  
  236. frommkeep(ib, currch)
  237. char ib, currch;
  238. {    int i, j, cend, cbase, cnext, mlen;
  239.  
  240.     if (currfont)
  241.     {
  242.         cbase = fix2[currch];
  243.         cnext = fix2[currch+1];
  244.     }
  245.     else
  246.     {
  247.         cbase = fix[currch];
  248.         cnext = fix[currch+1];
  249.     }
  250.  
  251.     cend = cbase + currlen * 3;
  252.     mlen = (cend-cnext) ? (ovlflag?
  253.                  (2*FTSIZE):FTSIZE)
  254.                 - 1 - max(cnext,cend)
  255.                   : 0;
  256.  
  257.     if (mlen)
  258.     if (currfont)
  259.     {    movmem(ft2+cnext, ft2+cend, mlen); 
  260.          for (i = currch+1; i < 128; i++)
  261.             fix2[i] = fix2[i] + cend - cnext;
  262.     }
  263.     else
  264.     {    movmem(ft+cnext, ft+cend, mlen); 
  265.          for (i = currch+1; i < 128; i++)
  266.             fix[i] = fix[i] + cend - cnext;
  267.         if (fix[127] >= FTSIZE) ovlflag = TRUE;
  268.     }
  269.  
  270.     if (currlen)
  271.     for (i = 0; i < 3; i++)
  272.      for (j = 0; j < currlen; j++)
  273.         if (currfont)
  274.             ft2[cbase + j + i*currlen] = ckeep[ib+i][j];
  275.         else     ft[cbase + j + i*currlen] = ckeep[ib+i][j];
  276. }
  277.  
  278. dtrans(c, upper)
  279. char c, upper;
  280. {    if (c == 0x20 || c == 0x5F) return(c);
  281.  
  282.     if (c >= 0x60) c -= 0x20;
  283.     else if (c < 0x20) c += 0x20;
  284.  
  285.     if (upper) return(c);
  286.  
  287.     if (c < 0x40) c -= 0x20;
  288.     else c += 0x20;
  289.  
  290.     return(c);
  291. }
  292.  
  293.  
  294. chkdupl()
  295. {
  296.     duplflag = (currfont ? fix2[0] : fix[0]) & PRPTNL;
  297. }
  298.