Kaynağa Gözat

Ansi file to .c/.cpp. show ansi file in linux console

Yes!  This works!  You can see the ansi file in the
linux console terminal!  Woot woot!
bugz 4 yıl önce
ebeveyn
işleme
930ebe20ff
3 değiştirilmiş dosya ile 138 ekleme ve 0 silme
  1. 1 0
      CMakeLists.txt
  2. 134 0
      ansi-to-src.cpp
  3. 3 0
      show

+ 1 - 0
CMakeLists.txt

@@ -86,4 +86,5 @@ target_compile_definitions(mystic PUBLIC ZF_LOG_DEF_LEVEL=ZF_LOG_VERBOSE)
 add_executable(try-re try-re.c)
 
 add_executable(ansi-color ansi-color.c)
+add_executable(ansi-to-src ansi-to-src.cpp)
 

+ 134 - 0
ansi-to-src.cpp

@@ -0,0 +1,134 @@
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+
+#define ZF_LOGD(...)
+
+/**
+ * Display a repr of the given string.
+ *
+ * This converts most \n\r\v\f\t codes,
+ * defaults to \xHH (hex value).
+ */
+char *repr(const char *data) {
+  static char buffer[40960];
+  char *cp;
+
+  strcpy(buffer, data);
+  cp = buffer;
+  while (*cp != 0) {
+    char c = *cp;
+
+    if (isspace(c)) {
+      if (c == ' ') {
+        cp++;
+        continue;
+      };
+      /* Ok, it's form-feed ('\f'), newline ('\n'), carriage return ('\r'),
+       * horizontal tab ('\t'), and vertical tab ('\v') */
+      memmove(cp + 1, cp, strlen(cp) + 1);
+      *cp = '\\';
+      cp++;
+      switch (c) {
+      case '\f':
+        *cp = 'f';
+        cp++;
+        break;
+      case '\n':
+        *cp = 'n';
+        cp++;
+        break;
+      case '\r':
+        *cp = 'r';
+        cp++;
+        break;
+      case '\t':
+        *cp = 't';
+        cp++;
+        break;
+      case '\v':
+        *cp = 'v';
+        cp++;
+        break;
+      default:
+        *cp = '?';
+        cp++;
+        break;
+      }
+      continue;
+    }
+
+    if (isprint(c)) {
+      cp++;
+      continue;
+    };
+
+    // Ok, default to \xHH output.
+    memmove(cp + 3, cp, strlen(cp) + 1);
+    *cp = '\\';
+    cp++;
+    *cp = 'x';
+    cp++;
+    char buffer[3];
+    sprintf(buffer, "%02x", (int)c & 0xff);
+    *cp = buffer[0];
+    cp++;
+    *cp = buffer[1];
+    cp++;
+    continue;
+  }
+
+  return buffer;
+}
+
+
+int read_file(const char *filename) {
+  FILE *fp;
+  char buffer[10240];
+  int read;
+
+  fp = fopen(filename, "rb");
+  if (fp == NULL) {
+    ZF_LOGD("Failed to open %s", filename);
+    return 0;
+  }
+
+  strcpy(buffer, filename);
+  char *cp;
+
+  if ((cp = strchr(buffer, '.')) != NULL) {
+    *cp = 0;
+  }
+  printf( "const char * %s[] = {\n", buffer);
+
+  
+  if ((read = fread(buffer, 1, sizeof(buffer), fp)) > 0) {
+    char *nl;
+
+    buffer[read] = 0;
+    cp = repr(buffer);
+    int first = 1;
+    while ((nl = strstr(cp, "\\r\\n")) != NULL) {
+      strcpy(nl, "\"");
+      if (!first) {
+        printf(",\n");
+      };
+      first = 0;
+      printf("  \"%s", cp);
+      cp = nl + 4;
+    }
+    if (strlen(cp) > 0)
+      printf(  ",\n  \"%s\"\n", cp);
+    else
+      printf("\n");
+    printf("}\n");
+
+  };
+  fclose(fp);
+  return 1;
+}
+
+int main(int argc, char *argv[]) {
+  read_file(argv[1]);
+  return 0;
+}

+ 3 - 0
show

@@ -0,0 +1,3 @@
+#!/bin/bash
+
+iconv -f "CP437" -t "UTF-8" $1