Annotation of src/profile.c, revision 1.1.1.1

1.1       root        1: /****************************************************************************
                      2: *
                      3: *  File              : profile.c
                      4: *  Date Created      : 10/14/94
                      5: *  Description       : 
                      6: *
                      7: *  Programmer(s)     : Nick Skrepetos
                      8: *  Last Modification : 12/10/94 - 11:56:16 PM
                      9: *  Additional Notes  :
                     10: *
                     11: *****************************************************************************
                     12: *            Copyright (c) 1993-95,  HMI, Inc.  All Rights Reserved            *
                     13: ****************************************************************************/
                     14: 
                     15: #include <stdio.h>
                     16: #include <stdlib.h>
                     17: #include <dos.h>
                     18: #include <fcntl.h>
                     19: #include <string.h>
                     20: #include <io.h>
                     21: #include <ctype.h>
                     22: #include "sos.h"
                     23: #include "profile.h"
                     24: #include <memcheck.h>
                     25: 
                     26: /****************************************************************************
                     27: 
                     28:    Possible Additions:
                     29: 
                     30:       hmiINIAddItemDecimal( )       adds new item w/decimal
                     31:       hmiINIAddItemQuery( )         adds new item w/query Yes/No
                     32:       hmiINIAddRawString( )         adds new raw string
                     33: 
                     34:    Error Checking:
                     35: 
                     36:       allow TABS to be skipped as "White Space" in addition to spaces so
                     37:       that editors that use tabs will work also.
                     38: 
                     39:       allow String functions to support lists with comma (,) seperators
                     40:       like the decimal functions do.
                     41: 
                     42:       allow location functions to be case sensitive or insensitive
                     43: 
                     44:       get rid of compiler dependent stuff like memcpy, stricmp
                     45: 
                     46: ****************************************************************************/
                     47: 
                     48: // local data
                     49: static   PSTR  szHexNumbers  =  "0123456789ABCDEF";
                     50: static   WORD  wMultiplier[]   =  { 1, 16, 256, 4096, 65536, 1048576, 16777216, 268435456 };
                     51: 
                     52: // local function prototypes
                     53: WORD   hmiINIHex2Decimal    ( PSTR szHexValue );
                     54: WORD   hmiINIGetHexIndex    ( BYTE bValue );
                     55: 
                     56: 
                     57: /****************************************************************************
                     58: *
                     59: *  Syntax
                     60: *
                     61: *     BOOL     cdecl hmiINIOpen( _INI_INSTANCE * sInstance, PSTR szName )
                     62: *
                     63: *  Description
                     64: *
                     65: *     opens and instance of a .ini file
                     66: *
                     67: *  Parameters
                     68: *
                     69: *        Type           Description
                     70: *        --------------------------
                     71: *        sInstance      pointer to an .ini instance
                     72: *        szName         pointer to the name of the .ini file
                     73: *
                     74: *  Return
                     75: *
                     76: *     _TRUE       the file was opened correctly
                     77: *     _FALSE      there was a problem opening the file
                     78: *
                     79: ****************************************************************************/
                     80: BOOL   cdecl hmiINIOpen( _INI_INSTANCE * sInstance, PSTR szName )
                     81:        {
                     82:       WORD  hFile;
                     83: 
                     84:       // save the name of the .ini file
                     85:       strcpy( sInstance->szName, szName );
                     86: 
                     87:       // open .ini file, return error if file is not
                     88:       // found.
                     89:       if ( ( hFile = open( szName, O_RDONLY | O_BINARY ) ) == -1 )
                     90:          return( _FALSE );
                     91: 
                     92:       // determine size of file
                     93:       sInstance->wSize  =  lseek( hFile, 0, SEEK_END );
                     94: 
                     95:       // set the new maximum size 
                     96:       sInstance->wMaxSize  =  sInstance->wSize + _INI_EXTRA_MEMORY;
                     97: 
                     98:       // seek back to start of file
                     99:       lseek( hFile, 0, SEEK_SET );
                    100: 
                    101:       // allocate memory for the file
                    102:       if ( ( sInstance->pData  =  ( PSTR )malloc( sInstance->wMaxSize ) ) == _NULL )
                    103:       {
                    104:          // close file
                    105:          close( hFile );
                    106: 
                    107:          // return error, not enough memory
                    108:          return( _FALSE );
                    109:       }
                    110: 
                    111:       // read in file
                    112:       if ( read( hFile, sInstance->pData, sInstance->wSize ) != sInstance->wSize )
                    113:       {
                    114:          // close file
                    115:          close( hFile );
                    116: 
                    117:          // free memory
                    118:          free( sInstance->pData );
                    119: 
                    120:          // return error, not file size incorrect
                    121:          return( _FALSE );
                    122:       }
                    123: 
                    124:       // close file
                    125:       close( hFile );
                    126: 
                    127:       // init current position
                    128:       sInstance->pCurrent  =  sInstance->pData;
                    129:       sInstance->wCurrent  =  0;
                    130: 
                    131:       // initalize current item pointer
                    132:       sInstance->pItem     =  _NULL;
                    133:       sInstance->pList     =  _NULL;
                    134:       sInstance->pItemPtr  =  _NULL;
                    135:       sInstance->pListPtr  =  _NULL;
                    136: 
                    137:       // reset the modified flag to indicate that the 
                    138:       // file is unmodified.
                    139:       sInstance->wFlags    &= ~_INI_MODIFIED;
                    140: 
                    141:       // return success
                    142:       return( _TRUE );
                    143:        }
                    144: 
                    145: /****************************************************************************
                    146: *
                    147: *  Syntax
                    148: *
                    149: *     BOOL     cdecl hmiINIClose( _INI_INSTANCE * sInstance )
                    150: *
                    151: *  Description
                    152: *
                    153: *     close and instance of a .ini file. note that if the file is modified
                    154: *     it will be written back to the original file.
                    155: *
                    156: *  Parameters
                    157: *
                    158: *        Type           Description
                    159: *        --------------------------
                    160: *        sInstance      pointer to .ini instance
                    161: *
                    162: *  Return
                    163: *
                    164: *     _TRUE       file was closed and/or written correctly
                    165: *     _FALSE      a problem was encountered when writing/closing the file
                    166: *
                    167: ****************************************************************************/
                    168: BOOL   cdecl hmiINIClose( _INI_INSTANCE * sInstance )
                    169:        {
                    170:       WORD  hFile;
                    171: 
                    172:       // determine if the .ini file has been modified
                    173:       if ( sInstance->wFlags & _INI_MODIFIED )
                    174:       {
                    175:          // create and open file 
                    176:          if ( ( hFile =  open( (const char * )sInstance->szName, O_CREAT | O_TRUNC | O_RDWR | O_BINARY, 0 ) ) == -1 )
                    177:          {
                    178:                // free memory
                    179:             free( sInstance->pData );
                    180: 
                    181:             // error creating file
                    182:             return( _FALSE );
                    183:          }
                    184: 
                    185:          // write data back out
                    186:          write( hFile, sInstance->pData, sInstance->wSize );
                    187: 
                    188:          // close file
                    189:          close( hFile );
                    190:       }
                    191: 
                    192:                // free memory
                    193:       free( sInstance->pData );
                    194: 
                    195:       // return success
                    196:       return( _TRUE );
                    197:        }
                    198: 
                    199: 
                    200: /****************************************************************************
                    201: *
                    202: *  Syntax
                    203: *
                    204: *     BOOL cdecl  hmiINILocateSection( _INI_INSTANCE * sInstance, PSTR szName )
                    205: *
                    206: *  Description
                    207: *
                    208: *     locates a section in a file.  a section is determined by enclosing 
                    209: *     it in [].  ie.  [SECTION]
                    210: *
                    211: *  Parameters
                    212: *
                    213: *        Type           Description
                    214: *        --------------------------
                    215: *        sInstance      pointer to .ini instance
                    216: *        szName         pointer to section name
                    217: *
                    218: *  Return
                    219: *
                    220: *     _TRUE       section located
                    221: *     _FALSE      section not located
                    222: *
                    223: ****************************************************************************/
                    224: BOOL  cdecl hmiINILocateSection( _INI_INSTANCE * sInstance, PSTR szName )
                    225:        {
                    226:       PSTR  pDataPtr;
                    227:       PSTR     pSectionPtr;
                    228:       PSTR  szSection;
                    229:       WORD  wIndex;
                    230:       WORD  wFoundFlag  =  _FALSE;
                    231: 
                    232:       // set data pointer to pointer to start of .ini in memory
                    233:       pDataPtr    =  sInstance->pData;
                    234: 
                    235:       // initialize index
                    236:       wIndex      =  0;
                    237: 
                    238:       // search data until we have found a start section character
                    239:       // and then attempt to match section string.  continue to process
                    240:       // entire data set until the end is reached or a match is 
                    241:       // found.
                    242:       do
                    243:          {
                    244:             // check if character we are pointing to is a 
                    245:             // start section character
                    246:             if ( *pDataPtr == _INI_SECTION_START )
                    247:             {
                    248:                // save pointer to start of section for use by the
                    249:                // delete functions.
                    250:                pSectionPtr =  pDataPtr;
                    251: 
                    252:                // advance past the start section character
                    253:                pDataPtr++;
                    254: 
                    255:                // set pointer to section name
                    256:                szSection   =  szName;
                    257: 
                    258:                // search the string character by character to determine
                    259:                // if we have a match.
                    260:                while( *pDataPtr == *szSection && wIndex < sInstance->wSize )
                    261:                {
                    262:                   // advance section pointer
                    263:                   szSection++;
                    264: 
                    265:                   // advance data pointer
                    266:                   pDataPtr++;
                    267: 
                    268:                   // advance data index
                    269:                   wIndex++;
                    270:                }
                    271: 
                    272:                // determine if we are sitting on a end section 
                    273:                // character. if so then we have a complete match
                    274:                // so set the found flag to true.
                    275:                if ( *pDataPtr == _INI_SECTION_END && *szSection == _NULL )
                    276:                {
                    277:                   // set found flag
                    278:                   wFoundFlag  =  _TRUE;
                    279: 
                    280:                   // move to the next line
                    281:                   while( *pDataPtr != _INI_LF )
                    282:                      pDataPtr++;
                    283: 
                    284:                   // advance past line feed
                    285:                   pDataPtr++;
                    286: 
                    287:                   // set list pointer for raw name
                    288:                   sInstance->pListPtr  =  pDataPtr;
                    289: 
                    290:                   // set current data pointer to new section
                    291:                   // location.
                    292:                   sInstance->pCurrent  =  pDataPtr;
                    293:                   sInstance->wCurrent  =  wIndex;
                    294: 
                    295:                   // save pointer to start of current section for
                    296:                   // use by other functions.
                    297:                   sInstance->pSection  =  pSectionPtr;
                    298:                }
                    299: 
                    300:             }
                    301: 
                    302:             // advance pointer 
                    303:             pDataPtr++;
                    304: 
                    305:             // advance index
                    306:             wIndex++;
                    307:          }
                    308:       while( !wFoundFlag && wIndex < sInstance->wSize );
                    309: 
                    310:       // return the status of the found flag, this will indicate
                    311:       // if the desired section was located.
                    312:       return( ( BOOL )wFoundFlag );
                    313:        }
                    314: 
                    315: 
                    316: /****************************************************************************
                    317: *
                    318: *  Syntax
                    319: *
                    320: *     BOOL     cdecl hmiINILocateItem( _INI_INSTANCE * sInstance, PSTR szItem )
                    321: *
                    322: *  Description
                    323: *
                    324: *     locates an item under a section in an .ini file
                    325: *
                    326: *  Parameters
                    327: *
                    328: *        Type           Description
                    329: *        --------------------------
                    330: *        sInstance      pointer to an .ini instance
                    331: *        szItem         pointer to the name of the item
                    332: *
                    333: *  Return
                    334: *
                    335: *     _TRUE    the item was located
                    336: *     _FALSE   the item was not located
                    337: *
                    338: ****************************************************************************/
                    339: BOOL   cdecl hmiINILocateItem( _INI_INSTANCE * sInstance, PSTR szItem )
                    340:        {
                    341:       PSTR  pDataPtr;
                    342:       PSTR  pItemPtr;
                    343:       PSTR  szSearch;
                    344:       WORD  wIndex;
                    345:       WORD  wFoundFlag  =  _FALSE;
                    346: 
                    347:       // initialize current location pointers
                    348:       pDataPtr =  sInstance->pCurrent;
                    349:       wIndex   =  sInstance->wCurrent;
                    350: 
                    351:       // search each data item until match is found or the start
                    352:       // of a new section is found
                    353:       do
                    354:          {
                    355:             // set up search pointer
                    356:             szSearch =  szItem;
                    357: 
                    358:             // check if current character matches first
                    359:             // character of search string
                    360:             if ( *pDataPtr == *szSearch )
                    361:             {
                    362:                // set pointer to start of potential item.  this pointer
                    363:                // will be used later to mark the start of the item
                    364:                // string.
                    365:                pItemPtr    =  pDataPtr;
                    366: 
                    367:                // advance data pointer and search pointer
                    368:                pDataPtr++;
                    369:                szSearch++;
                    370: 
                    371:                // advance search index
                    372:                wIndex++;
                    373: 
                    374:                // search the rest of the string, make sure we do not overrun
                    375:                // the end of file and that the string still matches.
                    376:                while( *pDataPtr == *szSearch && wIndex < sInstance->wSize )
                    377:                {
                    378:                   // advance data pointer
                    379:                   pDataPtr++;
                    380: 
                    381:                   // advance search pointer
                    382:                   szSearch++;
                    383: 
                    384:                   // advance index
                    385:                   wIndex++;
                    386:                }
                    387: 
                    388:                // check if we located the string
                    389:                if ( *szSearch == _NULL )
                    390:                {
                    391:                   // skip any white until we locate the '='
                    392:                   // sign.
                    393:                   while( *pDataPtr != _INI_EQUATE && *pDataPtr != _INI_EOL )
                    394:                   {
                    395:                      // advance data pointer
                    396:                      pDataPtr++;
                    397: 
                    398:                      // advance index
                    399:                      wIndex++;
                    400:                   }
                    401: 
                    402:                   // check if we found and equate '=' character, if not
                    403:                   // only set the start of line indicator so the string
                    404:                   // and decimal routines know there is no value.
                    405:                   if ( *pDataPtr == _INI_EQUATE )
                    406:                   {
                    407:                      // advance data pointer one past the equate
                    408:                      pDataPtr++;
                    409: 
                    410:                      // advance index
                    411:                      wIndex++;
                    412: 
                    413:                      // set the pointer to the new item
                    414:                      sInstance->pItem     =  pDataPtr;
                    415:                   }
                    416:                   else
                    417:                      sInstance->pItem     =  _NULL;
                    418: 
                    419:                   // set the start of line item pointer for later use
                    420:                   sInstance->pItemPtr  =  pItemPtr;
                    421: 
                    422:                   // reset list pointer to indicate that we
                    423:                   // do not have a list yet.
                    424:                   sInstance->pList  =  _NULL;
                    425: 
                    426:                   // set the found flag
                    427:                   wFoundFlag  =  _TRUE;
                    428:                }
                    429:             }
                    430: 
                    431:             // advance to next place in data
                    432:             pDataPtr++;
                    433: 
                    434:             // advance index
                    435:             wIndex++;
                    436:          }
                    437:       while( !wFoundFlag && wIndex < sInstance->wSize && *pDataPtr != _INI_SECTION_START );
                    438: 
                    439:       // return found flag status
                    440:       return( ( BOOL )wFoundFlag );
                    441:        }
                    442: 
                    443: 
                    444: /****************************************************************************
                    445: *
                    446: *  Syntax
                    447: *
                    448: *     BOOL     cdecl hmiINIGetDecimal( _INI_INSTANCE * sInstance, WORD * wValue )
                    449: *
                    450: *  Description
                    451: *
                    452: *     retrieves a decimal value from an item in a .ini file.  note that if
                    453: *     the value is in hex (0x....) it will be automatically converted to 
                    454: *     decimal.
                    455: *
                    456: *  Parameters
                    457: *
                    458: *        Type           Description
                    459: *        --------------------------
                    460: *        sInstance      pointer to an .ini instance
                    461: *        wValue         pointer to a word to store decimal value in
                    462: *
                    463: *  Return
                    464: *
                    465: *     _TRUE    value was located and converted correctly
                    466: *     _FALSE   value was not valid, or item search was not performed
                    467: *
                    468: ****************************************************************************/
                    469: BOOL   cdecl hmiINIGetDecimal( _INI_INSTANCE * sInstance, WORD * wValue )
                    470:        {
                    471:       PSTR  pDataPtr;
                    472:                WORD  wDValue;
                    473:       BYTE  bBuffer[ 32 ];
                    474:       WORD  wIndex;
                    475: 
                    476:       // initialize pointer to data
                    477:       if ( sInstance->pList )
                    478:          pDataPtr    =  sInstance->pList;
                    479:       else
                    480:          pDataPtr    =  sInstance->pItem;
                    481: 
                    482:       // check if it is null
                    483:       if ( pDataPtr == _NULL )
                    484:          return( _FALSE );
                    485: 
                    486:       // skip all white space
                    487:       while( *pDataPtr == _INI_SPACE )
                    488:          pDataPtr++;
                    489: 
                    490:       // check if we are pointing to and EOL
                    491:       if ( *pDataPtr == _INI_EOL )
                    492:          return( _FALSE );
                    493: 
                    494:       // initialize buffer index
                    495:       wIndex   =  0;
                    496: 
                    497:       // fetch string for value
                    498:       while( *pDataPtr != _INI_EOL && *pDataPtr != _INI_LIST_SEPERATOR 
                    499:                && *pDataPtr != _INI_SPACE )
                    500:       {
                    501:          // save character
                    502:          bBuffer[ wIndex++ ]  =  *pDataPtr++;
                    503:       }
                    504: 
                    505:       // set null at the end of buffer
                    506:       bBuffer[ wIndex ]       =  '\0';
                    507: 
                    508:       // check if we have simply reached the end of the
                    509:       // line with no number.
                    510:       if ( wIndex == 0 )
                    511:          return( _FALSE );
                    512: 
                    513:       // skip all white space
                    514:       while( *pDataPtr == _INI_SPACE )
                    515:          pDataPtr++;
                    516: 
                    517:       // check if we have a list of numbers
                    518:       if ( *pDataPtr == _INI_LIST_SEPERATOR )
                    519:       {
                    520:          // set list pointer to one past the current
                    521:          // seperator.
                    522:          sInstance->pList  =  ++pDataPtr;
                    523:       }
                    524:       else
                    525:          sInstance->pList  =  pDataPtr;
                    526: 
                    527:       // check if the buffer contains a hex value
                    528:       if ( bBuffer[ 1 ] == _INI_HEX_INDICATOR )
                    529:       {
                    530:          // fetch hex value
                    531:          wDValue  =  hmiINIHex2Decimal( &bBuffer[ 2 ] );
                    532:       }
                    533:       else
                    534:       {
                    535:          // fetch value
                    536:          wDValue  =  (WORD)atoi( bBuffer );
                    537:       }
                    538: 
                    539:       // set value
                    540:       *wValue  =  wDValue;
                    541: 
                    542:       // return status
                    543:       return( _TRUE );
                    544:        }
                    545: 
                    546: 
                    547: /****************************************************************************
                    548: *
                    549: *  Syntax
                    550: *
                    551: *     BOOL     cdecl hmiINIGetString( _INI_INSTANCE * sInstance, PSTR pString, WORD wMaxLength )
                    552: *
                    553: *  Description
                    554: *
                    555: *     fetches string from .ini file
                    556: *
                    557: *  Parameters
                    558: *
                    559: *        Type           Description
                    560: *        --------------------------
                    561: *        sInstance      pointer to .ini instance
                    562: *        pString        pointer to store string
                    563: *        wMaxLength     maximum length of string to fetch
                    564: *
                    565: *  Return
                    566: *
                    567: *     _TRUE    string was returned correctly
                    568: *     _FALSE   item search was not performed before calling this function
                    569: *
                    570: ****************************************************************************/
                    571: BOOL   cdecl hmiINIGetString( _INI_INSTANCE * sInstance, PSTR pString, WORD wMaxLength )
                    572:        {
                    573:       PSTR  pDataPtr;
                    574:       WORD  wIndex;
                    575: 
                    576:       // initialize pointer to data
                    577:       if ( sInstance->pList )
                    578:          pDataPtr    =  sInstance->pList;
                    579:       else
                    580:          pDataPtr    =  sInstance->pItem;
                    581: 
                    582:       // check if it is null
                    583:       if ( pDataPtr == _NULL )
                    584:          return( _FALSE );
                    585: 
                    586:       // initialize index
                    587:       wIndex   =  0;
                    588: 
                    589:       // find start of string, first non-space character
                    590:       while( *pDataPtr  == _INI_SPACE )
                    591:          pDataPtr++;
                    592: 
                    593:       // copy string into buffer
                    594:       while( *pDataPtr != _INI_EOL && *pDataPtr != _INI_LIST_SEPERATOR && wIndex < wMaxLength - 1 )
                    595:          pString[ wIndex++ ] =  *pDataPtr++;
                    596: 
                    597:       // place a _NULL at the end of the string
                    598:       pString[ wIndex ] =  '\0';
                    599: 
                    600:       // if we have reached maximum buffer length, search until
                    601:       // we get to the EOL or list seperator
                    602:       if ( wIndex == wMaxLength - 1 )
                    603:       {
                    604:          // find end / list seperator
                    605:          while( *pDataPtr != _INI_EOL && *pDataPtr != _INI_LIST_SEPERATOR )
                    606:             pDataPtr++;
                    607:       }
                    608: 
                    609:       // check if we have a list of items
                    610:       if ( *pDataPtr == _INI_LIST_SEPERATOR )
                    611:       {
                    612:          // set list pointer to one past the current
                    613:          // seperator.
                    614:          sInstance->pList  =  ++pDataPtr;
                    615:       }
                    616:       else
                    617:          sInstance->pList  =  pDataPtr;
                    618: 
                    619:       // return success
                    620:       return( _TRUE );
                    621:        }
                    622: 
                    623: /****************************************************************************
                    624: *
                    625: *  Syntax
                    626: *
                    627: *     BOOL     cdecl hmiINIGetRawString( _INI_INSTANCE * sInstance, PSTR pString, WORD wMaxLength )
                    628: *
                    629: *  Description
                    630: *
                    631: *     fetches string from .ini file
                    632: *
                    633: *  Parameters
                    634: *
                    635: *        Type           Description
                    636: *        --------------------------
                    637: *        sInstance      pointer to .ini instance
                    638: *        pString        pointer to store string
                    639: *        wMaxLength     maximum length of string to fetch
                    640: *
                    641: *  Return
                    642: *
                    643: *     _TRUE    string was returned correctly
                    644: *     _FALSE   end of strings to fetch, or no section locate performed
                    645: *
                    646: ****************************************************************************/
                    647: BOOL   cdecl hmiINIGetRawString( _INI_INSTANCE * sInstance, PSTR pString, WORD wMaxLength )
                    648:        {
                    649:       PSTR  pDataPtr;
                    650:       PSTR  pEOFPtr;
                    651:       WORD  wIndex;
                    652: 
                    653:       // initialize data pointer
                    654:       pDataPtr =  sInstance->pListPtr;
                    655: 
                    656:       // check if it is null
                    657:       if ( pDataPtr == _NULL || *pDataPtr == _INI_SECTION_START ||
                    658:             *pDataPtr   == _INI_EOL )
                    659:          return( _FALSE );
                    660: 
                    661:       // determine EOF pointer
                    662:       pEOFPtr  =  sInstance->pData + sInstance->wSize;
                    663: 
                    664:       // initialize index
                    665:       wIndex   =  0;
                    666: 
                    667:       // find start of string, first non-space character
                    668:       while( *pDataPtr  == _INI_SPACE )
                    669:          pDataPtr++;
                    670: 
                    671:       // copy string into buffer
                    672:       while( *pDataPtr != _INI_EOL && wIndex < wMaxLength - 1 )
                    673:          pString[ wIndex++ ] =  *pDataPtr++;
                    674: 
                    675:       // place a _NULL at the end of the string
                    676:       pString[ wIndex ] =  '\0';
                    677: 
                    678:       // skip past end of line
                    679:       pDataPtr += 2;
                    680: 
                    681:       // make sure we are not at the end of the
                    682:       // file.
                    683:       if ( pDataPtr >= pEOFPtr )
                    684:          sInstance->pListPtr  =  _NULL;
                    685:       else
                    686:          // save off current position
                    687:          sInstance->pListPtr  =  pDataPtr;
                    688: 
                    689:       // return success
                    690:       return( _TRUE );
                    691:        }
                    692: 
                    693: /****************************************************************************
                    694: *
                    695: *  Syntax
                    696: *
                    697: *     BOOL     cdecl hmiINIWriteDecimal( _INI_INSTANCE * sInstance, WORD wValue )
                    698: *
                    699: *  Description
                    700: *
                    701: *     writes decimal value to .ini item
                    702: *
                    703: *  Parameters
                    704: *
                    705: *        Type           Description
                    706: *        --------------------------
                    707: *        sInstance      pointer to an .ini instance
                    708: *        wValue         value to write out
                    709: *
                    710: *  Return
                    711: *
                    712: *     _TRUE    value written correctly
                    713: *     _FALSE   value not written correctly
                    714: *
                    715: ****************************************************************************/
                    716: BOOL   cdecl hmiINIWriteDecimal( _INI_INSTANCE * sInstance, WORD wValue )
                    717:        {
                    718:       PSTR  pDataPtr;
                    719:       PSTR  pValuePtr;
                    720:       BYTE  bBuffer[ 32 ];
                    721:       WORD  wIndex;
                    722:       WORD  wStringSize;
                    723:       WORD  wDecimalSize;
                    724:       WORD  wMoveSize;
                    725: 
                    726:       // check if item was previously located
                    727:       if ( sInstance->pItem == _NULL )
                    728:          return( _FALSE );
                    729: 
                    730:       // get pointer to item
                    731:       pDataPtr =  sInstance->pItem;
                    732: 
                    733:       // skip all white space
                    734:       while( *pDataPtr == _INI_SPACE )
                    735:          pDataPtr++;
                    736: 
                    737:       // save pointer to value location
                    738:       pValuePtr   =  pDataPtr;
                    739: 
                    740:       // initialize string length
                    741:       wStringSize =  0;
                    742: 
                    743:       // fetch string for value
                    744:       while( *pDataPtr != _INI_EOL )
                    745:       {
                    746:          // save character and advance string size
                    747:          bBuffer[ wStringSize++ ]   =  *pDataPtr++;
                    748:       }
                    749: 
                    750:       // set null at the end of buffer
                    751:       bBuffer[ wStringSize ]  =  '\0';
                    752: 
                    753:       // check if the buffer contains a hex value
                    754:       if ( bBuffer[ 1 ] == _INI_HEX_INDICATOR )
                    755:       {
                    756:          // convert value to hex string
                    757:          itoa( wValue, &bBuffer[ 2 ], 16 );
                    758:       }
                    759:       else
                    760:       {
                    761:                   // convert value to decimal string
                    762:          itoa( wValue, &bBuffer[ 0 ], 10 );
                    763:       }
                    764: 
                    765:       // get length of converted string
                    766:       wDecimalSize   =  strlen( bBuffer );
                    767: 
                    768:       // check if we need to shrink or expand the 
                    769:       // data size.
                    770:       if ( wDecimalSize < wStringSize )
                    771:       {
                    772:          // calculate the move size
                    773:          wMoveSize   =  ( ( sInstance->pData + sInstance->wSize ) - pValuePtr ) - ( wStringSize - wDecimalSize );
                    774: 
                    775:          // need to shrink the size of the .ini file
                    776:          memmove( pValuePtr, pValuePtr + ( wStringSize - wDecimalSize ), wMoveSize );
                    777: 
                    778:          // adjust size
                    779:          sInstance->wSize  -= ( wStringSize - wDecimalSize );
                    780:       }
                    781:       else
                    782:          // check if expand data
                    783:          if ( wDecimalSize > wStringSize )
                    784:          {
                    785:             // make sure we have enough memory to expand
                    786:             if ( sInstance->wSize + ( wDecimalSize - wStringSize ) > sInstance->wMaxSize )
                    787:                return( _FALSE );
                    788: 
                    789:             // need to expand the size of the .ini file,
                    790:             // calculate the move size
                    791:             wMoveSize   =  ( ( sInstance->pData + sInstance->wSize ) - pValuePtr ) + ( wDecimalSize - wStringSize );
                    792: 
                    793:             // need to shrink the size of the .ini file
                    794:             memmove( pValuePtr + ( wDecimalSize - wStringSize ), pValuePtr, wMoveSize );
                    795: 
                    796:             // adjust size
                    797:             sInstance->wSize  += ( wDecimalSize - wStringSize );
                    798:          }
                    799: 
                    800:       // initialize index
                    801:       wIndex      =  0;
                    802: 
                    803:       // copy in new string
                    804:       while( bBuffer[ wIndex ] )
                    805:          *pValuePtr++   =  bBuffer[ wIndex++ ];
                    806: 
                    807:       // set the modified flag
                    808:       sInstance->wFlags    |= _INI_MODIFIED;
                    809: 
                    810:       // return success
                    811:       return( _TRUE );
                    812:        }
                    813: 
                    814: /****************************************************************************
                    815: *
                    816: *  Syntax
                    817: *
                    818: *     BOOL     cdecl hmiINIWriteString( _INI_INSTANCE * sInstance, PSTR szString )
                    819: *
                    820: *  Description
                    821: *
                    822: *     writes out string to item
                    823: *
                    824: *  Parameters
                    825: *
                    826: *        Type           Description
                    827: *        --------------------------
                    828: *        sInstance      pointer to an .ini instance
                    829: *        szString       null terminated string
                    830: *
                    831: *  Return
                    832: *
                    833: *     _TRUE    the string was written correctly
                    834: *     _FALSE   the string was not written correctly
                    835: *
                    836: ****************************************************************************/
                    837: BOOL   cdecl hmiINIWriteString( _INI_INSTANCE * sInstance, PSTR szString )
                    838:        {
                    839:       PSTR  pDataPtr;
                    840:       PSTR  pStringPtr;
                    841:       WORD  wMoveSize;
                    842:       WORD  wSourceSize;
                    843:       WORD  wDestSize;
                    844: 
                    845:       // initialize data pointer
                    846:       pDataPtr =  sInstance->pItem;
                    847: 
                    848:       // check if it is null
                    849:       if ( pDataPtr == _NULL )
                    850:          return( _FALSE );
                    851: 
                    852:       // initialize destination length
                    853:       wDestSize   =  0;
                    854: 
                    855:       // find start of string character, first non-space
                    856:       // character.
                    857:       while( *pDataPtr  == _INI_SPACE )
                    858:          pDataPtr++;
                    859: 
                    860:       // save place to store new string
                    861:       pStringPtr  =  pDataPtr;
                    862: 
                    863:       // copy string into buffer
                    864:       while( *pDataPtr++ != _INI_EOL )
                    865:          wDestSize++;
                    866: 
                    867:       // get string length of new string
                    868:       wSourceSize    =  strlen( szString );
                    869: 
                    870:       // check if we need to shrink or expand the 
                    871:       // data size.
                    872:       if ( wSourceSize < wDestSize )
                    873:       {
                    874:          // calculate the move size
                    875:          wMoveSize   =  ( ( sInstance->pData + sInstance->wSize ) - pStringPtr ) - ( wDestSize - wSourceSize );
                    876: 
                    877:          // need to shrink the size of the .ini file
                    878:          memmove( pStringPtr, pStringPtr + ( wDestSize - wSourceSize ), wMoveSize );
                    879: 
                    880:          // adjust size
                    881:          sInstance->wSize  -= ( wDestSize - wSourceSize );
                    882:       }
                    883:       else
                    884:          // check if expand data
                    885:          if ( wSourceSize > wDestSize )
                    886:          {
                    887:             // make sure we have enough memory to expand
                    888:             if ( sInstance->wSize + ( wSourceSize - wDestSize ) > sInstance->wMaxSize )
                    889:                return( _FALSE );
                    890: 
                    891:             // need to expand the size of the .ini file,
                    892:             // calculate the move size
                    893:             wMoveSize   =  ( ( sInstance->pData + sInstance->wSize ) - pStringPtr ) + ( wSourceSize - wDestSize );
                    894: 
                    895:             // need to shrink the size of the .ini file
                    896:             memmove( pStringPtr + ( wSourceSize - wDestSize ), pStringPtr, wMoveSize );
                    897: 
                    898:             // adjust size
                    899:             sInstance->wSize  += ( wSourceSize - wDestSize );
                    900:          }
                    901: 
                    902:       // copy in new string
                    903:       while( *szString )
                    904:          *pStringPtr++   =  *szString++;
                    905: 
                    906:       // set the modified flag
                    907:       sInstance->wFlags    |= _INI_MODIFIED;
                    908: 
                    909:       // return success
                    910:       return( _TRUE );
                    911:        }
                    912: 
                    913: /****************************************************************************
                    914: *
                    915: *  Syntax
                    916: *
                    917: *     BOOL     cdecl hmiINIGetQuery( _INI_INSTANCE * sInstance, PSTR szItem )
                    918: *
                    919: *  Description
                    920: *
                    921: *     get a Yes/No type answer from item
                    922: *
                    923: *  Parameters
                    924: *
                    925: *        Type           Description
                    926: *        --------------------------
                    927: *        sInstance      pointer to an .ini instance
                    928: *        szItem         pointer to item to locate in query
                    929: *
                    930: *  Return
                    931: *
                    932: *     _TRUE    "Yes" was found
                    933: *     _FALSE   "No" or other was found
                    934: *
                    935: ****************************************************************************/
                    936: BOOL   cdecl hmiINIGetQuery( _INI_INSTANCE * sInstance, PSTR szItem )
                    937:        {
                    938:                BYTE  bBuffer[ 32 ];
                    939: 
                    940:       // locate item within section
                    941:       if ( !hmiINILocateItem( sInstance, szItem ) )
                    942:          return( _FALSE );
                    943: 
                    944:       // get string from .ini file
                    945:       if ( !hmiINIGetString( sInstance, bBuffer, 32 ) )
                    946:          return( _FALSE );
                    947: 
                    948:       // compare string to "Yes"
                    949:       if ( strcmpi( bBuffer, "YES" ) == 0 )
                    950:          return( _TRUE );
                    951:       else
                    952:          return( _FALSE );
                    953:        }
                    954: 
                    955: /****************************************************************************
                    956: *
                    957: *  Syntax
                    958: *
                    959: *     BOOL     cdecl hmiINIGetItemDecimal( _INI_INSTANCE * sInstance, PSTR szItem, 
                    960: *                                       WORD * wValue )
                    961: *
                    962: *  Description
                    963: *
                    964: *     locates and item and returns the decimal value associated with it
                    965: *
                    966: *  Parameters
                    967: *
                    968: *        Type           Description
                    969: *        --------------------------
                    970: *        sInstance      pointer to .ini instance
                    971: *        szItem         pointer to item string
                    972: *        wValue         pointer to word value 
                    973: *
                    974: *  Return
                    975: *
                    976: *     _TRUE       value located and retrieved
                    977: *     _FALSE      error getting value
                    978: *
                    979: ****************************************************************************/
                    980: BOOL   cdecl hmiINIGetItemDecimal( _INI_INSTANCE * sInstance, PSTR szItem, 
                    981:                                   WORD * wValue )
                    982:        {
                    983:       // attempt to locate item
                    984:       if ( !hmiINILocateItem( sInstance, szItem ) )
                    985:          return( _FALSE );
                    986: 
                    987:       // get decimal value
                    988:       if ( !hmiINIGetDecimal( sInstance, wValue ) )
                    989:          return( _FALSE );
                    990: 
                    991:       // return success
                    992:       return( _TRUE );
                    993:        }
                    994: 
                    995: /****************************************************************************
                    996: *
                    997: *  Syntax
                    998: *
                    999: *     BOOL     cdecl   hmiINIGetItemString( _INI_INSTANCE * sInstance, PSTR szItem,
                   1000: *                                      PSTR  pString, WORD wMaxSize )
                   1001: *
                   1002: *  Description
                   1003: *
                   1004: *     locates item and retrieves string associated with it
                   1005: *
                   1006: *  Parameters
                   1007: *
                   1008: *        Type           Description
                   1009: *        --------------------------
                   1010: *        sInstance      pointer to an .ini instance
                   1011: *        szItem         pointer to item string
                   1012: *        pString        pointer to string data area
                   1013: *        wMaxSize       maximum size of the string to get
                   1014: *
                   1015: *  Return
                   1016: *
                   1017: *     _TRUE       string retrieved
                   1018: *     _FALSE      error retrieving string
                   1019: *
                   1020: ****************************************************************************/
                   1021: BOOL   cdecl   hmiINIGetItemString( _INI_INSTANCE * sInstance, PSTR  szItem,
                   1022:                                  PSTR  pString, WORD  wMaxSize )
                   1023:        {
                   1024:       // attempt to locate the item string
                   1025:                if ( !hmiINILocateItem( sInstance, szItem ) )
                   1026:          return( _FALSE );
                   1027: 
                   1028:       // attempt to get string
                   1029:       if ( !hmiINIGetString( sInstance, pString, wMaxSize ) )
                   1030:          return( _FALSE );
                   1031: 
                   1032:       // return success
                   1033:       return( _TRUE );
                   1034:        }
                   1035: 
                   1036: /****************************************************************************
                   1037: *
                   1038: *  Syntax
                   1039: *
                   1040: *     BOOL     cdecl hmiINIWriteQuery( _INI_INSTANCE * sInstance, PSTR szItem, BOOL    wState )
                   1041: *
                   1042: *  Description
                   1043: *
                   1044: *     write a Yes/No type answer to an item
                   1045: *
                   1046: *  Parameters
                   1047: *
                   1048: *        Type           Description
                   1049: *        --------------------------
                   1050: *        sInstance      pointer to an .ini instance
                   1051: *        szItem         pointer to item to alter
                   1052: *        wState         flag: _TRUE or _FALSE
                   1053: *
                   1054: *  Return
                   1055: *
                   1056: *     _TRUE    query was modified
                   1057: *     _FALSE   query was not modified
                   1058: *
                   1059: ****************************************************************************/
                   1060: BOOL   cdecl hmiINIWriteQuery( _INI_INSTANCE * sInstance, PSTR szItem, BOOL    wState )
                   1061:        {
                   1062:       // locate item within section
                   1063:       if ( !hmiINILocateItem( sInstance, szItem ) )
                   1064:          return( _FALSE );
                   1065: 
                   1066:       // write string to .ini file
                   1067:       if ( wState )
                   1068:       {
                   1069:          // write string
                   1070:          if ( !hmiINIWriteString( sInstance, "Yes" ) )
                   1071:             return( _FALSE );
                   1072:       }
                   1073:       else
                   1074:       {
                   1075:          // write string
                   1076:          if ( !hmiINIWriteString( sInstance, "No" ) )
                   1077:             return( _FALSE );
                   1078:       }
                   1079: 
                   1080:       // return success
                   1081:       return( _TRUE );
                   1082:        }
                   1083: 
                   1084: /****************************************************************************
                   1085: *
                   1086: *  Syntax
                   1087: *
                   1088: *     BOOL     cdecl hmiINIDeleteItem( _INI_INSTANCE * sInstance, PSTR szItem )
                   1089: *
                   1090: *  Description
                   1091: *
                   1092: *     removes and item from within a section
                   1093: *
                   1094: *  Parameters
                   1095: *
                   1096: *        Type           Description
                   1097: *        --------------------------
                   1098: *        sInstance      pointer to and .ini instance
                   1099: *        szItem         pointer to item string to remove
                   1100: *
                   1101: *  Return
                   1102: *
                   1103: *     _TRUE       item was found and removed
                   1104: *     _FALSE      item was not located
                   1105: *
                   1106: ****************************************************************************/
                   1107: BOOL   cdecl hmiINIDeleteItem( _INI_INSTANCE * sInstance, PSTR szItem )
                   1108:        {
                   1109:       PSTR  pDataPtr;
                   1110:       WORD  wStrSize =  0;
                   1111: 
                   1112:       // locate item within section
                   1113:       if ( !hmiINILocateItem( sInstance, szItem ) )
                   1114:          return( _FALSE );
                   1115: 
                   1116:       // get pointer to data
                   1117:       pDataPtr =  sInstance->pItemPtr;
                   1118: 
                   1119:       // now find the length of the string to delete
                   1120:       while( *(pDataPtr + wStrSize ) != _INI_LF )
                   1121:          wStrSize++;
                   1122: 
                   1123:       // add one to size to include line feed
                   1124:       wStrSize++;
                   1125: 
                   1126:       // perform memory move to delete string
                   1127:       memmove( pDataPtr, pDataPtr + wStrSize, ( sInstance->pData + sInstance->wSize ) - ( pDataPtr + wStrSize ) );
                   1128: 
                   1129:       // adjust size of .ini file
                   1130:       sInstance->wSize  -=    wStrSize;
                   1131: 
                   1132:       // set the modified flag
                   1133:       sInstance->wFlags    |= _INI_MODIFIED;
                   1134: 
                   1135:                // return success
                   1136:       return( _TRUE );
                   1137:        }
                   1138: 
                   1139: /****************************************************************************
                   1140: *
                   1141: *  Syntax
                   1142: *
                   1143: *     BOOL     cdecl hmiINIDeleteSection( _INI_INSTANCE * sInstance, PSTR szSection )
                   1144: *
                   1145: *  Description
                   1146: *
                   1147: *     removes and item from within a section
                   1148: *
                   1149: *  Parameters
                   1150: *
                   1151: *        Type           Description
                   1152: *        --------------------------
                   1153: *        sInstance      pointer to and .ini instance
                   1154: *        szSection      pointer to section to remove
                   1155: *
                   1156: *  Return
                   1157: *
                   1158: *     _TRUE       section was found and removed
                   1159: *     _FALSE      section was not located
                   1160: *
                   1161: ****************************************************************************/
                   1162: BOOL   cdecl hmiINIDeleteSection( _INI_INSTANCE * sInstance, PSTR szSection )
                   1163:        {
                   1164:       PSTR  pDataPtr;
                   1165:       PSTR  pEOFPtr;
                   1166:       WORD  wSize;
                   1167: 
                   1168:       // locate item within section
                   1169:       if ( !hmiINILocateSection( sInstance, szSection ) )
                   1170:          return( _FALSE );
                   1171: 
                   1172:       // get pointer to data
                   1173:       pDataPtr =  sInstance->pSection;
                   1174: 
                   1175:       // set end of file pointer
                   1176:       pEOFPtr  =  sInstance->pData  +  sInstance->wSize;
                   1177: 
                   1178:       // advance szie one past section start to find the start of either the
                   1179:       // next section or the end of file.
                   1180:       wSize =  1;
                   1181: 
                   1182:       // now find the length of the string to delete
                   1183:       while( *(pDataPtr + wSize ) != _INI_SECTION_START && ( pDataPtr + wSize ) < pEOFPtr )
                   1184:          wSize++;
                   1185: 
                   1186:       // perform memory move to delete string
                   1187:       memmove( pDataPtr, pDataPtr + wSize, pEOFPtr - ( pDataPtr + wSize ) );
                   1188: 
                   1189:       // adjust size of .ini file
                   1190:       sInstance->wSize  -=    wSize;
                   1191: 
                   1192:       // set the modified flag
                   1193:       sInstance->wFlags    |= _INI_MODIFIED;
                   1194: 
                   1195:                // return success
                   1196:       return( _TRUE );
                   1197:        }
                   1198: 
                   1199: /****************************************************************************
                   1200: *
                   1201: *  Syntax
                   1202: *
                   1203: *     BOOL     cdecl hmiINIAddSection( _INI_INSTANCE * sInstance, PSTR szSection )
                   1204: *
                   1205: *  Description
                   1206: *
                   1207: *     adds new section [...] to end of current file
                   1208: *
                   1209: *  Parameters
                   1210: *
                   1211: *        Type           Description
                   1212: *        --------------------------
                   1213: *        sInstance      pointer to an .ini instance
                   1214: *        szSection      pointer to name of section to add
                   1215: *
                   1216: *  Return
                   1217: *
                   1218: *     _TRUE    section added to end of file
                   1219: *     _FALSE   not enough memory to add new section or section exists
                   1220: *
                   1221: ****************************************************************************/
                   1222: BOOL   cdecl hmiINIAddSection( _INI_INSTANCE * sInstance, PSTR szSection )
                   1223:        {
                   1224:       PSTR  pDataPtr;
                   1225:       WORD  wSize;
                   1226: 
                   1227:       // check if section exists
                   1228:       if ( hmiINILocateSection( sInstance, szSection ) )
                   1229:          return( _FALSE );
                   1230: 
                   1231:       // get pointer to end of file
                   1232:       pDataPtr =  sInstance->pData + sInstance->wSize;
                   1233: 
                   1234:       // get size of new section name to add, plus
                   1235:       // 8 to account for the CR/LF, start, end, CR/LF
                   1236:       wSize =  strlen( szSection ) + 6;
                   1237: 
                   1238:       // check if there is room to add section
                   1239:       if ( sInstance->wSize + wSize > sInstance->wMaxSize )
                   1240:          return( _FALSE );
                   1241: 
                   1242:       // add CR/LF @ the end of the file
                   1243:       *pDataPtr++ =  _INI_CR;
                   1244:       *pDataPtr++ =  _INI_LF;
                   1245: 
                   1246:       // set current section pointer to here
                   1247:       sInstance->pSection  =  pDataPtr;
                   1248: 
                   1249:       // copy in string start
                   1250:       *pDataPtr++ =  _INI_SECTION_START;
                   1251: 
                   1252:       // copy in string
                   1253:       while( *szSection )
                   1254:          *pDataPtr++ =  *szSection++;
                   1255: 
                   1256:       // copy in string end
                   1257:       *pDataPtr++ =  _INI_SECTION_END;
                   1258:                
                   1259:       // add CR/LF @ the end of the file
                   1260:       *pDataPtr++ =  _INI_CR;
                   1261:       *pDataPtr++ =  _INI_LF;
                   1262: 
                   1263:       // set section list pointer to here
                   1264:       sInstance->pListPtr  =  pDataPtr;
                   1265: 
                   1266:       // set current pointer to here
                   1267:       sInstance->pCurrent  =  pDataPtr;
                   1268: 
                   1269:       // adjust size
                   1270:       sInstance->wSize     += wSize;
                   1271: 
                   1272:       // set the modified flag
                   1273:       sInstance->wFlags    |= _INI_MODIFIED;
                   1274: 
                   1275:       // return success
                   1276:       return( _TRUE );
                   1277: 
                   1278:        }
                   1279: 
                   1280: /****************************************************************************
                   1281: *
                   1282: *  Syntax
                   1283: *
                   1284: *     BOOL     cdecl   hmiINIAddItemString( _INI_INSTANCE * sInstance, PSTR szItem, 
                   1285: *                                      PSTR szString, WORD wJustify )
                   1286: *
                   1287: *  Description
                   1288: *
                   1289: *     adds new item field w/string
                   1290: *
                   1291: *  Parameters
                   1292: *
                   1293: *        Type           Description
                   1294: *        --------------------------
                   1295: *        sInstance      pointer to an .ini instance
                   1296: *        szItem         pointer to item string
                   1297: *        szString       pointer to string 
                   1298: *        wJustify       width of field
                   1299: *
                   1300: *  Return
                   1301: *
                   1302: *     _TRUE    item and string added
                   1303: *     _FALSE   item not added, not enough memory, etc..
                   1304: *
                   1305: ****************************************************************************/
                   1306: BOOL   cdecl   hmiINIAddItemString( _INI_INSTANCE * sInstance, PSTR szItem, PSTR szString, WORD wJustify )
                   1307:        {
                   1308:       PSTR  pDataPtr;
                   1309:       WORD  wSize;
                   1310: 
                   1311:       // check if item exists
                   1312:       if ( hmiINILocateItem( sInstance, szItem ) )
                   1313:       {
                   1314:          // alter string
                   1315:          hmiINIWriteString( sInstance, szString );
                   1316: 
                   1317:          // return success
                   1318:          return( _TRUE );
                   1319:       }
                   1320: 
                   1321:       // get data pointer
                   1322:       pDataPtr    =  sInstance->pCurrent;
                   1323: 
                   1324:       // adjust size to account for item, =, SPACE, STRING, CR/LF
                   1325:       wSize       =  wJustify + 4 + strlen( szString );
                   1326: 
                   1327:       // check if there is room to add item/string
                   1328:       if ( sInstance->wSize + wSize > sInstance->wMaxSize )
                   1329:          return( _FALSE );
                   1330: 
                   1331:       // make room in memory
                   1332:       memmove( pDataPtr + wSize, pDataPtr, ( sInstance->pData + sInstance->wSize ) - pDataPtr );
                   1333: 
                   1334:       // copy in new item string
                   1335:       while( *szItem )
                   1336:       {
                   1337:          // copy in character into .ini
                   1338:          *pDataPtr++ =  *szItem++;
                   1339: 
                   1340:          // decrement justify characters
                   1341:          wJustify--;
                   1342:       }
                   1343: 
                   1344:       // fill in the rest of the white space to 
                   1345:       // justify item
                   1346:       while( wJustify-- )
                   1347:          *pDataPtr++ =  _INI_SPACE;
                   1348: 
                   1349:       // fill in the = sign and an extra space
                   1350:       *pDataPtr++    =  _INI_EQUATE;
                   1351:       *pDataPtr++    =  _INI_SPACE;
                   1352: 
                   1353:       // copy in the string
                   1354:       while( *szString )
                   1355:          *pDataPtr++ =  *szString++;
                   1356: 
                   1357:       // add in CR/LF
                   1358:       *pDataPtr++    =  _INI_CR;
                   1359:       *pDataPtr++    =  _INI_LF;
                   1360: 
                   1361:       // adjust size
                   1362:       sInstance->wSize     += wSize;
                   1363: 
                   1364:       // set the modified flag
                   1365:       sInstance->wFlags    |= _INI_MODIFIED;
                   1366: 
                   1367:       // return success
                   1368:       return( _TRUE );
                   1369: 
                   1370:        }
                   1371: 
                   1372: /****************************************************************************
                   1373: *
                   1374: *  Syntax
                   1375: *
                   1376: *     BOOL     cdecl   hmiINIAddItemDecimal( _INI_INSTANCE * sInstance, PSTR szItem, 
                   1377: *                                      WORD wValue, WORD wJustify, WORD wRadix )
                   1378: *
                   1379: *  Description
                   1380: *
                   1381: *     adds new item field w/decimal
                   1382: *
                   1383: *  Parameters
                   1384: *
                   1385: *        Type           Description
                   1386: *        --------------------------
                   1387: *        sInstance      pointer to an .ini instance
                   1388: *        szItem         pointer to item string
                   1389: *        wValue         value to write out
                   1390: *        wJustify       width of field
                   1391: *        wRadix         radix (base) of field
                   1392: *
                   1393: *  Return
                   1394: *
                   1395: *     _TRUE    item and string added
                   1396: *     _FALSE   item not added, not enough memory, etc..
                   1397: *
                   1398: ****************************************************************************/
                   1399: BOOL   cdecl   hmiINIAddItemDecimal(   _INI_INSTANCE * sInstance,
                   1400:                                     PSTR  szItem, 
                   1401:                                     WORD  wValue, 
                   1402:                                     WORD  wJustify,
                   1403:                                     WORD  wRadix )
                   1404:        {
                   1405:       PSTR  pDataPtr;
                   1406:       WORD  wSize;
                   1407:       WORD  wIndex;
                   1408:       BYTE  szBuffer[ 32 ];
                   1409: 
                   1410:       // check if item exists
                   1411:       if ( hmiINILocateItem( sInstance, szItem ) )
                   1412:       {
                   1413:          // alter string
                   1414:          hmiINIWriteDecimal( sInstance, wValue );
                   1415: 
                   1416:          // return success
                   1417:          return( _TRUE );
                   1418:       }
                   1419: 
                   1420:       // convert decimal to string
                   1421:       if ( wRadix == 16 )
                   1422:       {
                   1423:          // add hex '0x' preceeding value
                   1424:          szBuffer[ 0 ]  =  '0';
                   1425:          szBuffer[ 1 ]  =  'x';
                   1426: 
                   1427:          // convert to hex
                   1428:          itoa( wValue, (PSTR)&szBuffer[ 2 ], 16 );
                   1429:       }
                   1430:       else
                   1431:          itoa( wValue, (PSTR)&szBuffer[ 0 ], 10 );
                   1432: 
                   1433:       // get data pointer
                   1434:       pDataPtr    =  sInstance->pCurrent;
                   1435: 
                   1436:       // adjust size to account for item, =, SPACE, STRING, CR/LF
                   1437:       wSize       =  wJustify + 4 + strlen( szBuffer );
                   1438: 
                   1439:       // check if there is room to add item/string
                   1440:       if ( sInstance->wSize + wSize > sInstance->wMaxSize )
                   1441:          return( _FALSE );
                   1442: 
                   1443:       // make room in memory
                   1444:       memmove( pDataPtr + wSize, pDataPtr, ( sInstance->pData + sInstance->wSize ) - pDataPtr );
                   1445: 
                   1446:       // copy in new item string
                   1447:       while( *szItem )
                   1448:       {
                   1449:          // copy in character into .ini
                   1450:          *pDataPtr++ =  *szItem++;
                   1451: 
                   1452:          // decrement justify characters
                   1453:          wJustify--;
                   1454:       }
                   1455: 
                   1456:       // fill in the rest of the white space to 
                   1457:       // justify item
                   1458:       while( wJustify-- )
                   1459:          *pDataPtr++ =  _INI_SPACE;
                   1460: 
                   1461:       // fill in the = sign and an extra space
                   1462:       *pDataPtr++    =  _INI_EQUATE;
                   1463:       *pDataPtr++    =  _INI_SPACE;
                   1464: 
                   1465:       // reset index
                   1466:       wIndex   =  0;
                   1467: 
                   1468:       // copy in the string
                   1469:       while( szBuffer[ wIndex ] )
                   1470:          *pDataPtr++ =  szBuffer[ wIndex++ ];
                   1471: 
                   1472:       // add in CR/LF
                   1473:       *pDataPtr++    =  _INI_CR;
                   1474:       *pDataPtr++    =  _INI_LF;
                   1475: 
                   1476:       // adjust size
                   1477:       sInstance->wSize     += wSize;
                   1478: 
                   1479:       // set the modified flag
                   1480:       sInstance->wFlags    |= _INI_MODIFIED;
                   1481: 
                   1482:       // return success
                   1483:       return( _TRUE );
                   1484: 
                   1485:        }
                   1486: 
                   1487: /****************************************************************************
                   1488: *
                   1489: *  Syntax
                   1490: *
                   1491: *     WORD     hmiINIHex2Decimal( PSTR szHexValue )
                   1492: *
                   1493: *  Description
                   1494: *
                   1495: *     Converts passed number to hex
                   1496: *
                   1497: *  Parameters
                   1498: *
                   1499: *        Type           Description
                   1500: *        --------------------------
                   1501: *        szHexValue     pointer to the string containing hex value
                   1502: *
                   1503: *  Return
                   1504: *
                   1505: *     decimal value of hex number
                   1506: *
                   1507: ****************************************************************************/
                   1508: WORD   hmiINIHex2Decimal( PSTR szHexValue )
                   1509:        {
                   1510:       WORD  wDecimal    =  0;
                   1511:       WORD     wPlaces     =  strlen( szHexValue );
                   1512:       WORD     wMultIndex;
                   1513:       WORD     wIndex      =  0;
                   1514: 
                   1515:                // count down
                   1516:       do
                   1517:          {
                   1518:             // accumulate value
                   1519:             wDecimal += wMultiplier[ wPlaces - 1 ] * hmiINIGetHexIndex( (BYTE)szHexValue[ wIndex++ ] );
                   1520: 
                   1521:             // decrement places
                   1522:             wPlaces--;
                   1523:          }
                   1524:       while( wPlaces > 0 );
                   1525: 
                   1526:       // return decimal
                   1527:       return( wDecimal );
                   1528:        }
                   1529: 
                   1530: /****************************************************************************
                   1531: *
                   1532: *  Syntax
                   1533: *
                   1534: *     WORD     hmiINIGetHexIndex( BYTE bValue )
                   1535: *
                   1536: *  Description
                   1537: *
                   1538: *     Get the index of a hex character
                   1539: *
                   1540: *  Parameters
                   1541: *
                   1542: *        Type           Description
                   1543: *        --------------------------
                   1544: *        bValue         value to located
                   1545: *
                   1546: *  Return
                   1547: *
                   1548: *     index into table of hex value
                   1549: *
                   1550: ****************************************************************************/
                   1551: WORD   hmiINIGetHexIndex( BYTE bValue )
                   1552:        {
                   1553:                WORD    wIndex;
                   1554: 
                   1555:       // search
                   1556:       for ( wIndex = 0; wIndex < 16; wIndex++ )
                   1557:          if ( szHexNumbers[ wIndex ] == toupper( bValue ) )
                   1558:             return( wIndex );
                   1559: 
                   1560:       // error return
                   1561:       return( -1 );
                   1562:        }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.