picolisp

Unnamed repository; edit this file to name it for gitweb.
git clone https://logand.com/git/picolisp.git/
Log | Files | Refs | README | LICENSE

utf2.c (1682B)


      1 /* utf2.c
      2  * 31mar05abu
      3  * Convert process or file (ISO-8859-15) to stdout (UTF-8, 2-Byte)
      4  */
      5 
      6 #include <stdio.h>
      7 #include <stdlib.h>
      8 #include <unistd.h>
      9 #include <errno.h>
     10 #include <signal.h>
     11 #include <sys/wait.h>
     12 
     13 // utf2 [-<cmd> [<arg> ..]]
     14 // utf2 [<Infile/ISO-8859-15>]
     15 int main(int ac, char *av[]) {
     16 	int c;
     17    pid_t pid = 0;
     18    FILE *fp = stdin;
     19 
     20    if (ac > 1) {
     21       if (*av[1] == '-') {
     22          int pfd[2];
     23 
     24          if (pipe(pfd) < 0) {
     25             fprintf(stderr, "utf2: Pipe error\n");
     26             return 1;
     27          }
     28          if ((pid = fork()) == 0) {
     29             close(pfd[0]);
     30             if (pfd[1] != STDOUT_FILENO)
     31                dup2(pfd[1], STDOUT_FILENO),  close(pfd[1]);
     32             execvp(av[1]+1, av+1);
     33          }
     34          if (pid < 0) {
     35             fprintf(stderr, "utf2: Fork error\n");
     36             return 1;
     37          }
     38          close(pfd[1]);
     39          if (!(fp = fdopen(pfd[0], "r"))) {
     40             fprintf(stderr, "utf2: Pipe open error\n");
     41             return 1;
     42          }
     43       }
     44       else if (!(fp = fopen(av[1], "r"))) {
     45          fprintf(stderr, "utf2: '%s' open error\n", av[1]);
     46          return 1;
     47       }
     48    }
     49 	while ((c = getc_unlocked(fp)) != EOF) {
     50       if (c == 0xA4)
     51          putchar_unlocked(0xE2), putchar_unlocked(0x82), putchar_unlocked(0xAC);
     52       else if (c >= 0x80) {
     53          putchar_unlocked(0xC0 | c>>6 & 0x1F);
     54          putchar_unlocked(0x80 | c & 0x3F);
     55       }
     56       else
     57          putchar_unlocked(c);
     58 	}
     59    if (pid) {
     60       fclose(fp);
     61       while (waitpid(pid, NULL, 0) < 0)
     62          if (errno != EINTR) {
     63             fprintf(stderr, "utf2: Pipe close error\n");
     64             return 1;
     65          }
     66    }
     67    return 0;
     68 }