char* SearchFile (const SearchPaths* P, const char* File) /* Search for a file in a list of directories. Return a pointer to a malloced ** area that contains the complete path, if found, return 0 otherwise. */ { char* Name = 0; StrBuf PathName = AUTO_STRBUF_INITIALIZER; /* Start the search */ unsigned I; for (I = 0; I < CollCount (P); ++I) { /* Copy the next path element into the buffer */ SB_CopyStr (&PathName, CollConstAt (P, I)); /* Add a path separator and the filename */ if (SB_NotEmpty (&PathName)) { SB_AppendChar (&PathName, '/'); } SB_AppendStr (&PathName, File); SB_Terminate (&PathName); /* Check if this file exists */ if (access (SB_GetBuf (&PathName), 0) == 0) { /* The file exists, we're done */ Name = xstrdup (SB_GetBuf (&PathName)); break; } } /* Cleanup and return the result of the search */ SB_Done (&PathName); return Name; }
void TranslateLiteralPool (unsigned Offs) /* Translate the literals starting from the given offset into the target * charset. */ { TgtTranslateBuf (SB_GetBuf (&LiteralPool) + Offs, SB_GetLen (&LiteralPool) - Offs); }
void TgtTranslateStrBuf (StrBuf* Buf) /* Translate a string buffer from the source character set into the target * system character set. */ { TgtTranslateBuf (SB_GetBuf (Buf), SB_GetLen (Buf)); }
static int ValidateType (StrBuf* Type) /* Check if the given type is valid and if so, return a string id for it. If ** the type isn't valid, return -1. Type is overwritten when checking. */ { unsigned I; const char* A; char* B; /* The length must not be zero and divideable by two */ unsigned Length = SB_GetLen (Type); if (Length < 2 || (Length & 0x01) != 0) { ErrorSkip ("Type value has invalid length"); return -1; } /* The string must consist completely of hex digit chars */ A = SB_GetConstBuf (Type); for (I = 0; I < Length; ++I) { if (!IsXDigit (A[I])) { ErrorSkip ("Type value contains invalid characters"); return -1; } } /* Convert the type to binary */ B = SB_GetBuf (Type); while (A < SB_GetConstBuf (Type) + Length) { /* Since we know, there are only hex digits, there can't be any errors */ *B++ = (HexValue (A[0]) << 4) | HexValue (A[1]); A += 2; } Type->Len = (Length /= 2); /* Allocate the type and return it */ return GetStrBufId (Type); }
void TranslateLiteral (Literal* L) /* Translate a literal into the target charset. */ { TgtTranslateBuf (SB_GetBuf (&L->Data), SB_GetLen (&L->Data)); }
static void LineMarkerOrComment () /* Handle a line beginning with '#'. Possible interpretations are: ** - #line <lineno> ["<filename>"] (C preprocessor input) ** - # <lineno> "<filename>" [<flag>]... (gcc preprocessor output) ** - #<comment> */ { unsigned long LineNo = 0; int LineDirective = 0; StrBuf SrcNameBuf = AUTO_STRBUF_INITIALIZER; /* Skip the first "# " */ NextChar (); SkipBlanks (1); /* Check "line" */ if (C == 'l') { char MaybeLine [6]; unsigned I; for (I = 0; I < sizeof MaybeLine - 1 && C != EOF && IsAlNum (C); ++I) { MaybeLine [I] = C; NextChar (); } MaybeLine [I] = 0; if (strcmp (MaybeLine, "line") != 0) { goto NotMarker; } LineDirective = 1; SkipBlanks (1); } /* Get line number */ if (C == EOF || !IsDigit (C)) { goto NotMarker; } LineNo = GetDecimalToken (); SkipBlanks (1); /* Get the source file name */ if (C != '\"') { /* The source file name is missing */ if (LineDirective && C == '\n') { /* got #line <lineno> */ NextChar (); InputLine = LineNo; goto Last; } else { goto NotMarker; } } NextChar (); while (C != EOF && C != '\n' && C != '\"') { char DecodeBuf [2]; unsigned I = 0; if (GetEncodedChar (DecodeBuf, &I, sizeof DecodeBuf) < 0) { goto BadMarker; } SB_AppendBuf (&SrcNameBuf, DecodeBuf, I); } if (C != '\"') { goto BadMarker; } NextChar (); /* Ignore until the end of line */ while (C != EOF && C != '\n') { NextChar (); } /* Accepted a line marker */ SB_Terminate (&SrcNameBuf); xfree (InputSrcName); InputSrcName = SB_GetBuf (&SrcNameBuf); SB_Init (&SrcNameBuf); InputLine = (unsigned)LineNo; NextChar (); goto Last; BadMarker: InfoWarning ("Bad line marker"); NotMarker: while (C != EOF && C != '\n') { NextChar (); } NextChar (); Last: SB_Done (&SrcNameBuf); }