home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / MISC / MN325SRC.ZIP / makenl-3.2.5 / src / merge.c < prev    next >
C/C++ Source or Header  |  2005-02-06  |  6KB  |  177 lines

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