Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / histedit.h @ 13

History | View | Annotate | Download (9.2 KB)

1
/*        $NetBSD: histedit.h,v 1.53 2014/06/18 18:12:28 christos Exp $        */
2

    
3
/*-
4
 * Copyright (c) 1992, 1993
5
 *        The Regents of the University of California.  All rights reserved.
6
 *
7
 * This code is derived from software contributed to Berkeley by
8
 * Christos Zoulas of Cornell University.
9
 *
10
 * Redistribution and use in source and binary forms, with or without
11
 * modification, are permitted provided that the following conditions
12
 * are met:
13
 * 1. Redistributions of source code must retain the above copyright
14
 *    notice, this list of conditions and the following disclaimer.
15
 * 2. Redistributions in binary form must reproduce the above copyright
16
 *    notice, this list of conditions and the following disclaimer in the
17
 *    documentation and/or other materials provided with the distribution.
18
 * 3. Neither the name of the University nor the names of its contributors
19
 *    may be used to endorse or promote products derived from this software
20
 *    without specific prior written permission.
21
 *
22
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32
 * SUCH DAMAGE.
33
 *
34
 *        @(#)histedit.h        8.2 (Berkeley) 1/3/94
35
 */
36

    
37
/*
38
 * histedit.h: Line editor and history interface.
39
 */
