genErrorStrings.cpp [plain text]
#include <stdlib.h>
#include <strings.h>
#include <stdio.h>
#include <unistd.h>
#include <ctype.h>
#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 <Security/Security.h>\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)
{
fprintf(f, "\t{0, NULL}\n");
fprintf(f, "};\n");
}
static void writeToken(
const char *token,
FILE *f)
{
printf("\t{ %s,\"%s\"},\n", token, token);
}
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, unsigned &bytesLeft, 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;
}
}
*outp = 0;
}
static bool isLineEmpty(
const char *cp)
{
for( ; *cp; cp++) {
switch(*cp) {
case ' ':
case '\t':
break;
default:
return false;
}
}
return true;
}
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) {
getLine(in, inLen, lineBuf);
if(isLineEmpty(lineBuf)) {
continue;
}
lineLen = strlen(lineBuf);
cp = lineBuf;
skipWhite(cp, lineLen);
if(strncmp((char *)cp, "CSSMERR_", 8)) {
continue;
}
endOfToken = cp + 8;
for(;;) {
if(isalnum(*endOfToken) || (*endOfToken == '_')) {
endOfToken++;
continue;
}
else {
break;
}
}
tokenLen = endOfToken - cp;
memmove(tokenBuf, cp, tokenLen);
tokenBuf[tokenLen] = '\0';
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<argc; dex++) {
if(readFile(argv[dex], &inFile, &inFileLen)) {
printf("***Error reading %s. Aborting.\n", argv[dex]);
exit(1);
}
processFile(argv[dex], (const char *)inFile, inFileLen, stdout);
free(inFile);
}
writePostamble(stdout);
return 0;
}