From 36da0760b07820e6b8fd95eb2545c21511f7a196 Mon Sep 17 00:00:00 2001 From: Niki Date: Tue, 25 Jun 2024 17:22:25 +0200 Subject: [PATCH] add BIT support --- src/cbook/cbook.h | 1 + src/cbook/cbook_csv.c | 26 ++++++++++++++++++++------ src/cbook/cbook_pl1.c | 14 +++++++++++++- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/cbook/cbook.h b/src/cbook/cbook.h index 7aebd7b..f9796b7 100755 --- a/src/cbook/cbook.h +++ b/src/cbook/cbook.h @@ -49,6 +49,7 @@ typedef int CBOOK_FORMAT; #define CBOOK_FMT_FIXED_BINARY 5 // default is FLOAT #define CBOOK_FMT_UFIXED_BINARY 6 // default is SIGNED #define CBOOK_FMT_PICTURE 7 +#define CBOOK_FMT_BIT 8 typedef int CBOOK_OUT; #define CBOOK_OUT_CSV 1 diff --git a/src/cbook/cbook_csv.c b/src/cbook/cbook_csv.c index 8bbdc13..782a219 100755 --- a/src/cbook/cbook_csv.c +++ b/src/cbook/cbook_csv.c @@ -178,13 +178,14 @@ static void one_field(FILE *outfile, book_t *book, line_t *field, char *data) { for (size_t i = 0 ; i < field->bytes ; i++) { char *type; switch(field->type) { - case CBOOK_FMT_CHAR: type = "CHAR"; break; + case CBOOK_FMT_CHAR: type = "CHAR "; break; case CBOOK_FMT_VARCHAR: type = "VARCHAR"; break; - case CBOOK_FMT_DECIMAL: type = "DEC"; break; - case CBOOK_FMT_UDECIMAL:type = "UDEC"; break; - case CBOOK_FMT_FIXED_BINARY: type= "BIN" ;break; - case CBOOK_FMT_UFIXED_BINARY:type= "UBIN";break; - case CBOOK_FMT_PICTURE: type = "PIC"; break; + case CBOOK_FMT_DECIMAL: type = "DEC "; break; + case CBOOK_FMT_UDECIMAL:type = "UDEC "; break; + case CBOOK_FMT_FIXED_BINARY: type = "BIN ";break; + case CBOOK_FMT_UFIXED_BINARY: type = "UBIN ";break; + case CBOOK_FMT_PICTURE: type = "PIC "; break; + case CBOOK_FMT_BIT: type = "BIT "; break; default: type = "OTHER"; } unsigned char byte = (unsigned char)data[i]; @@ -397,6 +398,19 @@ static void one_field(FILE *outfile, book_t *book, line_t *field, char *data) { fwrite(o, 1, strlen(o), outfile); break; + case CBOOK_FMT_BIT: + ; + char bit; + for (size_t i = 0 ; i < field->bytes ; i++) { + unsigned char byte = (unsigned char)data[i]; + unsigned char mask = 128; + while(mask) { + bit = '0' + !!(byte & mask); + fwrite(&bit, 1, 1, outfile); + mask = mask >> 1; + } + } + break; default: ; cstring_t *tmp = new_cstring(); diff --git a/src/cbook/cbook_pl1.c b/src/cbook/cbook_pl1.c index 643358a..45fd9e5 100755 --- a/src/cbook/cbook_pl1.c +++ b/src/cbook/cbook_pl1.c @@ -495,7 +495,9 @@ line_t *process_line(book_t *book, const char data[]) { free(word); word = NULL; } else { if (line->type != CBOOK_FMT_VARCHAR - && line->type != CBOOK_FMT_CHAR) { + && line->type != CBOOK_FMT_CHAR + && line->type != CBOOK_FMT_BIT + ) { book->err_mess = cstring_concat( "This type requires a size", NULL @@ -587,6 +589,9 @@ line_t *process_line(book_t *book, const char data[]) { s++; line->bytes = (s + 7) / 8; break; + case CBOOK_FMT_BIT: + line->bytes = (line->size + 7) / 8; + break; default: ; cstring_t *tmp = new_cstring(); @@ -739,6 +744,8 @@ CBOOK_FORMAT format(char *text, char **pic_fmt) { (*pic_fmt) = cstring_convert(str); str = NULL; // TODO: validate the PIC format + } else if (cstring_starts_with(mot, "BIT", 0)) { + fmt = CBOOK_FMT_BIT; } else { // Not supported return CBOOK_FMT_ERROR; @@ -782,6 +789,11 @@ CBOOK_FORMAT format(char *text, char **pic_fmt) { // FLOAT types not supported return CBOOK_FMT_ERROR; } + + if (fmt == CBOOK_FMT_BIT && fixed) { + // BIT FIXED does not exist + return CBOOK_FMT_ERROR; + } return fmt; } -- 2.27.0