summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Espie <espie@cvs.openbsd.org>2000-02-09 01:25:12 +0000
committerMarc Espie <espie@cvs.openbsd.org>2000-02-09 01:25:12 +0000
commit87188524d6f81d663cb1380bb9edd8b5c2a71014 (patch)
tree44378ccdc62a5d552be443e56c146e792f48dc07
parent01df7226b60e62111dc35c43f7fb15b41cd8dbf8 (diff)
TexInfo 4.0. New manpages, can create html.
A bit more grumpy about bad texinfo, though.
-rw-r--r--gnu/usr.bin/texinfo/makeinfo/files.c503
1 files changed, 124 insertions, 379 deletions
diff --git a/gnu/usr.bin/texinfo/makeinfo/files.c b/gnu/usr.bin/texinfo/makeinfo/files.c
index fd3ea326ad5..483b891abc8 100644
--- a/gnu/usr.bin/texinfo/makeinfo/files.c
+++ b/gnu/usr.bin/texinfo/makeinfo/files.c
@@ -1,8 +1,7 @@
-/* files.c -- file-related functions for makeinfo.
- $Id: files.c,v 1.1.1.3 2006/07/17 16:03:46 espie Exp $
+/* files.c -- file-related functions for Texinfo.
+ $Id: files.c,v 1.1 2000/02/09 01:25:11 espie Exp $
- Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
- Foundation, Inc.
+ Copyright (C) 1998, 99 Free Software Foundation, Inc.
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
@@ -20,17 +19,15 @@
#include "system.h"
#include "files.h"
-#include "html.h"
-#include "index.h"
#include "macro.h"
#include "makeinfo.h"
-#include "node.h"
FSTACK *filestack = NULL;
static int node_filename_stack_index = 0;
static int node_filename_stack_size = 0;
static char **node_filename_stack = NULL;
+
/* Looking for include files. */
@@ -38,7 +35,9 @@ static char **node_filename_stack = NULL;
return the next one pointed to by INDEX, or NULL if there are no more.
Advance INDEX to the character after the colon. */
static char *
-extract_colon_unit (char *string, int *index)
+extract_colon_unit (string, index)
+ char *string;
+ int *index;
{
int start;
int path_sep_char = PATH_SEP[0];
@@ -83,8 +82,10 @@ extract_colon_unit (char *string, int *index)
When found, return the stat () info for FILENAME in FINFO.
If PATH is NULL, only the current directory is searched.
If the file could not be found, return a NULL pointer. */
-char *
-get_file_info_in_path (char *filename, char *path, struct stat *finfo)
+static char *
+get_file_info_in_path (filename, path, finfo)
+ char *filename, *path;
+ struct stat *finfo;
{
char *dir;
int result, index = 0;
@@ -127,80 +128,24 @@ get_file_info_in_path (char *filename, char *path, struct stat *finfo)
}
return NULL;
}
-
-/* Prepend and append new paths to include_files_path. */
-void
-prepend_to_include_path (char *path)
-{
- if (!include_files_path)
- {
- include_files_path = xstrdup (path);
- include_files_path = xrealloc (include_files_path,
- strlen (include_files_path) + 3); /* 3 for ":.\0" */
- strcat (strcat (include_files_path, PATH_SEP), ".");
- }
- else
- {
- char *tmp = xstrdup (include_files_path);
- include_files_path = xrealloc (include_files_path,
- strlen (include_files_path) + strlen (path) + 2); /* 2 for ":\0" */
- strcpy (include_files_path, path);
- strcat (include_files_path, PATH_SEP);
- strcat (include_files_path, tmp);
- free (tmp);
- }
-}
-
-void
-append_to_include_path (char *path)
-{
- if (!include_files_path)
- include_files_path = xstrdup (".");
-
- include_files_path = (char *) xrealloc (include_files_path,
- 2 + strlen (include_files_path) + strlen (path));
- strcat (include_files_path, PATH_SEP);
- strcat (include_files_path, path);
-}
-
-/* Remove the first path from the include_files_path. */
-void
-pop_path_from_include_path (void)
-{
- int i = 0;
- char *tmp;
-
- if (include_files_path)
- for (i = 0; i < strlen (include_files_path)
- && include_files_path[i] != ':'; i++);
-
- /* Advance include_files_path to the next char from ':' */
- tmp = (char *) xmalloc (strlen (include_files_path) - i);
- strcpy (tmp, (char *) include_files_path + i + 1);
-
- free (include_files_path);
- include_files_path = tmp;
-}
/* Find and load the file named FILENAME. Return a pointer to
- the loaded file, or NULL if it can't be loaded. If USE_PATH is zero,
- just look for the given file (this is used in handle_delayed_writes),
- else search along include_files_path. */
-
+ the loaded file, or NULL if it can't be loaded. */
char *
-find_and_load (char *filename, int use_path)
+find_and_load (filename)
+ char *filename;
{
struct stat fileinfo;
long file_size;
int file = -1, count = 0;
char *fullpath, *result;
- int n, bytes_to_read;
+#if O_BINARY || defined (VMS)
+ int n;
+#endif
result = fullpath = NULL;
- fullpath
- = get_file_info_in_path (filename, use_path ? include_files_path : NULL,
- &fileinfo);
+ fullpath = get_file_info_in_path (filename, include_files_path, &fileinfo);
if (!fullpath)
goto error_exit;
@@ -218,18 +163,28 @@ find_and_load (char *filename, int use_path)
/* VMS stat lies about the st_size value. The actual number of
readable bytes is always less than this value. The arcane
mysteries of VMS/RMS are too much to probe, so this hack
- suffices to make things work. It's also needed on Cygwin. And so
- we might as well use it everywhere. */
- bytes_to_read = file_size;
- while ((n = read (file, result + count, bytes_to_read)) > 0)
- {
- count += n;
- bytes_to_read -= n;
- }
+ suffices to make things work. */
+#if O_BINARY || defined (VMS)
+#ifdef VMS
+ while ((n = read (file, result + count, file_size)) > 0)
+#else /* !VMS */
+#ifndef WIN32
+ while ((n = read (file, result + count, file_size)) > 0)
+#else /* WIN32 */
+ /* Does WIN32 really need reading 1 character at a time?? */
+ while ((n = read (file, result + count, 1)) > 0)
+#endif /* WIN32 */
+#endif /* !VMS */
+ count += n;
if (0 < count && count < file_size)
result = xrealloc (result, count + 2); /* why waste the slack? */
else if (n == -1)
-error_exit:
+#else /* !VMS && !O_BINARY */
+ count = file_size;
+ if (read (file, result, file_size) != file_size)
+#endif /* !VMS && !WIN32 */
+
+ error_exit:
{
if (result)
free (result);
@@ -261,8 +216,8 @@ error_exit:
}
/* Pushing and popping files. */
-static void
-push_node_filename (void)
+void
+push_node_filename ()
{
if (node_filename_stack_index + 1 > node_filename_stack_size)
node_filename_stack = xrealloc
@@ -272,15 +227,15 @@ push_node_filename (void)
node_filename_stack_index++;
}
-static void
-pop_node_filename (void)
+void
+pop_node_filename ()
{
node_filename = node_filename_stack[--node_filename_stack_index];
}
/* Save the state of the current input file. */
void
-pushfile (void)
+pushfile ()
{
FSTACK *newstack = xmalloc (sizeof (FSTACK));
newstack->filename = input_filename;
@@ -296,7 +251,7 @@ pushfile (void)
/* Make the current file globals be what is on top of the file stack. */
void
-popfile (void)
+popfile ()
{
FSTACK *tos = filestack;
@@ -330,7 +285,7 @@ popfile (void)
/* Flush all open files on the file stack. */
void
-flush_file_stack (void)
+flush_file_stack ()
{
while (filestack)
{
@@ -345,7 +300,8 @@ flush_file_stack (void)
/* Return the index of the first character in the filename
which is past all the leading directory characters. */
static int
-skip_directory_part (char *filename)
+skip_directory_part (filename)
+ char *filename;
{
int i = strlen (filename) - 1;
@@ -359,8 +315,9 @@ skip_directory_part (char *filename)
return i;
}
-static char *
-filename_non_directory (char *name)
+char *
+filename_non_directory (name)
+ char *name;
{
return xstrdup (name + skip_directory_part (name));
}
@@ -369,14 +326,17 @@ filename_non_directory (char *name)
filename without the path information, or extensions.
This conses up a new string. */
char *
-filename_part (char *filename)
+filename_part (filename)
+ char *filename;
{
char *basename = filename_non_directory (filename);
#ifdef REMOVE_OUTPUT_EXTENSIONS
/* See if there is an extension to remove. If so, remove it. */
{
- char *temp = strrchr (basename, '.');
+ char *temp;
+
+ temp = strrchr (basename, '.');
if (temp)
*temp = 0;
}
@@ -386,8 +346,10 @@ filename_part (char *filename)
/* Return the pathname part of filename. This can be NULL. */
char *
-pathname_part (char *filename)
+pathname_part (filename)
+ char *filename;
{
+ char *expand_filename ();
char *result = NULL;
int i;
@@ -404,9 +366,72 @@ pathname_part (char *filename)
return result;
}
+/* Return the expansion of FILENAME. */
+char *
+expand_filename (filename, input_name)
+ char *filename, *input_name;
+{
+ int i;
+ char *full_pathname ();
+
+ if (filename)
+ {
+ filename = full_pathname (filename);
+ if (IS_ABSOLUTE (filename)
+ || (*filename == '.' &&
+ (IS_SLASH (filename[1]) ||
+ (filename[1] == '.' && IS_SLASH (filename[2])))))
+ return filename;
+ }
+ else
+ {
+ filename = filename_non_directory (input_name);
+
+ if (!*filename)
+ {
+ free (filename);
+ filename = xstrdup ("noname.texi");
+ }
+
+ for (i = strlen (filename) - 1; i; i--)
+ if (filename[i] == '.')
+ break;
+
+ if (!i)
+ i = strlen (filename);
+
+ if (i + 6 > (strlen (filename)))
+ filename = xrealloc (filename, i + 6);
+ strcpy (filename + i, html ? ".html" : ".info");
+ return filename;
+ }
+
+ if (IS_ABSOLUTE (input_name))
+ {
+ /* Make it so that relative names work. */
+ char *result;
+
+ i = strlen (input_name) - 1;
+
+ result = xmalloc (1 + strlen (input_name) + strlen (filename));
+ strcpy (result, input_name);
+
+ while (!IS_SLASH (result[i]) && i)
+ i--;
+ if (IS_SLASH (result[i]))
+ i++;
+
+ strcpy (&result[i], filename);
+ free (filename);
+ return result;
+ }
+ return filename;
+}
+
/* Return the full path to FILENAME. */
-static char *
-full_pathname (char *filename)
+char *
+full_pathname (filename)
+ char *filename;
{
int initial_character;
char *result;
@@ -496,289 +521,9 @@ full_pathname (char *filename)
return result;
}
-/* Return the expansion of FILENAME. */
-char *
-expand_filename (char *filename, char *input_name)
-{
- int i;
-
- if (filename)
- {
- filename = full_pathname (filename);
- if (IS_ABSOLUTE (filename)
- || (*filename == '.' &&
- (IS_SLASH (filename[1]) ||
- (filename[1] == '.' && IS_SLASH (filename[2])))))
- return filename;
- }
- else
- {
- filename = filename_non_directory (input_name);
-
- if (!*filename)
- {
- free (filename);
- filename = xstrdup ("noname.texi");
- }
-
- for (i = strlen (filename) - 1; i; i--)
- if (filename[i] == '.')
- break;
-
- if (!i)
- i = strlen (filename);
-
- if (i + 6 > (strlen (filename)))
- filename = xrealloc (filename, i + 6);
- strcpy (filename + i, html ? ".html" : ".info");
- return filename;
- }
-
- if (IS_ABSOLUTE (input_name))
- {
- /* Make it so that relative names work. */
- char *result;
-
- i = strlen (input_name) - 1;
-
- result = xmalloc (1 + strlen (input_name) + strlen (filename));
- strcpy (result, input_name);
-
- while (!IS_SLASH (result[i]) && i)
- i--;
- if (IS_SLASH (result[i]))
- i++;
-
- strcpy (&result[i], filename);
- free (filename);
- return result;
- }
- return filename;
-}
-
char *
-output_name_from_input_name (char *name)
+output_name_from_input_name (name)
+ char *name;
{
return expand_filename (NULL, name);
}
-
-
-/* Modify the file name FNAME so that it fits the limitations of the
- underlying filesystem. In particular, truncate the file name as it
- would be truncated by the filesystem. We assume the result can
- never be longer than the original, otherwise we couldn't be sure we
- have enough space in the original string to modify it in place. */
-char *
-normalize_filename (char *fname)
-{
- int maxlen;
- char orig[PATH_MAX + 1];
- int i;
- char *lastdot, *p;
-
-#ifdef _PC_NAME_MAX
- maxlen = pathconf (fname, _PC_NAME_MAX);
- if (maxlen < 1)
-#endif
- maxlen = PATH_MAX;
-
- i = skip_directory_part (fname);
- if (fname[i] == '\0')
- return fname; /* only a directory name -- don't modify */
- strcpy (orig, fname + i);
-
- switch (maxlen)
- {
- case 12: /* MS-DOS 8+3 filesystem */
- if (orig[0] == '.') /* leading dots are not allowed */
- orig[0] = '_';
- lastdot = strrchr (orig, '.');
- if (!lastdot)
- lastdot = orig + strlen (orig);
- strncpy (fname + i, orig, lastdot - orig);
- for (p = fname + i;
- p < fname + i + (lastdot - orig) && p < fname + i + 8;
- p++)
- if (*p == '.')
- *p = '_';
- *p = '\0';
- if (*lastdot == '.')
- strncat (fname + i, lastdot, 4);
- break;
- case 14: /* old Unix systems with 14-char limitation */
- strcpy (fname + i, orig);
- if (strlen (fname + i) > 14)
- fname[i + 14] = '\0';
- break;
- default:
- strcpy (fname + i, orig);
- if (strlen (fname) > maxlen - 1)
- fname[maxlen - 1] = '\0';
- break;
- }
-
- return fname;
-}
-
-/* Delayed writing functions. A few of the commands
- needs to be handled at the end, namely @contents,
- @shortcontents, @printindex and @listoffloats.
- These functions take care of that. */
-static DELAYED_WRITE *delayed_writes = NULL;
-int handling_delayed_writes = 0;
-
-void
-register_delayed_write (char *delayed_command)
-{
- DELAYED_WRITE *new;
-
- if (!current_output_filename || !*current_output_filename)
- {
- /* Cannot register if we don't know what the output file is. */
- warning (_("`%s' omitted before output filename"), delayed_command);
- return;
- }
-
- if (STREQ (current_output_filename, "-"))
- {
- /* Do not register a new write if the output file is not seekable.
- Let the user know about it first, though. */
- warning (_("`%s' omitted since writing to stdout"), delayed_command);
- return;
- }
-
- /* Don't complain if the user is writing /dev/null, since surely they
- don't care, but don't register the delayed write, either. */
- if (FILENAME_CMP (current_output_filename, NULL_DEVICE) == 0
- || FILENAME_CMP (current_output_filename, ALSO_NULL_DEVICE) == 0)
- return;
-
- /* We need the HTML header in the output,
- to get a proper output_position. */
- if (!executing_string && html)
- html_output_head ();
- /* Get output_position updated. */
- flush_output ();
-
- new = xmalloc (sizeof (DELAYED_WRITE));
- new->command = xstrdup (delayed_command);
- new->filename = xstrdup (current_output_filename);
- new->input_filename = xstrdup (input_filename);
- new->position = output_position;
- new->calling_line = line_number;
- new->node = current_node ? xstrdup (current_node): "";
-
- new->node_order = node_order;
- new->index_order = index_counter;
-
- new->next = delayed_writes;
- delayed_writes = new;
-}
-
-void
-handle_delayed_writes (void)
-{
- DELAYED_WRITE *temp = (DELAYED_WRITE *) reverse_list
- ((GENERIC_LIST *) delayed_writes);
- int position_shift_amount, line_number_shift_amount;
- char *delayed_buf;
-
- handling_delayed_writes = 1;
-
- while (temp)
- {
- delayed_buf = find_and_load (temp->filename, 0);
-
- if (output_paragraph_offset > 0)
- {
- error (_("Output buffer not empty."));
- return;
- }
-
- if (!delayed_buf)
- {
- fs_error (temp->filename);
- return;
- }
-
- output_stream = fopen (temp->filename, "w");
- if (!output_stream)
- {
- fs_error (temp->filename);
- return;
- }
-
- if (fwrite (delayed_buf, 1, temp->position, output_stream) != temp->position)
- {
- fs_error (temp->filename);
- return;
- }
-
- {
- int output_position_at_start = output_position;
- int line_number_at_start = output_line_number;
-
- /* In order to make warnings and errors
- refer to the correct line number. */
- input_filename = temp->input_filename;
- line_number = temp->calling_line;
-
- execute_string ("%s", temp->command);
- flush_output ();
-
- /* Since the output file is modified, following delayed writes
- need to be updated by this amount. */
- position_shift_amount = output_position - output_position_at_start;
- line_number_shift_amount = output_line_number - line_number_at_start;
- }
-
- if (fwrite (delayed_buf + temp->position, 1,
- input_text_length - temp->position, output_stream)
- != input_text_length - temp->position
- || fclose (output_stream) != 0)
- fs_error (temp->filename);
-
- /* Done with the buffer. */
- free (delayed_buf);
-
- /* Update positions in tag table for nodes that are defined after
- the line this delayed write is registered. */
- if (!html && !xml)
- {
- TAG_ENTRY *node;
- for (node = tag_table; node; node = node->next_ent)
- if (node->order > temp->node_order)
- node->position += position_shift_amount;
- }
-
- /* Something similar for the line numbers in all of the defined
- indices. */
- {
- int i;
- for (i = 0; i < defined_indices; i++)
- if (name_index_alist[i])
- {
- char *name = ((INDEX_ALIST *) name_index_alist[i])->name;
- INDEX_ELT *index;
- for (index = index_list (name); index; index = index->next)
- if ((no_headers || STREQ (index->node, temp->node))
- && index->entry_number > temp->index_order)
- index->output_line += line_number_shift_amount;
- }
- }
-
- /* Shift remaining delayed positions
- by the length of this write. */
- {
- DELAYED_WRITE *future_write = temp->next;
- while (future_write)
- {
- if (STREQ (temp->filename, future_write->filename))
- future_write->position += position_shift_amount;
- future_write = future_write->next;
- }
- }
-
- temp = temp->next;
- }
-}