reactos/rosapps/mc/src/fixhlp.c
Steven Edwards 456be5d16b remove trailing whitespace at end of lines
svn path=/trunk/; revision=15091
2005-05-07 21:24:31 +00:00

247 lines
6.4 KiB
C

/* HLP converter
Copyright (C) 1994, 1995 Janne Kukonlehto
Copyright (C) 1995 Jakub Jelinek
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include "help.h"
#define BUFFER_SIZE 256
static int width; /* Output width in characters */
static int col = 0; /* Current output column */
static FILE *toc_file; /* TOC file */
static int out_row = 1; /* Current output row */
static int in_row = 0; /* Current input row */
static int indent = 1;
static int curindent = 1;
static int freshnl = 1;
static int firstlen = 0;
static int verbatim = 0;
/* Report error in input */
void print_error (char *message)
{
fprintf (stderr, "fixhlp: %s at row %d\n", message, in_row);
}
/* Change output line */
void newline (void)
{
out_row ++;
col = indent;
curindent = indent;
printf("\n%*s", indent, "");
freshnl = 1;
firstlen = 0;
}
/* Calculate the length of string */
int string_len (char *buffer)
{
static int anchor_flag = 0; /* Flag: Inside hypertext anchor name */
static int link_flag = 0; /* Flag: Inside hypertext link target name */
int i; /* Index */
int c; /* Current character */
int len = 0; /* Result: the length of the string */
for (i = 0; i < strlen (buffer); i ++)
{
c = buffer [i];
if (c == CHAR_LINK_POINTER)
link_flag = 1; /* Link target name starts */
else if (c == CHAR_LINK_END)
link_flag = 0; /* Link target name ends */
else if (c == CHAR_NODE_END){
/* Node anchor name starts */
anchor_flag = 1;
/* Ugly hack to prevent loss of one space */
len ++;
}
/* Don't add control characters to the length */
if (c < 32)
continue;
/* Attempt to handle backslash quoting */
/* Increase length if not inside anchor name or link target name */
if (!anchor_flag && !link_flag)
len ++;
if (anchor_flag && c == ']'){
/* Node anchor name ends */
anchor_flag = 0;
}
}
return len;
}
/* Output the string */
void print_string (char *buffer)
{
int len; /* The length of current word */
int i; /* Index */
int c; /* Current character */
char *p;
/* Split into words */
if (verbatim) {
printf ("%s", buffer);
newline ();
return;
}
p = strchr (buffer, CHAR_LINK_POINTER);
if (p) {
char *q;
*p = 0;
print_string (buffer);
q = strchr (p + 1, CHAR_LINK_END);
if (q) {
*q = 0;
printf ("%c%s%c", CHAR_LINK_POINTER, p + 1, CHAR_LINK_END);
print_string (q + 1);
} else {
/* Error, but try to handle it somehow */
printf ("%c", CHAR_LINK_END);
}
return;
}
buffer = strtok (buffer, " \t\n");
/* Repeat for each word */
while (buffer){
/* Skip empty strings */
if (strlen (buffer) > 0){
len = string_len (buffer);
/* Change the line if about to break the right margin */
if (col + len >= width)
newline ();
/* Words are separated by spaces */
if (col > curindent){
printf (" ");
col ++;
}
printf ("%s", buffer);
/* Increase column */
col += len;
}
/* Get the next word */
buffer = strtok (NULL, " \t\n");
} /* while */
if (freshnl) {
firstlen = col - curindent;
freshnl = 0;
}
}
/* Like print_string but with printf-like syntax */
void printf_string (char *format, ...)
{
va_list args;
char buffer [BUFFER_SIZE];
va_start (args, format);
vsprintf (buffer, format, args);
va_end (args);
print_string (buffer);
}
int main (int argc, char **argv)
{
int len; /* Length of input line */
char buffer [BUFFER_SIZE]; /* Input line */
int i, j;
char *p;
int ignore_newline = 0;
/* Validity check for arguments */
if (argc != 3 || (width = atoi (argv[1])) <= 10){
fprintf (stderr, _("Usage: fixhlp <width> <tocname>\n"));
return 3;
}
if ((toc_file = fopen (argv[2], "w")) == NULL) {
fprintf (stderr, _("fixhlp: Cannot open toc for writing"));
return 4;
}
fprintf (toc_file, _("\04[Contents]\n Topics:\n\n"));
/* Repeat for each input line */
while (!feof (stdin)){
/* Read a line */
if (!fgets (buffer, BUFFER_SIZE, stdin)){
break;
}
in_row ++;
len = strlen (buffer);
/* Remove terminating newline */
if (buffer [len-1] == '\n')
{
len --;
buffer [len] = 0;
}
if (!buffer[0]) {
if (ignore_newline)
ignore_newline = 0;
else
newline ();
} else {
if (buffer [0] == 4 && buffer [1] == '[') {
for (p = buffer + 2; *p == ' '; p++);
fprintf (toc_file, "%*s\01 %s \02%s\03\n", p - buffer + 1, "", p, p);
printf ("\04[%s]\n %s", p, p);
} else if (buffer [0] == CHAR_RESERVED && buffer [1] == '"') {
continue;
} else {
char *p, *q;
int i;
for (p = buffer, q = strchr (p, CHAR_RESERVED); q != NULL;
p = q + 1, q = strchr (p, CHAR_RESERVED)) {
*q = 0;
if (*p)
print_string (p);
q++;
if (*q == '/')
ignore_newline = 1;
else if (*q == 'v')
verbatim = 1;
else if (*q == 'n')
verbatim = 0;
else {
indent = *q - '0';
if (ignore_newline) {
i = firstlen;
if (i > indent - curindent - 1)
ignore_newline = 0;
else {
i = indent - curindent - i - 1;
printf ("%*s", i, "");
col += i;
}
}
}
}
print_string (p);
}
}
}
/* All done */
newline ();
return 0;
}