home *** CD-ROM | disk | FTP | other *** search
/ Boldly Go Collection / version40.iso / TS / 17A / DRWIN101.ZIP / CFGUTIL.C < prev    next >
C/C++ Source or Header  |  1991-10-24  |  5KB  |  204 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #include "strutil.h"
  5.  
  6. #include "cfgutil.h"
  7.  
  8.  
  9.  
  10. //===========================================================================
  11. void cfg_updateval(CFG_TYPE* ini,int n,char* s)
  12. {
  13.   int i;
  14.   unsigned long d;
  15.   double dd;
  16.   char* dp;
  17.  
  18.   for (i=0;i<n;i++) if (stricmpshort(s,ini[i].name)==0) break;
  19.   if (i>=n) return;
  20.   if (ini[i].type & CFG_NOLOAD) return;
  21.  
  22.   dp=(char*)ini[i].val;
  23.  
  24.   s=&s[strlen(ini[i].name)];           //skip over name
  25.   while (*s && isspace(*s)) s++;
  26.   if (*s!='=') return;
  27.   s++;
  28.   while (*s && isspace(*s)) s++;
  29.   if (!*s) return;
  30.   switch (ini[i].type & CFG_TYPE_MASK) {
  31.   case CFG_CHAR:
  32.     if (*s=='\'') s++;
  33.     strcchr((char*)dp,s);              //convert C-type char constant
  34.     break;
  35.   case CFG_BYTE:
  36.     if (strasc2ul(s,&d,10)) *(unsigned char*)dp=(unsigned char)d;
  37.     break;
  38.   case CFG_INT:
  39.     if (strasc2ul(s,&d,10)) *(int*)dp=(int)d;
  40.     break;
  41.   case CFG_UINT:
  42.     if (strasc2ul(s,&d,10)) *(unsigned int*)dp=(unsigned int)d;
  43.     break;
  44.   case CFG_LONG:
  45.     if (strasc2ul(s,&d,10)) *(long*)dp=(long)d;
  46.     break;
  47.   case CFG_ULONG:
  48.     if (strasc2ul(s,&d,10)) *(unsigned long*)dp=(unsigned long)d;
  49.     break;
  50.   case CFG_DOUBLE:
  51.     if (sscanf(s,"%lG",&dd)) *(double*)dp=dd;
  52.     break;
  53.   case CFG_STRING:
  54.     if (*s=='\"') {
  55.       s++;
  56.       while (*s && (*s!='\"')) s=strcchr(dp++,s);
  57.       *dp=0;
  58.     }
  59.     else {
  60.       while (*s && !isspace(*s)) *dp++=*s++;
  61.       *dp=0;
  62.     }   //if not in quotes
  63.     break;
  64.   case CFG_CUSTOM:
  65.     if (ini[i].func) ini[i].func(i,dp,s,CFG_LOAD);
  66.     break;
  67.   default: ;
  68.   }   //switch
  69. }   //cfg_updateval
  70.  
  71.  
  72. //===========================================================================
  73. int  cfg_load(char* fn,char* obj,CFG_TYPE* ini,int n)
  74. {
  75.   FILE* f;
  76.   char s[0x80];
  77.   char* p;
  78.   int l;
  79.   char found=0;
  80.  
  81.   if (n==0) while (ini[n].name) n++;
  82.   if (!n) return 0;
  83.   l=strlen(obj);                       //get length of object to find
  84.   if (!l) return 0;
  85.  
  86.   f=fopen(fn,"rt");
  87.   if (!f) return 0;
  88.  
  89.   while (!found && fgets(s,sizeof(s),f)) {       //get line, bomb on EOF
  90.     if (s[sizeof(s)-1]=='\n') s[sizeof(s)-1]=0;  //kill '\n' from file i/o
  91.     p=s;
  92.     while (*p && isspace(*p)) p++;     //skip whitespace
  93.     if (*p!='[') continue;             //not "[<objectname>]"
  94.     p++;
  95.     if (stricmpshort(p,obj)) continue; //returns 0 if equal
  96.     p=&p[l];
  97.     while (*p && isspace(*p)) p++;     //skip whitespace
  98.     found=(*p==']');                   //check for final ']'
  99.   }   //while
  100.   if (!found) { fclose(f); return 0; }
  101.  
  102.   found=0;                             //we'll be looking again
  103.   while (!found && fgets(s,sizeof(s),f)) {
  104.     if (s[sizeof(s)-1]=='\n') s[sizeof(s)-1]=0;  //kill '\n' from file i/o
  105.     p=s;
  106.     while (*p && isspace(*p)) p++;     //skip whitespace
  107.     if (*p=='[') break;                //if a new object starting, quit
  108.     strcomment(p,';');                 //delete comments
  109.     cfg_updateval(ini,n,p);
  110.   }   //while
  111.  
  112.   fclose(f);
  113.   return 1;
  114. }   //cfg_load
  115.  
  116.  
  117. //===========================================================================
  118. int  cfg_save(char* fn,char* obj,CFG_TYPE* ini,int n,int append)
  119. {
  120.   FILE* f;
  121.   char s[0x100];
  122.   char* dp;
  123.   int i,l;
  124.  
  125.   if (n==0) while (ini[n].name) n++;
  126.   if (!n) return 0;
  127.   l=strlen(obj);                       //get length of object to find
  128.   if (!l) return 0;
  129.  
  130.   if (append)
  131.     f=fopen(fn,"at");
  132.   else
  133.     f=fopen(fn,"wt");
  134.   if (!f) return 0;
  135.  
  136.   fprintf(f,"\n[%s]\n",obj);           //write out object/application name
  137.  
  138.   for (i=0;i<n;i++) {
  139.     if (ini[i].type & CFG_NOSAVE) continue;
  140.  
  141.     dp=(char*)ini[i].val;              //point to data item
  142.     fprintf(f,"%s=",ini[i].name);
  143.  
  144.     switch (ini[i].type & CFG_TYPE_MASK) {
  145.     case CFG_CHAR:
  146.       l=str2cchr(s,*(char*)dp);        //convert to C-type character
  147.       s[l]=0;
  148.       if (ini[i].type & CFG_QUOTES)
  149.         fprintf(f,"\'%s\'\n",s);
  150.       else
  151.         fprintf(f,"%s\n",s);
  152.       break;
  153.     case CFG_BYTE:
  154.       if (ini[i].type & CFG_HEX)
  155.         fprintf(f,"0x%X\n",*(unsigned char*)dp);
  156.       else
  157.         fprintf(f,"%u\n",*(unsigned char*)dp);
  158.       break;
  159.     case CFG_INT:
  160.       fprintf(f,"%d\n",*(int*)dp);
  161.       break;
  162.     case CFG_UINT:
  163.       if (ini[i].type & CFG_HEX)
  164.         fprintf(f,"0x%X\n",*(unsigned int*)dp);
  165.       else
  166.         fprintf(f,"%u\n",*(unsigned int*)dp);
  167.       break;
  168.     case CFG_LONG:
  169.       fprintf(f,"%ld\n",*(long*)dp);
  170.       break;
  171.     case CFG_ULONG:
  172.       if (ini[i].type & CFG_HEX)
  173.         fprintf(f,"0x%lX\n",*(unsigned long*)dp);
  174.       else
  175.         fprintf(f,"%lu\n",*(unsigned long*)dp);
  176.       break;
  177.     case CFG_DOUBLE:
  178.       fprintf(f,"%G\n",*(double*)dp);
  179.       break;
  180.     case CFG_STRING:
  181.       str2cstr(s,(char*)dp,sizeof(s));   //write to C-type char string
  182.       if (ini[i].type & CFG_QUOTES)
  183.         fprintf(f,"\"%s\"\n",s);
  184.       else
  185.         fprintf(f,"%s\n",s);
  186.       break;
  187.     case CFG_CUSTOM:
  188.       if (ini[i].func) {
  189.         ini[i].func(i,dp,s,CFG_SAVE);
  190.         fprintf(f,"%s\n",s);
  191.       }
  192.       break;
  193.     default:
  194.       fprintf(f,"\n");
  195.     }   //switch on type
  196.   }   //for
  197.  
  198.   fclose(f);
  199.   return 1;
  200. }   //cfg_save
  201.  
  202.  
  203.  
  204.