home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / MISC / MN321SRC.ZIP / merge.c < prev    next >
C/C++ Source or Header  |  2004-07-20  |  5KB  |  172 lines

  1. /* $Id: merge.c,v 1.8 2004/07/19 14:54:20 ozzmosis Exp $ */
  2.  
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <time.h>
  6.  
  7. #include "makenl.h"
  8. #include "merge.h"
  9. #include "fts5.h"
  10. #include "msg.h"
  11. #include "fileutil.h"
  12.  
  13. #ifdef MALLOC_DEBUG
  14. #include "rmalloc.h"
  15. #endif
  16.  
  17. #ifdef DMALLOC
  18. #include "dmalloc.h"
  19. #endif
  20.  
  21. static FILE *MergeInFILE, *MergeOutFILE;
  22. static int MergeListAddr[4];
  23. static int MergeMakeAddr[4];
  24. static char MergeLine[linelength];
  25.  
  26. FILE *PrepareMerge(void)
  27. {
  28.     char (*extptr)[MYMAXEXT];
  29.     struct tm *tmptr;
  30.     int matchparts = -1;
  31.     time_t utime;
  32.     char linebuf[linelength];
  33.     int linelevel, linenum;
  34.  
  35.     if (MergeFilename[0] == 0)
  36.         return 0;
  37.     if (MyAddress[A_NET] == 0)
  38.     {
  39. #ifdef BENS_TYPOS
  40.         fprintf(stderr,
  41.                 "WARNING - Your Net or Region number is unknown, Merge cnacled\n");
  42. #else
  43.         fprintf(stderr,
  44.                 "WARNING - Your Net or Region number is unknown, Merge cancelled\n");
  45. #endif
  46.         return 0;
  47.     }
  48.     for (extptr = OldExtensions; extptr < OldExtensions + 3; extptr++)
  49.     {
  50.         swapext(MergeFilename, MergeFilename, *extptr);
  51.         MergeInFILE = fopen(MergeFilename, "rb");
  52.         if (MergeInFILE)
  53.             break;
  54.     }
  55.     if (MergeInFILE)
  56.     {
  57.         swapext(MergeFilename, MergeFilename, "999");
  58.         MergeOutFILE = fopen(MergeFilename, "wb");
  59.         if (!MergeOutFILE)
  60.             die(254, 1, "Unable to create \"%s\"", MergeFilename);
  61.         fgets(linebuf, linelength, MergeInFILE);
  62.         time(&utime);
  63.         tmptr = localtime(&utime);
  64.         fprintf(MergeOutFILE,
  65.                 ";A Local NODELIST update for %s, %s %d, %d\r\n",
  66.                 DOWLongnames[tmptr->tm_wday],
  67.                 MonthLongnames[tmptr->tm_mon], tmptr->tm_mday,
  68.                 tmptr->tm_year + 1900);
  69.     }
  70.     if (!MergeInFILE)
  71.     {
  72.         swapext(MergeFilename, MergeFilename, NULL); /* Kill any extension */
  73.  
  74.         fprintf(stderr, "Unable to find distribution file \"%s\"\n",
  75.           MergeFilename);
  76.         fputs("less than 3 weeks old.  Processing continues without merging.\n",
  77.           stderr);
  78.  
  79.         return 0;
  80.     }
  81.     MergeMakeAddr[A_ZONE] = MergeListAddr[A_ZONE] = MyAddress[A_ZONE];
  82.     MergeMakeAddr[A_NET] = MergeListAddr[A_NET] = MyAddress[A_NET];
  83.     MergeMakeAddr[Level4DPos[MakeType]] =
  84.         MergeListAddr[Level4DPos[MakeType]] = MakeNum;
  85.     if (fgets(linebuf, linelength, MergeInFILE) == NULL)
  86.     {
  87.         fclose(MergeInFILE);
  88.         MergeInFILE = NULL;
  89.         return MergeOutFILE;
  90.     }
  91.     do
  92.     {
  93.         if (linebuf[0] == '\x1A')
  94.         {
  95.             fclose(MergeInFILE);
  96.             MergeInFILE = NULL;
  97.             return MergeOutFILE;
  98.         }
  99.         strcpy(MergeLine, linebuf);
  100.         ParseFTS5(linebuf, &linelevel, &linenum);
  101.         if (Level4DPos[linelevel] <= matchparts)
  102.             return MergeOutFILE;
  103.         if (Level4DPos[linelevel] <= Level4DPos[MakeType])
  104.         {
  105.             switch (Level4DPos[linelevel])
  106.             {
  107.             case A_NODE:
  108.                 MergeListAddr[A_NODE] = linenum;
  109.                 break;
  110.             case A_ZONE:
  111.                 MergeListAddr[A_ZONE] = linenum;
  112.                 if (MergeMakeAddr[A_ZONE] == 0)
  113.                 {
  114.                     MergeMakeAddr[A_ZONE] = linenum;
  115.                     fprintf(stderr,
  116.                             "WARNING - Your Zone is unknown, assuming Zone %d for merge\n",
  117.                             MergeMakeAddr[A_ZONE]);
  118.                 }
  119.                 /* FALLTHROUGH */
  120.             case A_NET:
  121.                 MergeListAddr[A_NET] = linenum;
  122.                 MergeListAddr[A_NODE] = 0;
  123.             }
  124.             while (matchparts < Level4DPos[linelevel] &&
  125.                    MergeMakeAddr[matchparts + 1] ==
  126.                    MergeListAddr[matchparts + 1])
  127.                 matchparts++;
  128.             if (Level4DPos[MakeType] == matchparts)
  129.             {
  130.                 /* Found the part to replace... */
  131.                 if (MakeType == LEVEL_NODE)
  132.                 {
  133.                     fgets(MergeLine, linelength, MergeInFILE);
  134.                     return MergeOutFILE;
  135.                 }
  136.                 if (++linelevel <= MakeType)
  137.                     return MergeOutFILE;
  138.                 while (fgets(linebuf, linelength, MergeInFILE) != NULL)
  139.                 {
  140.                     strcpy(MergeLine, linebuf);
  141.                     ParseFTS5(linebuf, &linelevel, &linenum);
  142.                     if (linelevel <= MakeType)
  143.                         return MergeOutFILE;
  144.                 }
  145.                 break;
  146.             }
  147.         }
  148.         fputs(MergeLine, MergeOutFILE);
  149.     }
  150.     while (fgets(linebuf, linelength, MergeInFILE) != NULL);
  151.     fclose(MergeInFILE);
  152.     MergeInFILE = NULL;
  153.     return MergeOutFILE;
  154. }
  155.  
  156. void FinishMerge(void)
  157. {
  158.     if (!MergeOutFILE)
  159.         return;
  160.     while (MergeInFILE)
  161.     {
  162.         fputs(MergeLine, MergeOutFILE);
  163.         if (fgets(MergeLine, linelength, MergeInFILE) == NULL)
  164.         {
  165.             fclose(MergeInFILE);
  166.             MergeInFILE = NULL;
  167.         }
  168.     }
  169.     fclose(MergeOutFILE);
  170.     MergeOutFILE = NULL;
  171. }
  172.