[srvx-commits] CVS: services/src recdb.c,1.37,1.38
Brought to you by:
entrope
|
From: Adrian D. <sai...@us...> - 2002-07-08 01:35:54
|
Update of /cvsroot/srvx/services/src
In directory usw-pr-cvs1:/tmp/cvs-serv7491
Modified Files:
recdb.c
Log Message:
Make db output format more readable (especially with --enable-debug) by tab-indenting it
Escape non-printable characters in \x?? format.
Index: recdb.c
===================================================================
RCS file: /cvsroot/srvx/services/src/recdb.c,v
retrieving revision 1.37
retrieving revision 1.38
diff -C2 -r1.37 -r1.38
*** recdb.c 3 Jul 2002 02:57:53 -0000 1.37
--- recdb.c 8 Jul 2002 01:35:20 -0000 1.38
***************
*** 33,51 ****
#include "common.h"
- #if HAVE_GETC_UNLOCKED
- #undef fgetc
- #define fgetc(STR) getc_unlocked(STR)
- #endif
-
- #if HAVE_PUTC_UNLOCKED
- #undef fputc
- #define fputc(CHR,STR) putc_unlocked(CHR,STR)
- #endif
-
- #if HAVE_FEOF_UNLOCKED
- #undef feof
- #define feof(STR) feof_unlocked(STR)
- #endif
-
/* file format (grammar in Backus-Naur Form):
*
--- 33,36 ----
***************
*** 79,82 ****
--- 64,75 ----
} RECDB;
+ typedef struct recdb_outfile {
+ FILE *f;
+ int tablvl;
+ #ifdef NDEBUG
+ int need_tab;
+ #endif
+ } RECDB_OUT;
+
#define EOL '\n'
***************
*** 272,275 ****
--- 265,270 ----
*(--recdb->s.s) = c;
}
+ if (c == EOL) recdb->ctx.line--, recdb->ctx.col=-1;
+ else recdb->ctx.col--;
}
***************
*** 312,315 ****
--- 307,312 ----
int used=0, size=8, c;
struct recdb_context start_ctx;
+ unsigned int i;
+
if ((c = parse_skip_ws(recdb)) == EOF) return NULL;
start_ctx = recdb->ctx;
***************
*** 317,337 ****
buff = malloc(size);
while (!dbeof(recdb) && (c = dbgetc(recdb)) != '"') {
! if (c != '\\') {
! buff[used++] = c;
! } else {
! switch (c = dbgetc(recdb)) {
! case 'n': buff[used++] = EOL; break;
! default: buff[used++] = c; break;
! }
! }
! if (used == size) {
! size <<= 1;
! buff = realloc(buff, size);
! }
}
if (c != '"' && dbeof(recdb)) {
! free(buff);
! recdb->ctx = start_ctx;
! ABORT(recdb, UNTERMINATED_STRING, EOF);
}
buff[used] = 0;
--- 314,394 ----
buff = malloc(size);
while (!dbeof(recdb) && (c = dbgetc(recdb)) != '"') {
! if (c != '\\') {
! /* There should never be a literal newline, as it is saved as a \n */
! if (c == EOL) {
! dbungetc(c, recdb);
! ABORT(recdb, UNTERMINATED_STRING, ' ');
! }
! buff[used++] = c;
! } else {
! switch (c = dbgetc(recdb)) {
! case '0': /* either \0 or \0<octal> */
! {
! char digits[4] = { '\0', '\0', '\0', '\0' };
! for (i=0; i < 3; i++) {
! /* \0177 is the highest possible, so \0200 would be invalid */
! if ((i == 3) && (digits[0] != '1')) {
! break;
! }
! if ((c = dbgetc(recdb)) == EOF) {
! break;
! }
! if ((c < '0') || (c > '7')) {
! dbungetc(c, recdb);
! break;
! }
! digits[i] = (char)c;
! }
! if (i) {
! c = (int)strtol(digits, NULL, 8);
! buff[used++] = c;
! } else {
! buff[used++] = '\0';
! }
! }
! break;
! case 'x': /* Hex */
! {
! char digits[3] = { '\0', '\0', '\0' };
! for (i=0; i < 2; i++) {
! if ((c = dbgetc(recdb)) == EOF) {
! break;
! }
! if (!isxdigit(c)) {
! dbungetc(c, recdb);
! break;
! }
! digits[i] = (char)c;
! }
! if (i) {
! c = (int)strtol(digits, NULL, 16);
! buff[used++] = c;
! } else {
! buff[used++] = '\\';
! buff[used++] = 'x';
! }
! }
! break;
! case 'a': buff[used++] = '\a'; break;
! case 'b': buff[used++] = '\b'; break;
! case 't': buff[used++] = '\t'; break;
! case 'n': buff[used++] = EOL; break;
! case 'v': buff[used++] = '\v'; break;
! case 'f': buff[used++] = '\f'; break;
! case 'r': buff[used++] = '\r'; break;
! case '\\': buff[used++] = '\\'; break;
! case '"': buff[used++] = '"'; break;
! default: buff[used++] = '\\'; buff[used++] = c; break;
! }
! }
! if (used == size) {
! size <<= 1;
! buff = realloc(buff, size);
! }
}
if (c != '"' && dbeof(recdb)) {
! free(buff);
! recdb->ctx = start_ctx;
! ABORT(recdb, UNTERMINATED_STRING, EOF);
}
buff[used] = 0;
***************
*** 496,546 ****
void
! write_qstring(FILE *file, const char *str)
{
! fputc('"', file);
while (*str) {
! switch (*str) {
! case EOL: fputs("\\n", file); break;
! case '\\': fputs("\\\\", file); break;
! case '"': fputs("\\\"", file); break;
! default: fputc(*str, file); break;
! }
! str++;
}
! fputc('"', file);
}
static int
write_object_helper(const char *key, void *data, void *extra)
{
! write_record(extra, key, data);
return 0;
}
void
! write_object(FILE *file, dict_t obj)
{
! fputs("{ ", file);
dict_foreach(obj, write_object_helper, file);
! fputs("}", file);
}
void
! write_string_list(FILE *file, struct string_list *slist)
{
unsigned int i;
! fputc('(', file);
if (slist->used) {
write_qstring(file, slist->list[0]);
for (i=1; i<slist->used; i++) {
! fputs(", ", file);
write_qstring(file, slist->list[i]);
}
}
! fputc(')', file);
}
void
! write_record_data(FILE *file, struct record_data *rd)
{
switch (rd->type) {
--- 553,633 ----
void
! write_qstring(RECDB_OUT *file, const char *str)
{
! fputc('"', file->f);
while (*str) {
! switch (*str) {
! case '\a': fputs("\\a", file->f); break;
! case '\b': fputs("\\b", file->f); break;
! case '\t': fputs("\\t", file->f); break;
! case EOL: fputs("\\n", file->f); break;
! case '\v': fputs("\\v", file->f); break;
! case '\f': fputs("\\f", file->f); break;
! case '\r': fputs("\\r", file->f); break;
! case '\\': fputs("\\\\", file->f); break;
! case '"': fputs("\\\"", file->f); break;
! default:
! if (!isprint(*str)) {
! unsigned int chr = (unsigned char)(*str);
! fprintf(file->f, "\\x%.2x", chr);
! } else {
! fputc(*str, file->f);
! }
! break;
! }
! str++;
}
! fputc('"', file->f);
}
+ void write_record2(RECDB_OUT *file, const char *name, struct record_data *rd);
+
static int
write_object_helper(const char *key, void *data, void *extra)
{
! write_record2(extra, key, data);
return 0;
}
void
! write_object(RECDB_OUT *file, dict_t obj)
{
! int i;
!
! fputs("{\n", file->f);
! #ifdef NDEBUG
! file->need_tab = 1;
! #endif
!
! file->tablvl++;
dict_foreach(obj, write_object_helper, file);
! file->tablvl--;
!
! #ifdef NDEBUG
! fputc('\n', file->f);
! #endif
! for (i=0; i < file->tablvl; i++) {
! fputc('\t', file->f);
! }
! fputc('}', file->f);
}
void
! write_string_list(RECDB_OUT *file, struct string_list *slist)
{
unsigned int i;
! fputc('(', file->f);
if (slist->used) {
write_qstring(file, slist->list[0]);
for (i=1; i<slist->used; i++) {
! fputs(", ", file->f);
write_qstring(file, slist->list[i]);
}
}
! fputc(')', file->f);
}
void
! write_record_data(RECDB_OUT *file, struct record_data *rd)
{
switch (rd->type) {
***************
*** 555,563 ****
write_record(FILE *file, const char *name, struct record_data *rd)
{
write_qstring(file, name);
! fputc(' ', file);
write_record_data(file, rd);
! fputc(';', file);
! fputc((rd->type == RECDB_OBJECT) ? EOL : ' ', file);
}
--- 642,689 ----
write_record(FILE *file, const char *name, struct record_data *rd)
{
+ RECDB_OUT fileinfo;
+
+ fileinfo.f = file;
+ fileinfo.tablvl = 0;
+ #ifdef NDEBUG
+ fileinfo.need_tab = 0;
+ #endif
+
+ write_record2(&fileinfo, name, rd);
+ }
+
+ void
+ write_record2(RECDB_OUT *file, const char *name, struct record_data *rd)
+ {
+ int i;
+ #ifdef NDEBUG
+ if (rd->type == RECDB_OBJECT && !file->need_tab) {
+ fputc('\n', file->f);
+ file->need_tab = 1;
+ }
+
+ if (file->need_tab) {
+ #endif
+ for (i=0; i < file->tablvl; i++) {
+ fputc('\t', file->f);
+ }
+ #ifdef NDEBUG
+ file->need_tab = 0;
+ }
+ #endif
write_qstring(file, name);
! fputc(' ', file->f);
write_record_data(file, rd);
! fputc(';', file->f);
! #ifdef NDEBUG
! if (rd->type == RECDB_OBJECT) {
! fputc('\n', file->f);
! file->need_tab = 1;
! } else {
! fputc(' ', file->f);
! }
! #else
! fputc('\n', file->f);
! #endif
}
***************
*** 565,570 ****
write_database_helper(const char *key, void *data, void *extra)
{
! write_record(extra, key, data);
! fputc(EOL, (FILE*)extra);
return 0;
}
--- 691,697 ----
write_database_helper(const char *key, void *data, void *extra)
{
! RECDB_OUT *file = extra;
! write_record2(file, key, data);
! fputc(EOL, file->f);
return 0;
}
***************
*** 573,576 ****
write_database(FILE *file, dict_t db)
{
! dict_foreach(db, write_database_helper, file);
}
--- 700,709 ----
write_database(FILE *file, dict_t db)
{
! RECDB_OUT fileinfo;
! fileinfo.f = file;
! fileinfo.tablvl = 0;
! #ifdef NDEBUG
! fileinfo.need_tab = 0;
! #endif
! dict_foreach(db, write_database_helper, &fileinfo);
}
|