home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_C / CL187A.ZIP / WINIT.CPP < prev    next >
C/C++ Source or Header  |  1994-03-15  |  3KB  |  149 lines

  1. /*
  2.     winit.cpp  --  read/write configuration-initialization files
  3. */
  4.  
  5. #include <ctype.h>
  6.  
  7. #ifndef winit_h
  8. #include "winit.h"
  9. #endif
  10.  
  11. #ifdef _MSC_VER
  12.     #define STRNICMP _strnicmp
  13. #else
  14.     #define STRNICMP strnicmp
  15. #endif
  16.  
  17.  
  18. int WINIT::setBuf(char * secAndOrParamEq)
  19. {
  20.     if (sec || !secAndOrParamEq)
  21.         return 0;
  22.     if (secAndOrParamEq[0] == '[')  {
  23.         strcpy(buf,secAndOrParamEq);
  24.         sectionLength = (strchr(buf,']') - buf) + 1;
  25.         return 1;
  26.     }
  27.     else if (sectionLength)  {
  28.         strcpy(&buf[sectionLength],secAndOrParamEq);
  29.         return 1;
  30.     }
  31.     return 0;
  32. }
  33.  
  34. int WINIT::sectionParameterCompare(const char * S1, const char * S2)
  35. {
  36.     int S1Len = strchr(S1,'=') - (char *) S1;
  37.     int S2Len = strchr(S2,'=') - (char *) S2;
  38.     int i = STRNICMP(S1,S2,(S1Len>S2Len)?S1Len:S2Len);
  39.     return i;
  40. }
  41.  
  42. int WINIT::put(ostream& os)
  43. {
  44.     // see ~WINIT for assumed conditions
  45.     strcpy(buf,top());
  46.     buf[sectionLength=(strchr(buf,']')-buf)+1] = '\0';
  47.     os << buf << endl;
  48.     for (setCurNode(); next(); )  {
  49.         if (STRNICMP(buf,get(),sectionLength))  {
  50.             strcpy(buf,get());
  51.             buf[sectionLength=(strchr(buf,']')-buf)+1] = '\0';
  52.             os << endl << buf << endl;
  53.         }
  54.         os << &(get()[sectionLength]) << endl;
  55.     }
  56.     return 1;
  57. }
  58.  
  59. int WINIT::get(istream& is)
  60. {
  61.     char * S;
  62.     sectionLength = 0;
  63.     while (is.getline(&buf[sectionLength],sizeof(buf)-sectionLength))  {
  64.         if ((S = strchr(&buf[sectionLength],']')) != 0)  {
  65.             strcpy(buf,&buf[sectionLength]);
  66.             sectionLength = (S - buf) - sectionLength + 1;
  67.             continue;
  68.         }
  69.         // If text doesn't begin in the first column it's ignored!
  70.         if (isspace(buf[sectionLength]) || !buf[sectionLength])
  71.             continue;
  72.         if (sec) if (STRNICMP(sec,buf,sectionLength))
  73.             continue;
  74.         insQNew(buf);
  75.     }
  76.     return 1;
  77. }
  78.  
  79. WINIT::WINIT(const char * fileName, const char * section)
  80.     : CL_char(defaultConstruct)
  81. {
  82.     sec = section;
  83.     setMaxNodes();
  84.     dirty = !load(fname=fileName);
  85.     setFlags(CL_ANDS);
  86.     setCmP(sectionParameterCompare);
  87.     buf[0] = '\0';    // clear buf for get/setValue
  88.     sectionLength = 0;
  89. }
  90.  
  91. char * WINIT::getValue(char * secAndOrParamEq,
  92.     char * defVal)
  93. {
  94.     if (!setBuf(secAndOrParamEq))
  95.         return 0;
  96.     if (findFirst(buf))
  97.         return (strchr(get(),'=')+1);
  98.     return defVal;
  99. }
  100.  
  101. char * WINIT::operator[](char * secAndOrParamEqOptDefVal)
  102. {
  103.     if (!secAndOrParamEqOptDefVal)
  104.         return 0;
  105.     if (strpbrk(secAndOrParamEqOptDefVal,"]="))  {
  106.         char * S = strchr(secAndOrParamEqOptDefVal,'=');
  107.         if (S) if (!*++S) S = 0;
  108.         return getValue(secAndOrParamEqOptDefVal,S);
  109.     }
  110.     return 0;
  111. }
  112.  
  113. void WINIT::setValue(char * secAndOrParamEq, char * value)
  114. {
  115.     if (!setBuf(secAndOrParamEq))
  116.         return;
  117.     if (value)
  118.         strcpy(strchr(buf,'=')+1,value);
  119.     else
  120.         return;
  121.     if (findFirst(buf)) {
  122.         if (atPutNew(CurNode(),buf))
  123.             dirty = 1;
  124.     }
  125.     else if (insSortNew(buf))
  126.         dirty = 1;
  127. }
  128.  
  129. WINIT& WINIT::operator<<(char * secAndOrParamEqOptAndOrVal)
  130. {
  131.     if (!secAndOrParamEqOptAndOrVal)
  132.         return *this;
  133.     if (strpbrk(secAndOrParamEqOptAndOrVal,"]="))  {
  134.         char * S = strchr(secAndOrParamEqOptAndOrVal,'=');
  135.         if (S) if (!*++S) S = 0;
  136.         setValue(secAndOrParamEqOptAndOrVal,S);
  137.     }
  138.     else
  139.         setValue(buf,secAndOrParamEqOptAndOrVal);
  140.     return *this;
  141. }
  142.  
  143. WINIT::~WINIT()
  144. {
  145.     if (dirty && Nodes() && !sec)
  146.         save(fname);
  147.     destruct();
  148. }
  149.