MCUTIL.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:4k
源码类别:

Windows编程

开发平台:

Visual C++

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