X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/80e2389990082500d76eb566d4946be3e786c3ef..d8f41ccd20de16f8ebe2ccc84d47bf1cb2b26bbb:/SecurityTests/cspxutils/genErrorStrings/genErrorStrings.cpp diff --git a/SecurityTests/cspxutils/genErrorStrings/genErrorStrings.cpp b/SecurityTests/cspxutils/genErrorStrings/genErrorStrings.cpp new file mode 100644 index 00000000..35e6e8dc --- /dev/null +++ b/SecurityTests/cspxutils/genErrorStrings/genErrorStrings.cpp @@ -0,0 +1,211 @@ +/* + * genErrorStrings.cpp - parse supplied files, generate error table from + * them of the following form: + * + * typedef struct { + * CSSM_RETURN errCode; + * const char *errStr; + * } ErrString; + * + * ErrString errStrings[] = { + * { CSSMERR_CSSM_INTERNAL_ERROR, "CSSMERR_CSSM_INTERNAL_ERROR" }, + * ... + * { CSSMERR_CSP_FUNCTION_FAILED, "CSSMERR_CSP_FUNCTION_FAILED" } + * }; + * + * The error table is written to stdout. + */ + +#include +#include +#include +#include +#include +#include "fileIo.h" + +#define MAX_LINE_LEN 256 + +static void usage(char **argv) +{ + printf("usage: %s inFile [inFile...]\n", argv[0]); + exit(1); +} + +static void writePreamble( + FILE *f) +{ + fprintf(f, "/*\n"); + fprintf(f, " * This file autogenerated by genErrorStrings. Do not edit. \n"); + fprintf(f, " */\n\n"); + fprintf(f, "#include \n\n"); + fprintf(f, "typedef struct {\n"); + fprintf(f, "\tCSSM_RETURN errCode;\n"); + fprintf(f, "\tconst char *errStr;\n"); + fprintf(f, "} ErrString;\n\n"); + fprintf(f, "static const ErrString errStrings[] = {\n"); +} + +static void writePostamble( + FILE *f) +{ + /* generate a null entry as terminator */ + fprintf(f, "\t{0, NULL}\n"); + fprintf(f, "};\n"); +} + +static void writeToken( + const char *token, + FILE *f) +{ + printf("\t{ %s,\"%s\"},\n", token, token); +} + +/* skip whitespace (but not line terminators) */ +static void skipWhite( + const char *&cp, + unsigned &bytesLeft) +{ + while(bytesLeft != 0) { + switch(*cp) { + case ' ': + case '\t': + cp++; + bytesLeft--; + break; + default: + return; + } + } +} + +static void getLine( + const char *&cp, // IN/OUT + unsigned &bytesLeft, // IN/OUT bytes left + char *lineBuf) +{ + char *outp = lineBuf; + char *endOfOut = outp + MAX_LINE_LEN - 2; + while(bytesLeft != 0) { + switch(*cp) { + case '\n': + case '\r': + cp++; + bytesLeft--; + *outp = 0; + return; + default: + *outp++ = *cp++; + bytesLeft--; + break; + } + if(outp == endOfOut) { + printf("***getLine: line length exceeded!\n"); + break; + } + } + /* end of file */ + *outp = 0; +} + +/* incoming line is NULL terminated even if it's empty */ +static bool isLineEmpty( + const char *cp) +{ + for( ; *cp; cp++) { + switch(*cp) { + case ' ': + case '\t': + break; + default: + return false; + } + } + return true; +} + +/* process one file */ +static void processFile( + const char *fileName, + const char *in, + unsigned inLen, + FILE *f) +{ + char lineBuf[MAX_LINE_LEN]; + unsigned lineLen; + const char *cp; + const char *endOfToken; + char tokenBuf[MAX_LINE_LEN]; + unsigned tokenLen; + const char *lastSlash = fileName; + const char *nextSlash; + + while((nextSlash = strchr(lastSlash, '/')) != NULL) { + lastSlash = nextSlash + 1; + } + fprintf(f, "\t/* Error codes from %s */\n", lastSlash); + + while(inLen != 0) { + /* get one line, NULL terminated */ + getLine(in, inLen, lineBuf); + if(isLineEmpty(lineBuf)) { + continue; + } + + /* skip leading whitespace */ + lineLen = strlen(lineBuf); + cp = lineBuf; + skipWhite(cp, lineLen); + + /* interesting? */ + if(strncmp((char *)cp, "CSSMERR_", 8)) { + continue; + } + + /* + * cp is the start of the CSSMERR_ token + * find end of token + */ + endOfToken = cp + 8; + for(;;) { + if(isalnum(*endOfToken) || (*endOfToken == '_')) { + endOfToken++; + continue; + } + else { + break; + } + } + + /* endOfToken is one past the end of the CSSMERR_ token */ + tokenLen = endOfToken - cp; + memmove(tokenBuf, cp, tokenLen); + tokenBuf[tokenLen] = '\0'; + + /* write the stuff */ + writeToken(tokenBuf, f); + } +} + +int main(int argc, char **argv) +{ + unsigned char *inFile; + unsigned inFileLen; + int dex; + + if(argc < 2) { + usage(argv); + } + + writePreamble(stdout); + writeToken("CSSM_OK", stdout); + for(dex=1; dex