home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / MISC / MNLDOS.ZIP / src / stack.c < prev    next >
C/C++ Source or Header  |  2004-07-16  |  3KB  |  129 lines

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