/* Copyright (C) Boris Nikolaus, Germany, 1996-1997. All rights reserved. */ /* Copyright (C) Microsoft Corporation, 1997-1998. All rights reserved. */ #include "precomp.h" #include "hackdir.h" #ifdef MS_DIRECTIVE int g_fPrivateDir_FieldNameToken = 0; int g_fPrivateDir_TypeNameToken = 0; int g_fPrivateDir_ValueNameToken = 0; int g_fPrivateDir_SLinked = 0; int g_fPrivateDir_DLinked = 0; int g_fPrivateDir_Public = 0; int g_fPrivateDir_Intx = 0; int g_fPrivateDir_LenPtr = 0; int g_fPrivateDir_Pointer = 0; int g_fPrivateDir_Array = 0; int g_fPrivateDir_NoCode = 0; int g_fPrivateDir_NoMemCopy = 0; int g_fPrivateDir_OidPacked = 0; int g_fPrivateDir_OidArray = 0; char g_szPrivateDirectedFieldName[64]; char g_szPrivateDirectedTypeName[64]; char g_szPrivateDirectedValueName[64]; int My_toupper ( int ch ) { if ('a' <= ch && ch <= 'z') { ch = (ch - 'a' + 'A'); } return ch; } int PrivateDirectives_MatchSymbol ( int *p, char *psz ) { int c = *p; int fMatched = 1; while (*psz != '\0') { if (My_toupper(c) != *psz++) { fMatched = 0; break; } c = PrivateDirectives_Input(); } *p = c; return fMatched; } void PrivateDirectives_SkipSpace ( int *p ) { int c = *p; while (isspace(c)) { c = PrivateDirectives_Input(); } *p = c; } void PrivateDirectives_GetSymbol ( int *p, char *psz ) { int c = *p; while (c == '_' || isalnum(c)) { *psz++ = (char)c; c = PrivateDirectives_Input(); } *psz = '\0'; *p = c; } void PrivateDirectives_IgnoreSymbol ( int *p ) { int c = *p; while (c == '_' || isalnum(c)) { c = PrivateDirectives_Input(); } *p = c; } void GetMicrosoftDirective ( int *p ) { int c = *p; // loop through to get all directives while (c != g_chDirectiveEnd) { if (c == g_chDirectiveAND) { c = PrivateDirectives_Input(); PrivateDirectives_SkipSpace(&c); } switch (My_toupper(c)) { case 'A': // possible ARRAY if (PrivateDirectives_MatchSymbol(&c, "ARRAY")) { g_fPrivateDir_Array = 1; } break; case 'D': // possible DLINKED if (PrivateDirectives_MatchSymbol(&c, "DLINKED")) { g_fPrivateDir_DLinked = 1; } break; case 'F': // possible FNAME if (PrivateDirectives_MatchSymbol(&c, "FIELD")) { // c should be a space now PrivateDirectives_SkipSpace(&c); // c should be a double quote now if (c == '"') { c = PrivateDirectives_Input(); } // c should be the first char of name PrivateDirectives_GetSymbol(&c, &g_szPrivateDirectedFieldName[0]); g_fPrivateDir_FieldNameToken = 0; } break; case 'I': // possible INTX if (PrivateDirectives_MatchSymbol(&c, "INTX")) { g_fPrivateDir_Intx = 1; } break; case 'L': // possible LENPTR if (PrivateDirectives_MatchSymbol(&c, "LENPTR")) { g_fPrivateDir_LenPtr = 1; } break; case 'N': // possible NO MEMCPY (or NOMEMCPY) or NO CODE (or NOCODE) if (PrivateDirectives_MatchSymbol(&c, "NO")) { // skip over possible spaces PrivateDirectives_SkipSpace(&c); switch (My_toupper(c)) { case 'C': if (PrivateDirectives_MatchSymbol(&c, "CODE")) // CODE { g_fPrivateDir_NoCode = 1; } break; case 'M': if (PrivateDirectives_MatchSymbol(&c, "MEMCPY")) // MEMCPY { g_fPrivateDir_NoMemCopy = 1; } break; } } break; case 'O': // possible OID ARRAY (or OIDARRAY) or OID PACKED (or OIDPACKED) if (PrivateDirectives_MatchSymbol(&c, "OID")) { // skip over possible spaces PrivateDirectives_SkipSpace(&c); switch (My_toupper(c)) { case 'A': if (PrivateDirectives_MatchSymbol(&c, "ARRAY")) // ARRAY { g_fPrivateDir_OidArray = 1; } break; case 'P': if (PrivateDirectives_MatchSymbol(&c, "PACKED")) // PACKED { g_fPrivateDir_OidPacked = 1; } break; } } break; case 'P': // possible POINTER or PUBLIC c = PrivateDirectives_Input(); switch (My_toupper(c)) { case 'O': if (PrivateDirectives_MatchSymbol(&c, "OINTER")) // POINTER { g_fPrivateDir_Pointer = 1; } break; case 'U': if (PrivateDirectives_MatchSymbol(&c, "UBLIC")) // PUBLIC { g_fPrivateDir_Public = 1; } break; } break; case 'S': // possible SLINKED if (PrivateDirectives_MatchSymbol(&c, "SLINKED")) { g_fPrivateDir_SLinked = 1; } break; case 'T': // possible TNAME if (PrivateDirectives_MatchSymbol(&c, "TYPE")) { // c should be a space now PrivateDirectives_SkipSpace(&c); // c should be a double quote now if (c == '"') { c = PrivateDirectives_Input(); } // c should be the first char of name PrivateDirectives_GetSymbol(&c, &g_szPrivateDirectedTypeName[0]); g_fPrivateDir_TypeNameToken = 0; } break; case 'V': // possible VNAME if (PrivateDirectives_MatchSymbol(&c, "VALUE")) { // c should be a space now PrivateDirectives_SkipSpace(&c); // c should be a double quote now if (c == '"') { c = PrivateDirectives_Input(); } // c should be the first char of name PrivateDirectives_GetSymbol(&c, &g_szPrivateDirectedValueName[0]); g_fPrivateDir_ValueNameToken = 0; } break; default: goto MyExit; } // determine if we should stay in the loop // skip over the ending double quote if (c == '"') { c = PrivateDirectives_Input(); } // skip over unknown directives PrivateDirectives_IgnoreSymbol(&c); // skip over possible spaces PrivateDirectives_SkipSpace(&c); } // now, c is >. we need to advance to -- c = PrivateDirectives_Input(); // now, c should be - MyExit: // return the current character *p = c; } void GetPrivateDirective ( int *p ) { GetMicrosoftDirective(p); } typedef struct Verbatim_s { struct Verbatim_s *next; char pszVerbatim[1]; } Verbatim_t; Verbatim_t *g_VerbatimList = NULL; void RememberVerbatim(char *pszVerbatim) { int cb = strlen(pszVerbatim) + 1; Verbatim_t *p = (Verbatim_t *) malloc(sizeof(Verbatim_t) + cb); if (p) { memcpy(p->pszVerbatim, pszVerbatim, cb); p->next = NULL; if (g_VerbatimList) { Verbatim_t *q; for (q = g_VerbatimList; q->next; q = q->next) ; q->next = p; } else { g_VerbatimList = p; } } } void PrintVerbatim(void) { Verbatim_t *p; for (p = g_VerbatimList; p; p = p->next) { output("/* %s */\n", p->pszVerbatim); } if (g_VerbatimList) { output("\n"); } } int CompareDirective(char *pszDirective, char *pszInput) { int rc; int len = strlen(pszDirective); char ch = pszInput[len]; pszInput[len] = '\0'; rc = strcmpi(pszDirective, pszInput); pszInput[len] = ch; return rc; } void SetDirective(char *pszInput) { // verbatim strings const char szComment[] = "COMMENT"; if (! CompareDirective((char *) &szComment[0], pszInput)) { pszInput += sizeof(szComment) - 1; if (isspace(*pszInput)) { pszInput++; if ('"' == *pszInput++) { char *pszEnd = strchr(pszInput, '"'); if (pszEnd) { *pszEnd = '\0'; RememberVerbatim(pszInput); *pszEnd = '"'; } } } return; } // object identifier if (! CompareDirective("OID ARRAY", pszInput)) { g_fOidArray = 1; return; } // set of/sequence of w/o size constraint if (! CompareDirective("SS.basic SLINKED", pszInput)) { g_eDefTypeRuleSS_NonSized = eTypeRules_SinglyLinkedList; return; } if (! CompareDirective("SS.basic DLINKED", pszInput)) { g_eDefTypeRuleSS_NonSized = eTypeRules_DoublyLinkedList; return; } if (! CompareDirective("SS.basic LENPTR", pszInput)) { g_eDefTypeRuleSS_NonSized = eTypeRules_LengthPointer; return; } if (! CompareDirective("SS.basic ARRAY", pszInput)) { g_eDefTypeRuleSS_NonSized = eTypeRules_FixedArray; return; } // set of/sequence of w/ size constraint if (! CompareDirective("SS.sized SLINKED", pszInput)) { g_eDefTypeRuleSS_Sized = eTypeRules_SinglyLinkedList; return; } if (! CompareDirective("SS.sized DLINKED", pszInput)) { g_eDefTypeRuleSS_Sized = eTypeRules_DoublyLinkedList; return; } if (! CompareDirective("SS.sized LENPTR", pszInput)) { g_eDefTypeRuleSS_Sized = eTypeRules_LengthPointer; return; } if (! CompareDirective("SS.sized ARRAY", pszInput)) { g_eDefTypeRuleSS_Sized = eTypeRules_FixedArray; return; } // set extra pointer type for SS construct, its struct name will be postfixed with _s if (! CompareDirective("SS.struct EXTRA-PTR-TYPE", pszInput)) { g_fExtraStructPtrTypeSS = 1; return; } } #endif // MS_DIRECTIVE