133 lines
4.3 KiB
C
133 lines
4.3 KiB
C
/***
|
|
*maketabc.c - program to generate printf format specifier lookup table for
|
|
* output.c
|
|
*
|
|
* Copyright (c) 1989-2001, Microsoft Corporation. All rights reserved.
|
|
*
|
|
*Purpose:
|
|
* This program writes to stdout the lookuptable values needed by
|
|
* output.c
|
|
*
|
|
*Revision History:
|
|
* 06-01-89 PHG Module created
|
|
* 1-16-91 SRW Added extra format codes (_WIN32_)
|
|
* 1-16-91 SRW Fixed output loop to put trailing comma on a line
|
|
* 03-11-94 GJF Recognize 'I' as size modifier.
|
|
* 01-04-95 GJF _WIN32_ -> _WIN32.
|
|
* 02-24-95 GJF Don't recognize 'I' for non-Win32 (Mac merge).
|
|
* 07-14-96 RDK Allow 'I' for Mac size specifier.
|
|
*
|
|
*******************************************************************************/
|
|
|
|
#define TABLESIZE ('x' - ' ' + 1)
|
|
|
|
|
|
/* possible states to be in */
|
|
#define NORMAL 0 /* normal character to be output */
|
|
#define PERCENT 1 /* just read percent sign */
|
|
#define FLAG 2 /* just read a flag character */
|
|
#define WIDTH 3 /* just read a width specification character */
|
|
#define DOT 4 /* just read a dot between width and precision */
|
|
#define PRECIS 5 /* just read a precision specification character */
|
|
#define SIZE 6 /* just read a size specification character */
|
|
#define TYPE 7 /* just read a conversion specification character */
|
|
#define BOGUS 0 /* bogus state - print the character literally */
|
|
|
|
#define NUMSTATES 8
|
|
|
|
/* possible types of characters to read */
|
|
#define CH_OTHER 0 /* character with no special meaning */
|
|
#define CH_PERCENT 1 /* '%' */
|
|
#define CH_DOT 2 /* '.' */
|
|
#define CH_STAR 3 /* '*' */
|
|
#define CH_ZERO 4 /* '0' */
|
|
#define CH_DIGIT 5 /* '1'..'9' */
|
|
#define CH_FLAG 6 /* ' ', '+', '-', '#' */
|
|
#define CH_SIZE 7 /* 'h', 'l', 'L', 'N', 'F' */
|
|
#define CH_TYPE 8 /* conversion specified character */
|
|
|
|
#define NUMCHARS 9
|
|
|
|
unsigned char table[TABLESIZE]; /* the table we build */
|
|
|
|
|
|
|
|
/* this is the state table */
|
|
|
|
int statetable[NUMSTATES][NUMCHARS] = {
|
|
/* state, other % . * 0 digit flag size type */
|
|
|
|
/* NORMAL */ { NORMAL, PERCENT, NORMAL, NORMAL, NORMAL, NORMAL, NORMAL, NORMAL, NORMAL },
|
|
/* PERCENT */ { BOGUS, NORMAL, DOT, WIDTH, FLAG, WIDTH, FLAG, SIZE, TYPE },
|
|
/* FLAG */ { BOGUS, BOGUS, DOT, WIDTH, FLAG, WIDTH, FLAG, SIZE, TYPE },
|
|
/* WIDTH */ { BOGUS, BOGUS, DOT, BOGUS, WIDTH, WIDTH, BOGUS, SIZE, TYPE },
|
|
/* DOT */ { BOGUS, BOGUS, BOGUS, PRECIS, PRECIS, PRECIS, BOGUS, SIZE, TYPE },
|
|
/* PRECIS */ { BOGUS, BOGUS, BOGUS, BOGUS, PRECIS, PRECIS, BOGUS, SIZE, TYPE },
|
|
/* SIZE */ { BOGUS, BOGUS, BOGUS, BOGUS, BOGUS, BOGUS, BOGUS, SIZE, TYPE },
|
|
/* TYPE */ { NORMAL, PERCENT, NORMAL, NORMAL, NORMAL, NORMAL, NORMAL, NORMAL, NORMAL }
|
|
};
|
|
|
|
/* this determines what type of character ch is */
|
|
|
|
static int chartype (
|
|
int ch
|
|
)
|
|
{
|
|
if (ch < ' ' || ch > 'z')
|
|
return CH_OTHER;
|
|
if (ch == '%')
|
|
return CH_PERCENT;
|
|
if (ch == '.')
|
|
return CH_DOT;
|
|
if (ch == '*')
|
|
return CH_STAR;
|
|
if (ch == '0')
|
|
return CH_ZERO;
|
|
if (strchr("123456789", ch))
|
|
return CH_DIGIT;
|
|
if (strchr(" +-#", ch))
|
|
return CH_FLAG;
|
|
if (strchr("hIlLNF", ch))
|
|
return CH_SIZE;
|
|
if (strchr("diouxXfeEgGcspn", ch))
|
|
return CH_TYPE;
|
|
#ifdef _WIN32
|
|
/* Win32 supports three additional format codes for debugging purposes */
|
|
|
|
if (strchr("BCS", ch))
|
|
return CH_TYPE;
|
|
#endif /* _WIN32 */
|
|
|
|
return CH_OTHER;
|
|
}
|
|
|
|
|
|
main()
|
|
{
|
|
int ch;
|
|
int state, class;
|
|
int i;
|
|
|
|
for (ch = ' '; ch <= 'x'; ++ch) {
|
|
table[ch-' '] = chartype(ch);
|
|
}
|
|
|
|
for (state = NORMAL; state <= TYPE; ++state)
|
|
for (class = CH_OTHER; class <= CH_TYPE; ++class)
|
|
table[class*8+state] |= statetable[state][class]<<4;
|
|
|
|
for (i = 0; i < TABLESIZE; ++i) {
|
|
if (i % 8 == 0) {
|
|
if (i != 0)
|
|
printf(",");
|
|
|
|
printf("\n\t 0x%.2X", table[i]);
|
|
}
|
|
else
|
|
printf(", 0x%.2X", table[i]);
|
|
}
|
|
printf("\n");
|
|
|
|
return 0;
|
|
}
|