diff options
Diffstat (limited to 'doc/utils/man_xref.c')
-rw-r--r-- | doc/utils/man_xref.c | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/doc/utils/man_xref.c b/doc/utils/man_xref.c new file mode 100644 index 000000000..fc3afb696 --- /dev/null +++ b/doc/utils/man_xref.c @@ -0,0 +1,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 ; +} |