summaryrefslogtreecommitdiff
path: root/manual/tools/htmlquote.c
blob: 1d11eca5453edbf7ed51e1fbb9da5a9a7ba8b537 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <stdio.h>
#include <ctype.h>

#define LINE_LENGTH 1024

char line[LINE_LENGTH];

int isprefix(s, pref)
     char * s;
     char * pref;
{
  while (1) {
    if (*pref == 0) return 1;
    if (*s == 0) return 0;
    if (*s != *pref) return 0;
    s++;
    pref++;
  }
}

int main(argc, argv)
     int argc;
     char * argv [];
{
  unsigned char * p;
  int c;
  int inquote;
  int inverb;
  int inverbatim;

  inverbatim = 0;
  inquote = 0;

  while(fgets(line, LINE_LENGTH, stdin) != NULL) {
    if (inverbatim) {
      fputs(line, stdout);
      if (isprefix(line, "\\end{verbatim")
          || isprefix(line, "\\end{alltt}")) inverbatim = 0;
      continue;
    }
    if (isprefix(line, "\\begin{verbatim")
        || isprefix(line, "\\begin{alltt}")) {
      fputs(line, stdout);
      inverbatim = 1;
      continue;
    }
    inverb = 0;
    for (p = (unsigned char *) line; *p != 0; p++) {
      c = *p;
      if (inverb) {
        if (c == inverb) inverb = 0;
        putchar(c);
        continue;
      }
      switch(c) {
      case '"':
        if (inquote) {
          fputs("\001", stdout);
          inquote = 0;
        } else {
          fputs("\\verb\001", stdout);
          inquote = 1;
        }
        break;
      case '\\':
        if (isprefix(p, "\\verb") && p[5] != 0 && !isalpha(p[5])) {
          inverb = p[5];
          p = p + 5;
          fputs("\\verb", stdout);
          putchar(inverb);
        } else if (inquote) {
          if (p[1] == '"' || p[1] == '\\') {
            c = p[1];
            p++;
          }
          putchar(c);
        } else {
          putchar('\\');
        }
        break;
      default:
        putchar(c);
      }
    }
  }
  return 0;
}