home *** CD-ROM | disk | FTP | other *** search
- /*++
-
- Copyright (c) 1991-1997 Microsoft Corporation
-
- Module Name:
-
- mcutil.c
-
- Abstract:
-
- This file contains utility functions for the Win32 Message Compiler (MC)
-
- --*/
-
- #include "mc.h"
-
-
- /*++
-
- Routine Description:
-
- This routine simply writes/overwrites Name, ID and Value
- to a link list of NAME_INFO structures.
-
- Arguments:
-
- PNAME_INFO
- Keyword such as "Facility", "Serverity", ...
- Lauguage Identifier; a combination of a Primary Language ID,
- Sublanguage ID pair such as LANG_NEUTRAL, SUBLANG_NEUTRAL
- An option value specfic to the keyword.
-
- Return Value:
-
- The list PNAME_INFO
-
- --*/
-
- PNAME_INFO
- McAddName(
- PNAME_INFO *NameListHead,
- char *Name,
- ULONG Id,
- PVOID Value
- )
- {
- PNAME_INFO p;
- int n;
-
- while (p = *NameListHead) {
- if (!(n = stricmp( p->Name, Name ))) {
- if (p->Id != Id) {
- McInputError( "Redefining value of %s", FALSE, Name );
- }
-
- p->Id = Id;
- p->Value = Value;
- p->Used = FALSE;
- return( p );
- }
- else
- if (n < 0) {
- break;
- }
-
- NameListHead = &p->Next;
- }
-
- p = malloc( sizeof( *p ) + strlen( Name ) );
- p->LastId = 0;
- p->Id = Id;
- p->Value = Value;
- p->Used = FALSE;
- strcpy( p->Name, Name );
- p->Next = *NameListHead;
- *NameListHead = p;
- return( p );
- }
-
-
-
- /*++
-
- Routine Description:
-
- This routine returns the NAME_INFO structure cooresponding to the
- given Keyword.
-
- Arguments:
-
- PNAME_INFO
- Keyword such as "Facility", "Serverity", ...
-
- Return Value:
-
- Either the NAME_INFO structure cooresponding to the keyname or NULL
-
- --*/
-
-
- PNAME_INFO
- McFindName(
- PNAME_INFO NameListHead,
- char *Name
- )
- {
- PNAME_INFO p;
-
- p = NameListHead;
- while (p) {
- if (!stricmp( p->Name, Name )) {
- p->Used = TRUE;
- break;
- }
-
- p = p->Next;
- }
-
- return( p );
- }
-
-
-
- /*++
-
- Routine Description:
-
- This converts a string value to the corresponding integer value
- in the specified base.
-
- Arguments:
-
- String image of an integer
- Base of resultant integer
- Pointer to a unsigned long
-
-
- Return Value:
-
- A unsigned long
-
- --*/
-
- BOOLEAN
- McCharToInteger(
- PCHAR String,
- int Base,
- PULONG Value
- )
- {
- CHAR c;
- ULONG Result, Digit, Shift;
-
-
- c = *String;
- String = CharNext(String);
- if (!Base) {
- Base = 10;
- Shift = 0;
- if (c == '0') {
- c = *String++;
- if (c == 'x') {
- Base = 16;
- Shift = 4;
- }
- else
- if (c == 'o') {
- Base = 8;
- Shift = 3;
- }
- else
- if (c == 'b') {
- Base = 2;
- Shift = 1;
- }
- else {
- String--;
- }
-
- c = *String++;
- }
- }
- else {
- switch( Base ) {
- case 16: Shift = 4; break;
- case 8: Shift = 3; break;
- case 2: Shift = 1; break;
- case 10: Shift = 0; break;
- default: return( FALSE );
- }
- }
-
- Result = 0;
- while (c) {
- if (c >= '0' && c <= '9') {
- Digit = c - '0';
- }
- else
- if (c >= 'A' && c <= 'F') {
- Digit = c - 'A' + 10;
- }
- else
- if (c >= 'a' && c <= 'f') {
- Digit = c - 'a' + 10;
- }
- else {
- break;
- }
-
- if ((int)Digit >= Base) {
- break;
- }
-
- if (Shift == 0) {
- Result = (Base * Result) + Digit;
- }
- else {
- Result = (Result << Shift) | Digit;
- }
-
-
- c = *String;
- String = CharNext(String);
- }
-
- *Value = Result;
- return( TRUE );
- }
-
- /*++
-
- Routine Description:
-
- Duplicates a string
-
- Arguments:
-
- A string value
-
- Return Value:
-
- The duplicated string value
-
- --*/
-
-
- char *
- McMakeString(
- char *String
- )
- {
- char *s;
-
- s = malloc( strlen( String ) + 1 );
- strcpy( s, String );
- return( s );
- }
-