Merge branch 'vendor/DIFFUTILS'
[dragonfly.git] / contrib / texinfo / info / info-utils.h
1 /* info-utils.h -- Exported functions and variables from info-utils.c.
2    $Id: info-utils.h,v 1.8 2008/05/10 14:39:04 gray Exp $   
3
4    Copyright (C) 1993, 1996, 1998, 2002, 2003, 2004, 2007 Free Software
5    Foundation, Inc.
6
7    This program is free software: you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation, either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
20    Written by Brian Fox (bfox@ai.mit.edu). */
21
22 #ifndef INFO_UTILS_H
23 #define INFO_UTILS_H
24
25 #include "nodes.h"
26 #include "window.h"
27 #include "search.h"
28
29 /* Structure which describes a node reference, such as a menu entry or
30    cross reference.  Arrays of such references can be built by calling
31    info_menus_of_node () or info_xrefs_of_node (). */
32 typedef struct {
33   char *label;          /* User Label. */
34   char *filename;       /* File where this node can be found. */
35   char *nodename;       /* Name of the node. */
36   int start, end;       /* Offsets within the containing node of LABEL. */
37   int line_number;      /* Specific line number a menu item points to.  */
38 } REFERENCE;
39
40 /* When non-zero, various display and input functions handle ISO Latin
41    character sets correctly. */
42 extern int ISO_Latin_p;
43
44 /* Variable which holds the most recent filename parsed as a result of
45    calling info_parse_xxx (). */
46 extern char *info_parsed_filename;
47
48 /* Variable which holds the most recent nodename parsed as a result of
49    calling info_parse_xxx (). */
50 extern char *info_parsed_nodename;
51
52 /* Parse the filename and nodename out of STRING.  If STRING doesn't
53    contain a filename (i.e., it is NOT (FILENAME)NODENAME) then set
54    INFO_PARSED_FILENAME to NULL.  If second argument NEWLINES_OKAY is
55    non-zero, it says to allow the nodename specification to cross a
56    newline boundary (i.e., only `,', `.', or `TAB' can end the spec). */
57 void info_parse_node (char *string, int newlines_okay);
58
59 /* Return a NULL terminated array of REFERENCE * which represents the menu
60    found in NODE.  If there is no menu in NODE, just return a NULL pointer. */
61 extern REFERENCE **info_menu_of_node (NODE *node);
62
63 /* Return a NULL terminated array of REFERENCE * which represents the cross
64    refrences found in NODE.  If there are no cross references in NODE, just
65    return a NULL pointer. */
66 extern REFERENCE **info_xrefs_of_node (NODE *node);
67
68 /* Glean cross references from BINDING->buffer + BINDING->start until
69    BINDING->end.  Return an array of REFERENCE * that represents each
70    cross reference in this range. */
71 extern REFERENCE **info_xrefs (SEARCH_BINDING *binding);
72
73 /* Get the entry associated with LABEL in REFERENCES.  Return a pointer to
74    the reference if found, or NULL. */
75 extern REFERENCE *info_get_labeled_reference (char *label,
76     REFERENCE **references);
77
78 /* Glean menu entries from BINDING->buffer + BINDING->start until we
79    have looked at the entire contents of BINDING.  Return an array
80    of REFERENCE * that represents each menu item in this range. */
81 extern REFERENCE **info_menu_items (SEARCH_BINDING *binding);
82
83 /* A utility function for concatenating REFERENCE **.  Returns a new
84    REFERENCE ** which is the concatenation of REF1 and REF2.  The REF1
85    and REF2 arrays are freed, but their contents are not. */
86 REFERENCE **info_concatenate_references (REFERENCE **ref1, REFERENCE **ref2);
87
88 /* Copy an existing reference into new memory.  */
89 extern REFERENCE *info_copy_reference (REFERENCE *src);
90
91 /* Free the data associated with REFERENCES. */
92 extern void info_free_references (REFERENCE **references);
93
94 /* Search for sequences of whitespace or newlines in STRING, replacing
95    all such sequences with just a single space.  Remove whitespace from
96    start and end of string. */
97 void canonicalize_whitespace (char *string);
98
99 /* Return a pointer to a string which is the printed representation
100    of CHARACTER if it were printed at HPOS. */
101 extern char *printed_representation (const unsigned char *cp, size_t len,
102                                      size_t hpos, size_t *plen);
103
104 /* Return a pointer to the part of PATHNAME that simply defines the file. */
105 extern char *filename_non_directory (char *pathname);
106
107 /* Return non-zero if NODE is one especially created by Info. */
108 extern int internal_info_node_p (NODE *node);
109
110 /* Make NODE appear to be one especially created by Info, and give it NAME. */
111 extern void name_internal_node (NODE *node, char *name);
112
113 /* Return the window displaying NAME, the name of an internally created
114    Info window. */
115 extern WINDOW *get_internal_info_window (char *name);
116
117 /* Return a window displaying the node NODE. */
118 extern WINDOW *get_window_of_node (NODE *node);
119
120 /* Return the node addressed by LABEL in NODE (usually one of "Prev:",
121    "Next:", "Up:", "File:", or "Node:".  After a call to this function,
122    the globals `info_parsed_nodename' and `info_parsed_filename' contain
123    the information. */
124 extern void info_parse_label (char *label, NODE *node);
125
126 #define info_file_label_of_node(n) info_parse_label (INFO_FILE_LABEL, n)
127 #define info_next_label_of_node(n) info_parse_label (INFO_NEXT_LABEL, n)
128 #define info_up_label_of_node(n)   info_parse_label (INFO_UP_LABEL, n)
129 #define info_prev_label_of_node(n) \
130   do { \
131     info_parse_label (INFO_PREV_LABEL, n); \
132     if (!info_parsed_nodename && !info_parsed_filename) \
133       info_parse_label (INFO_ALTPREV_LABEL, n); \
134   } while (0)
135
136 #endif /* not INFO_UTILS_H */