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 / stack.c < prev    next >
C/C++ Source or Header  |  2005-02-06  |  4KB  |  133 lines

  1. /* $Id: stack.c,v 1.10 2004/09/03 21:46:23 mbroek Exp $ */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. #if defined(__WATCOMC__)
  7. #include <malloc.h>
  8. #endif
  9.  
  10. #include "makenl.h"
  11. #include "os.h"
  12. #include "fts5.h"
  13. #include "msg.h"
  14. #include "stack.h"
  15. #include "mklog.h"
  16.  
  17. #ifdef MALLOC_DEBUG
  18. #include "rmalloc.h"
  19. #endif
  20.  
  21. #ifdef DMALLOC
  22. #include "dmalloc.h"
  23. #endif
  24.  
  25. static int *NumberStackPtr = NULL;
  26. static int NStackWritePtr, NStackReadPtr, NumberListValid, NStackNotFull =
  27.     1, NumberStackLen;
  28.  
  29. static struct StackPointers
  30. {
  31.     int ReadPtr;
  32.     int WritePtr;
  33. }
  34. NStackPtrs[4];                  /* Zero initialized automatically */
  35. static char *Describe4D[] =
  36.     { "Zone", "Region or Network", "Node", "Point" };
  37.  
  38. static int MarkedNSWP, MarkedNSRP, MarkedNLV;
  39.  
  40. int addnumber(int maketype, int makenum, int markpos)
  41. {
  42.     int newlevels;
  43.     int *numberptr;
  44.     int status = 0;
  45.     int num4Dpos;
  46.     struct StackPointers *sptr;
  47.     int fillmin, fillmax, aktpos;
  48.  
  49.     num4Dpos = Level4DPos[maketype];
  50.     if (num4Dpos < NumberListValid) /* finished one Net or Node */
  51.     {
  52.         NumberListValid = num4Dpos;
  53.         NStackReadPtr = NStackPtrs[num4Dpos].ReadPtr;
  54.         NStackWritePtr = NStackPtrs[num4Dpos].WritePtr;
  55.     }
  56.     else if (num4Dpos > NumberListValid) /* need to create new level(s) */
  57.     {
  58.         sptr = NStackPtrs + NumberListValid;
  59.         newlevels = Level4DPos[maketype] - NumberListValid;
  60.         NumberListValid += newlevels;
  61.         fillmin = NStackReadPtr;
  62.         fillmax = NStackWritePtr;
  63.         do
  64.         {
  65.             sptr->ReadPtr = fillmin;
  66.             sptr->WritePtr = fillmax;
  67.             sptr++;
  68.             fillmin = fillmax;  /* Levels in between have no entries */
  69.         }
  70.         while (--newlevels);
  71.         NStackReadPtr = fillmin;
  72.     }
  73.     if (NStackReadPtr < NStackWritePtr)
  74.     {
  75.         aktpos = NStackReadPtr;
  76.         numberptr = NumberStackPtr + aktpos;
  77.         do
  78.         {
  79.             if (*numberptr == makenum)
  80.             {
  81.                 sprintf(ErrorMessage, "Duplicate %s number -- \"%d\"",
  82.                         Describe4D[NumberListValid], makenum);
  83.                 if (NumberListValid >= A_NODE)
  84.                     status = 1;
  85.                 else
  86.                     status = 2;
  87.                 break;
  88.             }
  89.             numberptr++;
  90.             aktpos++;
  91.         }
  92.         while (aktpos < NStackWritePtr);
  93.     }
  94.     if (markpos)
  95.     {
  96.         MarkedNLV = NumberListValid;
  97.         MarkedNSRP = NStackReadPtr;
  98.         MarkedNSWP = NStackWritePtr;
  99.     }
  100.     if (NStackWritePtr == NumberStackLen && NStackNotFull)
  101.     {
  102.         numberptr = realloc(NumberStackPtr, (NumberStackLen + 100) * sizeof(int));
  103.  
  104.         if (numberptr != NULL)
  105.         {
  106.             NumberStackPtr = numberptr;
  107.             NumberStackLen += 100;
  108.         }
  109.         else
  110.         {
  111.             fprintf(stderr,
  112.                     "WARNING -- Unable to allocate more space for number stack.\n");
  113.             fprintf(stderr,
  114.                     "           Duplicate number checking limited to %d numbers.\n",
  115.                     NumberStackLen);
  116.         mklog(0, "WARNING -- Unable to allocate more space for number stack");
  117.         mklog(0, "           Duplicate number checking limited to %d numbers",
  118.             NumberStackLen);
  119.             NStackNotFull = 0;
  120.         }
  121.     }
  122.     if (NStackWritePtr < NumberStackLen)
  123.         NumberStackPtr[NStackWritePtr++] = makenum;
  124.     return status;
  125. }
  126.  
  127. void unmarkstack(void)
  128. {
  129.     NumberListValid = MarkedNLV;
  130.     NStackReadPtr = MarkedNSRP;
  131.     NStackWritePtr = MarkedNSWP;
  132. }
  133.