add BIT support
authorNiki <david.roulet@solidaris.be>
Tue, 25 Jun 2024 15:22:25 +0000 (17:22 +0200)
committerNiki <david.roulet@solidaris.be>
Tue, 25 Jun 2024 15:22:25 +0000 (17:22 +0200)
src/cbook/cbook.h
src/cbook/cbook_csv.c
src/cbook/cbook_pl1.c

index 7aebd7b5ba773568396a37b2e7ae92360ba15b25..f9796b71a6340b81a86df5d81a483263de80f9dd 100755 (executable)
@@ -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
index 8bbdc13faffe28b6b36dff7385164c97de2ca63e..782a2196e27d8a3ef8b6a901d503196782f450c9 100755 (executable)
@@ -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();
index 643358a4a215d7c6563103a8a1483d4528aaebb2..45fd9e562430547b2e4b981982e8dccb9a4ddc36 100755 (executable)
@@ -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;
 }