home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / hamradio / 7plus202.zip / 7PL2SRC.LZH / REBUILD.C < prev    next >
C/C++ Source or Header  |  1992-06-09  |  2KB  |  123 lines

  1. #include "7plus.h" 
  2. #include "globals.h"
  3.  
  4. int rebuild (char *line, int flag)
  5. {
  6.   char buf[100], *p;
  7.   uint cs1, cs2, _cs1, _cs2, xcrc;
  8.   int oldcode, c_line, cflag, len, sw, i, j, k, end, end2, count;
  9.  
  10.   p = buf;
  11.   oldcode = 0;
  12.  
  13.   sw = cflag = count = oldcode = 0;
  14.   _cs1 = _cs2 = xcrc = 0;
  15.  
  16.   len = (int) strlen (line);
  17.  
  18.   if (flag)
  19.   {
  20.     oldcode = code[215];
  21.     code[215] = 32;
  22.   }
  23.  
  24.   end2 = 216;
  25.   end = -1;
  26.  
  27.   if (len == 69)
  28.     sw  = 1;
  29.  
  30.   if (len == 70)
  31.     sw  = 2;
  32.  
  33.   if (len == 71)
  34.   {
  35.     end = -2;
  36.     end2 = 1;
  37.     sw  = 4;
  38.   }
  39.   if (!sw)
  40.     return (0);
  41.  
  42.   /* Try each character in line */
  43.   for (j=66;j>end;j--)
  44.   {
  45.     fflush (stdout);
  46.     if (sw == 1)
  47.     {
  48.       if (j)
  49.         strncpy (p, line, j);
  50.       strncpy (p+j+1, line+j, 71-j);
  51.       p[71] = EOS;
  52.     }
  53.     if (sw == 2)
  54.       strcpy (buf, line);
  55.  
  56.     if (sw == 4)
  57.     {
  58.       strcpy (p, line);
  59.       strncpy (p+j+1, line+j+2, 70-j);
  60.       p[71] = EOS;
  61.     }
  62.  
  63.     if (!cflag)
  64.     {
  65.       crc2 (&_cs1, p);
  66.       cflag++;
  67.     }
  68.  
  69.     if (j<66)
  70.       xcrc = crctab[xcrc>>8] ^ (((xcrc&255)<<8) | (byte)p[j+1]);
  71.  
  72.     for (k=0;k<end2;k++)
  73.     {
  74.       count++;
  75.       if (sw & 3)
  76.         p[j] = code[k];
  77.  
  78.       if (sw == 4)
  79.       {
  80.         cs1 = 0;
  81.         for (i=66; i>-1;i--)
  82.           cs1 = crctab[cs1>>8] ^ (((cs1&255)<<8) | (byte)p[i]);
  83.       }
  84.       else
  85.       {
  86.         cs1 = xcrc;
  87.         for (i=j; i>-1;i--)
  88.           cs1 = crctab[cs1>>8] ^ (((cs1&255)<<8) | (byte)p[i]);
  89.       }
  90.  
  91.       if (_cs1 == (cs1 & 0x7fff))
  92.       {
  93.         if (!flag)
  94.         {
  95.           /* Get line number and crc from code line */
  96.           crc_n_lnum (&_cs2, &c_line, p);
  97.           cs2 = 0;
  98.           for (i=0; i<64; i++)
  99.             cs2 = crctab[cs2>>8] ^ (((cs2&255)<<8) | (byte)p[i]);
  100.           cs2 &= 0x3fff; /* strip calculated CRC to 14 bits */
  101.         }
  102.         else
  103.         {
  104.           if (!mcrc(p, 0))
  105.             continue;
  106.           else
  107.             _cs2 = cs2 = 0;
  108.         }
  109.         if (_cs2 == cs2)
  110.         {
  111.           strcpy (line, buf);
  112.           if (flag)
  113.             code[215] = oldcode;
  114.           return (1);
  115.         }
  116.       }
  117.     }
  118.   }
  119.   if (flag)
  120.     code[215] = oldcode;
  121.   return (0);
  122. }
  123.