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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
#include <stdio.h>
#include <ctype.h>
#include <assert.h>
/*
look through HTMLized man pages
convert references like man(1) into HTML links
somewhat quick & dirty code
various dubious assumptions made:
[a-zA-Z0-9\-_\.]* defines legal characters in name
pagename(x) corresponds to pagename.x.html
(Fine *if* it's been converted by my scripts)
x in the above must be a single digit
(or we ignore it, which does no damage)
Lazy parsing: malloc() enough RAM to read in whole file
Limited syntax: exactly one input file, results to stdout
Sandy Harris
*/
int do_file( char *, char *) ;
main(int argc, char **argv)
{
FILE *in ;
char *progname;
long lsize ;
size_t size, nread;
char *buffer, *bufend ;
progname = *argv ;
if( argc != 2 ) {
fprintf(stderr,"usage: %s input-file\n", progname);
exit(1) ;
}
if( (in = fopen(argv[1],"r")) == NULL ) {
fprintf(stderr,"%s Can't open input file\n", progname);
exit(2) ;
}
if( (lsize = fseek(in, 0L, SEEK_END)) < 0L ) {
fprintf(stderr,"%s fseek() fails\n", progname);
exit(3) ;
}
lsize = ftell(in) ;
rewind(in) ;
size = (size_t) lsize ;
if( lsize != (long) size ) {
fprintf(stderr,"%s file too large\n", progname);
exit(4) ;
}
if( (buffer = (char *) malloc(size)) == NULL) {
fprintf(stderr,"%s malloc() failed\n", progname);
exit(5) ;
}
bufend = buffer + size ;
if( (nread = fread(buffer, size, 1, in)) != 1) {
fprintf(stderr,"%s fread() failed\n", progname);
exit(6) ;
}
do_file(buffer,bufend);
}
do_file(char *start, char *end)
{
/* p is where to start parsing, one past last output */
/* q is how far we've parsed */
char *p, *q ;
int value ;
for( p = q = start ; p < end ; q = (q<end) ? (q+1) : q ) {
/* if p is beyond q, catch up */
if( q < p )
continue ;
/* move q ahead until we know if we've got manpage name */
if( isalnum(*q) )
continue ;
switch(*q) {
/* can appear in manpage name */
case '.':
case '_':
case '-':
case '(':
continue ;
break ;
/* whatever's between p and q
is not a manpage name
so output it
*/
default:
/* leave p one past output */
for( ; p <= q ; p++ )
putchar(*p);
break ;
/* we may have a manpage name */
case ')':
value = do_name(p,q);
if(value) {
p = q ;
p++ ;
}
/* unreached with current do_name() */
else
for( ; p <= q ; p++ )
putchar(*p);
break ;
} } }
do_name(char *p, char *q)
{
*q = '\0' ;
/* if end of string matches RE ([0-9])
with at least one legal character before it
add HTML xref stuff
*/
if( (q-p > 3) && isdigit(q[-1]) && (q[-2]=='(')) {
q[-2] = '\0' ;
q-- ;
printf("<a href=\"%s.%s.html\">", p, q);
printf("%s(%s)", p, q);
printf("</a>");
}
// otherwise just print string
else printf("%s)", p);
return 1 ;
}
|