Annotation of mstools/samples/sdktools/mc/mcutil.c, revision 1.1

1.1     ! root        1: /*++
        !             2: 
        !             3: Copyright (c) 1991  Microsoft Corporation
        !             4: 
        !             5: Module Name:
        !             6: 
        !             7:     mcutil.c
        !             8: 
        !             9: Abstract:
        !            10: 
        !            11:     This file contains utility functions for the Win32 Message Compiler (MC)
        !            12: 
        !            13: --*/
        !            14: 
        !            15: #include "mc.h"
        !            16: 
        !            17: 
        !            18: /*++
        !            19: 
        !            20: Routine Description:
        !            21: 
        !            22:     This routine simply writes/overwrites Name, ID and Value
        !            23:     to a link list of NAME_INFO structures.
        !            24: 
        !            25: Arguments:
        !            26: 
        !            27:     PNAME_INFO
        !            28:     Keyword such as "Facility", "Serverity", ...
        !            29:     Lauguage Identifier; a combination of a Primary Language ID,
        !            30:     Sublanguage ID pair such as LANG_NEUTRAL, SUBLANG_NEUTRAL
        !            31:     An option value specfic to the keyword.
        !            32: 
        !            33: Return Value:
        !            34: 
        !            35:     The list PNAME_INFO
        !            36: 
        !            37: --*/
        !            38: 
        !            39: PNAME_INFO
        !            40: McAddName(
        !            41:     PNAME_INFO *NameListHead,
        !            42:     char *Name,
        !            43:     ULONG Id,
        !            44:     PVOID Value
        !            45:     )
        !            46: {
        !            47:     PNAME_INFO p;
        !            48:     int n;
        !            49: 
        !            50:     while (p = *NameListHead) {
        !            51:         if (!(n = stricmp( p->Name, Name ))) {
        !            52:             if (p->Id != Id) {
        !            53:                 McInputError( "Redefining value of %s", FALSE, Name );
        !            54:                 }
        !            55: 
        !            56:             p->Id = Id;
        !            57:             p->Value = Value;
        !            58:             p->Used = FALSE;
        !            59:             return( p );
        !            60:             }
        !            61:         else
        !            62:         if (n < 0) {
        !            63:             break;
        !            64:             }
        !            65: 
        !            66:         NameListHead = &p->Next;
        !            67:         }
        !            68: 
        !            69:     p = malloc( sizeof( *p ) + strlen( Name ) );
        !            70:     p->LastId = 0;
        !            71:     p->Id = Id;
        !            72:     p->Value = Value;
        !            73:     p->Used = FALSE;
        !            74:     strcpy( p->Name, Name );
        !            75:     p->Next = *NameListHead;
        !            76:     *NameListHead = p;
        !            77:     return( p );
        !            78: }
        !            79: 
        !            80: 
        !            81: 
        !            82: /*++
        !            83: 
        !            84: Routine Description:
        !            85: 
        !            86:     This routine returns the NAME_INFO structure cooresponding to the
        !            87:     given Keyword.
        !            88: 
        !            89: Arguments:
        !            90: 
        !            91:     PNAME_INFO
        !            92:     Keyword such as "Facility", "Serverity", ...
        !            93: 
        !            94: Return Value:
        !            95: 
        !            96:     Either the NAME_INFO structure cooresponding to the keyname or NULL
        !            97: 
        !            98: --*/
        !            99: 
        !           100: 
        !           101: PNAME_INFO
        !           102: McFindName(
        !           103:     PNAME_INFO NameListHead,
        !           104:     char *Name
        !           105:     )
        !           106: {
        !           107:     PNAME_INFO p;
        !           108: 
        !           109:     p = NameListHead;
        !           110:     while (p) {
        !           111:         if (!stricmp( p->Name, Name )) {
        !           112:             p->Used = TRUE;
        !           113:             break;
        !           114:             }
        !           115: 
        !           116:         p = p->Next;
        !           117:         }
        !           118: 
        !           119:     return( p );
        !           120: }
        !           121: 
        !           122: 
        !           123: 
        !           124: /*++
        !           125: 
        !           126: Routine Description:
        !           127: 
        !           128:     This converts a string value to the corresponding integer value
        !           129:     in the specified base.
        !           130: 
        !           131: Arguments:
        !           132: 
        !           133:     String image of an integer
        !           134:     Base of resultant integer
        !           135:     Pointer to a unsigned long
        !           136: 
        !           137: 
        !           138: Return Value:
        !           139: 
        !           140:     A unsigned long
        !           141: 
        !           142: --*/
        !           143: 
        !           144: BOOLEAN
        !           145: McCharToInteger(
        !           146:     PCHAR String,
        !           147:     int Base,
        !           148:     PULONG Value
        !           149:     )
        !           150: {
        !           151:     CHAR c;
        !           152:     ULONG Result, Digit, Shift;
        !           153: 
        !           154:     c = *String++;
        !           155:     if (!Base) {
        !           156:         Base = 10;
        !           157:         Shift = 0;
        !           158:         if (c == '0') {
        !           159:             c = *String++;
        !           160:             if (c == 'x') {
        !           161:                 Base = 16;
        !           162:                 Shift = 4;
        !           163:                 }
        !           164:             else
        !           165:             if (c == 'o') {
        !           166:                 Base = 8;
        !           167:                 Shift = 3;
        !           168:                 }
        !           169:             else
        !           170:             if (c == 'b') {
        !           171:                 Base = 2;
        !           172:                 Shift = 1;
        !           173:                 }
        !           174:             else {
        !           175:                 String--;
        !           176:                 }
        !           177: 
        !           178:             c = *String++;
        !           179:             }
        !           180:         }
        !           181:     else {
        !           182:         switch( Base ) {
        !           183:             case 16:    Shift = 4;  break;
        !           184:             case  8:    Shift = 3;  break;
        !           185:             case  2:    Shift = 1;  break;
        !           186:             case 10:    Shift = 0;  break;
        !           187:             default:    return( FALSE );
        !           188:             }
        !           189:         }
        !           190: 
        !           191:     Result = 0;
        !           192:     while (c) {
        !           193:         if (c >= '0' && c <= '9') {
        !           194:             Digit = c - '0';
        !           195:             }
        !           196:         else
        !           197:         if (c >= 'A' && c <= 'F') {
        !           198:             Digit = c - 'A' + 10;
        !           199:             }
        !           200:         else
        !           201:         if (c >= 'a' && c <= 'f') {
        !           202:             Digit = c - 'a' + 10;
        !           203:             }
        !           204:         else {
        !           205:             break;
        !           206:             }
        !           207: 
        !           208:         if ((int)Digit >= Base) {
        !           209:             break;
        !           210:             }
        !           211: 
        !           212:         if (Shift == 0) {
        !           213:             Result = (Base * Result) + Digit;
        !           214:             }
        !           215:         else {
        !           216:             Result = (Result << Shift) | Digit;
        !           217:             }
        !           218: 
        !           219:         c = *String++;
        !           220:         }
        !           221: 
        !           222:     *Value = Result;
        !           223:     return( TRUE );
        !           224: }
        !           225: 
        !           226: /*++
        !           227: 
        !           228: Routine Description:
        !           229: 
        !           230:     Duplicates a string
        !           231: 
        !           232: Arguments:
        !           233: 
        !           234:     A string value
        !           235: 
        !           236: Return Value:
        !           237: 
        !           238:     The duplicated string value
        !           239: 
        !           240: --*/
        !           241: 
        !           242: 
        !           243: char *
        !           244: McMakeString(
        !           245:     char *String
        !           246:     )
        !           247: {
        !           248:     char *s;
        !           249: 
        !           250:     s = malloc( strlen( String ) + 1 );
        !           251:     strcpy( s, String );
        !           252:     return( s );
        !           253: }

unix.superglobalmegacorp.com

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