txt2Cstring

Command for converting text to C string notation \n for new line, hexadecimal notation for non printable characters
git clone https://noulin.net/git/txt2Cstring.git
Log | Files | Refs

txt2Cstring.c (2006B)


      1 #! /usr/bin/env sheepy
      2 /* or direct path to sheepy: #! /usr/local/bin/sheepy */
      3 
      4 /* Libsheepy documentation: https://spartatek.se/libsheepy/ */
      5 #include "libsheepyObject.h"
      6 
      7 int argc; char **argv;
      8 
      9 int main(int ARGC, char** ARGV) {
     10 
     11   argc = ARGC; argv = ARGV;
     12 
     13   initLibsheepy(ARGV[0]);
     14 
     15   cleanSmallArrayP(lines) = null;
     16 
     17   if (argc < 2) {
     18     char *s = null;
     19     // no arguments
     20     // check stdin
     21 
     22     // read all the data from stdin to s
     23     fd_set readfds;
     24     FD_ZERO(&readfds);
     25     FD_SET(STDIN_FILENO, &readfds);
     26 
     27     struct timeval timeout;
     28     timeout.tv_sec = 0;
     29     timeout.tv_usec = 1000;
     30 
     31     int chr;
     32 
     33     int sel_rv = select(1, &readfds, NULL, NULL, &timeout);
     34     if (sel_rv > 0) {
     35       while ((chr = getchar()) != EOF) pErrorNULL(appendG(&s,chr));
     36     } else if (sel_rv == -1) {
     37       perror("select failed");
     38     }
     39 
     40     if (isEmptyG(s)) {
     41       logW("Empty string.");
     42       XSUCCESS;
     43     }
     44     cleanSmallString(S);
     45     setValG(&S, s);
     46     lines = splitG(&S, '\n');
     47   }
     48   else {
     49     if (not isPath(argv[1])) {
     50       logXFailure(formatS("File "BLD RED UDL "'%s'"RST" not found ", argv[1]));
     51     }
     52 
     53     lines = allocG(rtSmallArrayt);
     54     readFileG(lines, argv[1]);
     55   }
     56 
     57   iter(lines, L) {
     58     castS(l,L);
     59     // replace '\' with '\\'
     60     replaceG(l, "\\", "\\\\", 0);
     61     replaceG(l, "\"", "\\\"", 0);
     62     replaceG(l, "\r", "\\r", 0);
     63     replaceG(l, "\t", "\\t", 0);
     64     replaceG(l, "\a", "\\a", 0);
     65     replaceG(l, "\b", "\\b", 0);
     66     replaceG(l, "\v", "\\v", 0);
     67     replaceG(l, "\f", "\\f", 0);
     68     // print non printable characters as hexadecimal "\xNN"
     69     cleanCharP(s) = malloc(4*lenG(l)+1);
     70     char *t       = s;
     71     char *in      = getValG(l);
     72     range(i, lenG(l)) {
     73       if (isprint(in[i]))
     74         *(t++) = in[i];
     75       else {
     76         sprintf(t, "\\x%02X", (u8)in[i]);
     77         t += 4;
     78       }
     79     }
     80     *t = 0;
     81     setValG(l, s);
     82     prependG(l, "\"");
     83     appendG(l, "\\n\"");
     84     setPG(lines, iterIndexG(lines), l);
     85   }
     86   logG(lines);
     87 }
     88 // vim: set expandtab ts=2 sw=2: