home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / pcmagazi / 1992 / 04 / inifile.cpp < prev    next >
C/C++ Source or Header  |  1992-02-05  |  4KB  |  185 lines

  1. // inifile.cpp RHS 8/1/91
  2.  
  3. #include<string.h>
  4. #include<stdio.h>
  5. #include<dos.h>
  6. #include<stdlib.h>
  7. #include"inifile.h"
  8.  
  9. IniFile::IniFile(char *ininame)
  10.     {
  11.     name = NULL;
  12.     SetName(ininame);
  13.     }
  14.  
  15. IniFile::IniFile(void)
  16.     {
  17.     name = NULL;
  18.     }
  19.  
  20. void IniFile::SetName(char *ininame)
  21.     {
  22.     if(name)
  23.         delete name;
  24.     name = new char[strlen(ininame)+1];
  25.     strcpy(name,ininame);
  26.     }
  27.  
  28.  
  29. int IniFile::AddLine(char *line, char *def)
  30.     {
  31.     INIFILELINE *I = new INIFILELINE;
  32.  
  33.     if(!I)
  34.         return 1;
  35.  
  36.     I->line = strdup(line);
  37.     I->value = strdup(def);
  38.     return list.Add(I);
  39.     }
  40.  
  41. int IniFile::AddLine(char *line, int def)
  42.     {
  43.     char temp[10];
  44.  
  45.     itoa(def,temp,10);
  46.     return CallAddLine(line,temp);
  47.     }
  48.  
  49. int IniFile::CallAddLine(char *line, char *def)
  50.     {
  51.     char *temp = new char[strlen(def)+1];
  52.     strcpy(temp,def);
  53.     int i = AddLine(line,temp);
  54.     delete temp;
  55.     return i;
  56.     }
  57.  
  58. int IniFile::AddLine(char *line, long def)
  59.     {
  60.     char temp[18];
  61.  
  62.     ltoa(def,temp,10);
  63.     return CallAddLine(line,temp);
  64.     }
  65.  
  66. char *IniFile::GetLine(char *line)
  67.     {
  68.     return GetLine(line,NULL);
  69.     }
  70.  
  71. char *IniFile::GetLine(char *line, char *def)
  72.     {
  73.     INIFILELINE *I;
  74.     int i;
  75.  
  76.     for(i = 0; i < list.Num(); i++)
  77.         {
  78.         I = (INIFILELINE *)list[i];
  79.         if(!stricmp(line,I->line))
  80.             {
  81.             if(!def)
  82.                 {
  83.                 char *temp = new char[strlen(I->value)+1];
  84.                 strcpy(temp,I->value);
  85.                 return temp;
  86.                 }
  87.             else
  88.                 {
  89.                 strcpy(def,I->value);
  90.                 return def;
  91.                 }
  92.             }
  93.         }
  94.     }
  95.  
  96. INIFILELINE *IniFile::FindLine(char *line)
  97.     {
  98.     int i;
  99.     INIFILELINE *I;
  100.  
  101.     for(i = 0; i < list.Num(); i++)
  102.         {
  103.         I = (INIFILELINE *)list[i];
  104.         if(!strcmpi(I->line,line))
  105.             return I;
  106.         }
  107.     return NULL;
  108.     }
  109.  
  110.  
  111. char *rtrim(char *str)
  112.     {
  113.     char *p = strrchr(str,' ');
  114.  
  115.     if(!p)
  116.         return str;
  117.     while(*p == ' ' && p > str)
  118.         p--;
  119.     p++;
  120.     *p = '\0';
  121.     return str;
  122.     }
  123.  
  124.  
  125. int IniFile::Read(void)
  126.     {
  127.     FILE *fp = fopen(name,"rt");
  128.  
  129.     if(!fp && !strchr(name,'\\'))
  130.         {
  131.         char *temp = new char[strlen(name)+strlen(_argv[0])+1];
  132.         strcpy(temp,_argv[0]);
  133.         char *p = strrchr(temp,'\\');
  134.         p++;
  135.         strcpy(p,name);
  136.         fp = fopen(temp,"rt");
  137.         delete temp;
  138.         if(!fp)
  139.             return 1;
  140.         }
  141.     char buf[BUFSIZ];
  142.     char *value,*p;
  143.     INIFILELINE *I;
  144.  
  145.     while(fgets(buf,BUFSIZ,fp))
  146.         {
  147.         buf[strlen(buf)-1] = '\0';
  148.         if(p = strchr(buf,';'))
  149.             *p = '\0';
  150.         rtrim(buf);
  151.         if(!strlen(buf) || (!(value = strchr(buf,'='))) )
  152.             continue;
  153.         *value++ = '\0';
  154.  
  155.         if(I = FindLine(buf))
  156.             {
  157.             if(!I->value || strcmp(I->value,value))
  158.                 {
  159.                 if(I->value)
  160.                     delete I->value;
  161.                 char *temp = new char[strlen(value)+1];
  162.                 strcpy(temp,value);
  163.                 I->value = temp;
  164.                 }
  165.             }
  166.         }
  167.     fclose(fp);
  168.     }
  169.  
  170.  
  171. void IniFile::Dump(void)
  172.     {
  173.     int i;
  174.     INIFILELINE *I;
  175.  
  176.     for(i = 0; i < list.Num(); i++)
  177.         {
  178.         list.Dump(i);
  179.         I = (INIFILELINE *)list[i];
  180.         printf("list[%d]: @ %p line=%s value=%s\n",i,I,I->line,I->value);
  181.         }
  182.     }
  183.  
  184.  
  185.