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