home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / SRC / TO_PORT / compfacelib.lzh / file.c < prev    next >
C/C++ Source or Header  |  1992-04-30  |  3KB  |  159 lines

  1. /*
  2.  *  Compface - 48x48x1 image compression and decompression
  3.  *
  4.  *  Copyright (c) James Ashton - Sydney University - June 1990.
  5.  *
  6.  *  Written 11th November 1989.
  7.  *
  8.  *  Permission is given to distribute these sources, as long as the
  9.  *  copyright messages are not removed, and no monies are exchanged. 
  10.  *
  11.  *  No responsibility is taken for any errors on inaccuracies inherent
  12.  *  either to the comments or the code of this program, but if reported
  13.  *  to me, then an attempt will be made to fix them.
  14.  */
  15.  
  16. #include "compface.h"
  17.  
  18. void BigRead(fbuf)
  19. register char *fbuf;
  20. {
  21.     register int c;
  22.  
  23.     while (*fbuf != '\0')
  24.     {
  25.         c = *(fbuf++);
  26.         if ((c < FIRSTPRINT) || (c > LASTPRINT))
  27.             continue;
  28.         BigMul(NUMPRINTS);
  29.         BigAdd((WORD)(c - FIRSTPRINT));
  30.     }
  31. }
  32.  
  33. void BigWrite(fbuf)
  34. register char *fbuf;
  35. {
  36.     static WORD tmp;
  37.     static char buf[DIGITS];
  38.     register char *s;
  39.     register int i;
  40.  
  41.     s = buf;
  42.     while (B.b_words > 0)
  43.     {
  44.         BigDiv(NUMPRINTS, &tmp);
  45.         *(s++) = tmp + FIRSTPRINT;
  46.     }
  47.     i = 7;    /* leave room for the field name on the first line */
  48.     *(fbuf++) = ' ';
  49.     while (s-- > buf)
  50.     {
  51.         if (i == 0)
  52.             *(fbuf++) = ' ';
  53.         *(fbuf++) = *s;
  54.         if (++i >= MAXLINELEN)
  55.         {
  56.             *(fbuf++) = '\n';
  57.             i = 0;
  58.         }
  59.     }
  60.     if (i > 0)
  61.         *(fbuf++) = '\n';
  62.     *(fbuf++) = '\0';
  63. }
  64.  
  65. void ReadFace(fbuf)
  66. char *fbuf;
  67. {
  68.     register int c, i;
  69.     register char *s, *t;
  70.  
  71.     t = s = fbuf;
  72.     for(i = strlen(s); i > 0; i--)
  73.     {
  74.         c = (int)*(s++);
  75.         if ((c >= '0') && (c <= '9'))
  76.         {
  77.             if (t >= fbuf + DIGITS)
  78.             {
  79.                 status = ERR_EXCESS;
  80.                 break;
  81.             }
  82.             *(t++) = c - '0';
  83.         }
  84.         else if ((c >= 'A') && (c <= 'F'))
  85.         {
  86.             if (t >= fbuf + DIGITS)
  87.             {
  88.                 status = ERR_EXCESS;
  89.                 break;
  90.             }
  91.             *(t++) = c - 'A' + 10;
  92.         }
  93.         else if ((c >= 'a') && (c <= 'f'))
  94.         {
  95.             if (t >= fbuf + DIGITS)
  96.             {
  97.                 status = ERR_EXCESS;
  98.                 break;
  99.             }
  100.             *(t++) = c - 'a' + 10;
  101.         }
  102.         else if (((c == 'x') || (c == 'X')) && (t > fbuf) && (*(t-1) == 0))
  103.             t--;
  104.     }
  105.     if (t < fbuf + DIGITS)
  106.         longjmp(comp_env, ERR_INSUFF);
  107.     s = fbuf;
  108.     t = F;
  109.     c = 1 << (BITSPERDIG - 1);
  110.     while (t < F + PIXELS)
  111.     {
  112.         *(t++) = (*s & c) ? 1 : 0;
  113.         if ((c >>= 1) == 0)
  114.         {
  115.             s++;
  116.             c = 1 << (BITSPERDIG - 1);
  117.         }
  118.     }
  119. }
  120.  
  121. void WriteFace(fbuf)
  122. char *fbuf;
  123. {
  124.     register char *s, *t;
  125.     register int i, bits, digits, words;
  126.  
  127.     s = F;
  128.     t = fbuf;
  129.     bits = digits = words = i = 0;
  130.     while (s < F + PIXELS)
  131.     {
  132.         if ((bits == 0) && (digits == 0))
  133.         {
  134.             *(t++) = '0';
  135.             *(t++) = 'x';
  136.         }
  137.         if (*(s++))
  138.             i = i * 2 + 1;
  139.         else
  140.             i *= 2;
  141.         if (++bits == BITSPERDIG)
  142.         {
  143.             *(t++) = *(i + HexDigits);
  144.             bits = i = 0;
  145.             if (++digits == DIGSPERWORD)
  146.             {
  147.                 *(t++) = ',';
  148.                 digits = 0;
  149.                 if (++words == WORDSPERLINE)
  150.                 {
  151.                     *(t++) = '\n';
  152.                     words = 0;
  153.                 }
  154.             }
  155.         }
  156.     }
  157.     *(t++) = '\0';
  158. }
  159.