version 1.2, 2010/12/28 10:55:24 |
version 1.3, 2010/12/28 13:46:07 |
|
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
*/ |
*/ |
#include <assert.h> |
#include <assert.h> |
|
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
#include <time.h> |
#include <time.h> |
|
|
#include "libmandoc.h" |
#include "libmandoc.h" |
#include "libroff.h" |
#include "libroff.h" |
|
|
enum tbl_part { |
static const char tbl_toks[TBL_TOK__MAX] = { |
TBL_PART_OPTS, /* in options (first line) */ |
'(', ')', ',', ';', '.', |
TBL_PART_LAYOUT, /* describing layout */ |
' ', '\t', '\0' |
TBL_PART_DATA /* creating data rows */ |
|
}; |
}; |
|
|
|
|
struct tbl { |
|
enum tbl_part part; |
|
}; |
|
|
|
static void tbl_init(struct tbl *); |
static void tbl_init(struct tbl *); |
static void tbl_clear(struct tbl *); |
static void tbl_clear(struct tbl *); |
|
static enum tbl_tok tbl_next_char(char); |
|
|
static void |
static void |
tbl_clear(struct tbl *tbl) |
tbl_clear(struct tbl *tbl) |
Line 92 tbl_reset(struct tbl *tbl) |
|
Line 88 tbl_reset(struct tbl *tbl) |
|
tbl_clear(tbl); |
tbl_clear(tbl); |
tbl_init(tbl); |
tbl_init(tbl); |
} |
} |
|
|
|
static enum tbl_tok |
|
tbl_next_char(char c) |
|
{ |
|
int i; |
|
|
|
/* |
|
* These are delimiting tokens. They separate out words in the |
|
* token stream. |
|
* |
|
* FIXME: make this into a hashtable for faster lookup. |
|
*/ |
|
for (i = 0; i < TBL_TOK__MAX; i++) |
|
if (c == tbl_toks[i]) |
|
return((enum tbl_tok)i); |
|
|
|
return(TBL_TOK__MAX); |
|
} |
|
|
|
enum tbl_tok |
|
tbl_next(struct tbl *tbl, const char *p, int *pos) |
|
{ |
|
int i; |
|
enum tbl_tok c; |
|
|
|
tbl->buf[0] = '\0'; |
|
|
|
if (TBL_TOK__MAX != (c = tbl_next_char(p[*pos]))) { |
|
if (TBL_TOK_NIL != c) { |
|
tbl->buf[0] = p[*pos]; |
|
tbl->buf[1] = '\0'; |
|
(*pos)++; |
|
} |
|
return(c); |
|
} |
|
|
|
/* |
|
* Copy words into a nil-terminated buffer. For now, we use a |
|
* static buffer. FIXME: eventually this should be made into a |
|
* dynamic one living in struct tbl. |
|
*/ |
|
|
|
for (i = 0; i < BUFSIZ; i++, (*pos)++) |
|
if (TBL_TOK__MAX == tbl_next_char(p[*pos])) |
|
tbl->buf[i] = p[*pos]; |
|
else |
|
break; |
|
|
|
assert(i < BUFSIZ); |
|
tbl->buf[i] = '\0'; |
|
|
|
return(TBL_TOK__MAX); |
|
} |
|
|
|
|