40
#ifndef _HISTEDIT_H_
41
#define        _HISTEDIT_H_
42

    
43
#define        LIBEDIT_MAJOR 2
44
#define        LIBEDIT_MINOR 11
45

    
46
#include <sys/types.h>
47
#include <stdio.h>
48

    
49
#ifdef __cplusplus
50
extern "C" {
51
#endif
52

    
53
/*
54
 * ==== Editing ====
55
 */
56

    
57
typedef struct editline EditLine;
58

    
59
/*
60
 * For user-defined function interface
61
 */
62
typedef struct lineinfo {
63
        const char        *buffer;
64
        const char        *cursor;
65
        const char        *lastchar;
66
} LineInfo;
67

    
68
/*
69
 * EditLine editor function return codes.
70
 * For user-defined function interface
71
 */
72
#define        CC_NORM                0
73
#define        CC_NEWLINE        1
74
#define        CC_EOF                2
75
#define        CC_ARGHACK        3
76
#define        CC_REFRESH        4
77
#define        CC_CURSOR        5
78
#define        CC_ERROR        6
79
#define        CC_FATAL        7
80
#define        CC_REDISPLAY        8
81
#define        CC_REFRESH_BEEP        9
82

    
83
/*
84
 * Initialization, cleanup, and resetting
85
 */
86
EditLine        *el_init(const char *, FILE *, FILE *, FILE *);
87
EditLine        *el_init_fd(const char *, FILE *, FILE *, FILE *,
88
    int, int, int);
89
void                 el_end(EditLine *);
90
void                 el_reset(EditLine *);
91

    
92
/*
93
 * Get a line, a character or push a string back in the input queue
94
 */
95
const char        *el_gets(EditLine *, int *);
96
int                 el_getc(EditLine *, char *);
97
void                 el_push(EditLine *, const char *);
98

    
99
/*
100
 * Beep!
101
 */
102
void                 el_beep(EditLine *);
103

    
104
/*
105
 * High level function internals control
106
 * Parses argc, argv array and executes builtin editline commands
107
 */
108
int                 el_parse(EditLine *, int, const char **);
109

    
110
/*
111
 * Low level editline access functions
112
 */
113
int                 el_set(EditLine *, int, ...);
114
int                 el_get(EditLine *, int, ...);
115
unsigned char        _el_fn_complete(EditLine *, int);
116

    
117
/*
118
 * el_set/el_get parameters
119
 *
120
 * When using el_wset/el_wget (as opposed to el_set/el_get):
121
 *   Char is wchar_t, otherwise it is char.
122
 *   prompt_func is el_wpfunc_t, otherwise it is el_pfunc_t .
123

124
 * Prompt function prototypes are:
125
 *   typedef char    *(*el_pfunct_t)  (EditLine *);
126
 *   typedef wchar_t *(*el_wpfunct_t) (EditLine *);
127
 *
128
 * For operations that support set or set/get, the argument types listed are for
129
 * the "set" operation. For "get", each listed type must be a pointer.
130
 * E.g. EL_EDITMODE takes an int when set, but an int* when get.
131
 * 
132
 * Operations that only support "get" have the correct argument types listed.
133
 */
134
#define        EL_PROMPT        0        /* , prompt_func);                      set/get */
135
#define        EL_TERMINAL        1        /* , const char *);                      set/get */
136
#define        EL_EDITOR        2        /* , const Char *);                      set/get */
137
#define        EL_SIGNAL        3        /* , int);                              set/get */
138
#define        EL_BIND                4        /* , const Char *, ..., NULL);              set     */
139
#define        EL_TELLTC        5        /* , const Char *, ..., NULL);              set     */
140
#define        EL_SETTC        6        /* , const Char *, ..., NULL);              set     */
141
#define        EL_ECHOTC        7        /* , const Char *, ..., NULL);        set     */
142
#define        EL_SETTY        8        /* , const Char *, ..., NULL);        set     */
143
#define        EL_ADDFN        9        /* , const Char *, const Char,        set     */
144
                                /*   el_func_t);                               */
145
#define        EL_HIST                10        /* , hist_fun_t, const void *);              set     */
146
#define        EL_EDITMODE        11        /* , int);                              set/get */
147
#define        EL_RPROMPT        12        /* , prompt_func);                      set/get */
148
#define        EL_GETCFN        13        /* , el_rfunc_t);                      set/get */
149
#define        EL_CLIENTDATA        14        /* , void *);                              set/get */
150
#define        EL_UNBUFFERED        15        /* , int);                              set/get */
151
#define        EL_PREP_TERM        16        /* , int);                              set     */
152
#define        EL_GETTC        17        /* , const Char *, ..., NULL);                  get */
153
#define        EL_GETFP        18        /* , int, FILE **);                          get */
154
#define        EL_SETFP        19        /* , int, FILE *);                      set     */
155
#define        EL_REFRESH        20        /* , void);                              set     */
156
#define        EL_PROMPT_ESC        21        /* , prompt_func, Char);              set/get */
157
#define        EL_RPROMPT_ESC        22        /* , prompt_func, Char);              set/get */
158
#define        EL_RESIZE        23        /* , el_zfunc_t, void *);              set     */
159
#define        EL_ALIAS_TEXT        24        /* , el_afunc_t, void *);              set     */
160

    
161
#define        EL_BUILTIN_GETCFN        (NULL)
162

    
163
/*
164
 * Source named file or $PWD/.editrc or $HOME/.editrc
165
 */
166
int                el_source(EditLine *, const char *);
167

    
168
/*
169
 * Must be called when the terminal changes size; If EL_SIGNAL
170
 * is set this is done automatically otherwise it is the responsibility
171
 * of the application
172
 */
173
void                 el_resize(EditLine *);
174

    
175
/*
176
 * User-defined function interface.
177
 */
178
const LineInfo        *el_line(EditLine *);
179
int                 el_insertstr(EditLine *, const char *);
180
void                 el_deletestr(EditLine *, int);
181

    
182

    
183
/*
184
 * ==== History ====
185
 */
186

    
187
typedef struct history History;
188

    
189
typedef struct HistEvent {
190
        int                 num;
191
        const char        *str;
192
} HistEvent;
193

    
194
/*
195
 * History access functions.
196
 */
197
History *        history_init(void);
198
void                history_end(History *);
199

    
200
int                history(History *, HistEvent *, int, ...);
201

    
202
#define        H_FUNC                 0        /* , UTSL                */
203
#define        H_SETSIZE         1        /* , const int);        */
204
#define        H_GETSIZE         2        /* , void);                */
205
#define        H_FIRST                 3        /* , void);                */
206
#define        H_LAST                 4        /* , void);                */
207
#define        H_PREV                 5        /* , void);                */
208
#define        H_NEXT                 6        /* , void);                */
209
#define        H_CURR                 8        /* , const int);        */
210
#define        H_SET                 7        /* , int);                */
211
#define        H_ADD                 9        /* , const wchar_t *);        */
212
#define        H_ENTER                10        /* , const wchar_t *);        */
213
#define        H_APPEND        11        /* , const wchar_t *);        */
214
#define        H_END                12        /* , void);                */
215
#define        H_NEXT_STR        13        /* , const wchar_t *);        */
216
#define        H_PREV_STR        14        /* , const wchar_t *);        */
217
#define        H_NEXT_EVENT        15        /* , const int);        */
218
#define        H_PREV_EVENT        16        /* , const int);        */
219
#define        H_LOAD                17        /* , const char *);        */
220
#define        H_SAVE                18        /* , const char *);        */
221
#define        H_CLEAR                19        /* , void);                */
222
#define        H_SETUNIQUE        20        /* , int);                */
223
#define        H_GETUNIQUE        21        /* , void);                */
224
#define        H_DEL                22        /* , int);                */
225
#define        H_NEXT_EVDATA        23        /* , const int, histdata_t *);        */
226
#define        H_DELDATA        24        /* , int, histdata_t *);*/
227
#define        H_REPLACE        25        /* , const char *, histdata_t);        */
228
#define        H_SAVE_FP        26        /* , FILE *);                */
229

    
230

    
231

    
232
/*
233
 * ==== Tokenization ====
234
 */
235

    
236
typedef struct tokenizer Tokenizer;
237

    
238
/*
239
 * String tokenization functions, using simplified sh(1) quoting rules
240
 */
241
Tokenizer        *tok_init(const char *);
242
void                 tok_end(Tokenizer *);
243
void                 tok_reset(Tokenizer *);
244
int                 tok_line(Tokenizer *, const LineInfo *,
245
                    int *, const char ***, int *, int *);
246
int                 tok_str(Tokenizer *, const char *,
247
                    int *, const char ***);
248

    
249
/*
250
 * Begin Wide Character Support
251
 */
252
#ifdef __linux__
253
/* Apparently we need _GNU_SOURCE defined to get access to wcsdup on Linux */
254
#ifndef _GNU_SOURCE
255
#define _GNU_SOURCE
256
#endif
257
#endif
258

    
259
#include <wchar.h>
260
#include <wctype.h>
261

    
262
/*
263
 * Wide character versions
264
 */
265

    
266
/*
267
 * ==== Editing ====
268
 */
269
typedef struct lineinfow {
270
        const wchar_t        *buffer;
271
        const wchar_t        *cursor;
272
        const wchar_t        *lastchar;
273
} LineInfoW;
274

    
275
const wchar_t        *el_wgets(EditLine *, int *);
276
int                 el_wgetc(EditLine *, wchar_t *);
277
void                 el_wpush(EditLine *, const wchar_t *);
278

    
279
int                 el_wparse(EditLine *, int, const wchar_t **);
280

    
281
int                 el_wset(EditLine *, int, ...);
282
int                 el_wget(EditLine *, int, ...);
283

    
284
int                 el_cursor(EditLine *, int);
285
const LineInfoW        *el_wline(EditLine *);
286
int                 el_winsertstr(EditLine *, const wchar_t *);
287
#define          el_wdeletestr  el_deletestr
288

    
289
/*
290
 * ==== History ====
291
 */
292
typedef struct histeventW {
293
        int                 num;
294
        const wchar_t        *str;
295
} HistEventW;
296

    
297
typedef struct historyW HistoryW;
298

    
299
HistoryW *        history_winit(void);
300
void                history_wend(HistoryW *);
301

    
302
int                history_w(HistoryW *, HistEventW *, int, ...);
303

    
304
/*
305
 * ==== Tokenization ====
306
 */
307
typedef struct tokenizerW TokenizerW;
308

    
309
/* Wide character tokenizer support */
310
TokenizerW        *tok_winit(const wchar_t *);
311
void                 tok_wend(TokenizerW *);
312
void                 tok_wreset(TokenizerW *);
313
int                 tok_wline(TokenizerW *, const LineInfoW *,
314
                    int *, const wchar_t ***, int *, int *);
315
int                 tok_wstr(TokenizerW *, const wchar_t *,
316
                    int *, const wchar_t ***);
317

    
318
#ifdef __cplusplus
319
}
320
#endif
321

    
322
#endif /* _HISTEDIT_H_ */