Whamcloud - gitweb
388a37689a1e4ae3a8f2be91699f89e2f57cd3c5
[tools/e2fsprogs.git] / lib / ss / ss_internal.h
1 /*
2  * Copyright 1987, 1988 by MIT Student Information Processing Board
3  *
4  * For copyright information, see copyright.h.
5  */
6
7 #ifndef _ss_ss_internal_h
8 #define _ss_ss_internal_h __FILE__
9 #include <stdio.h>
10 #include <string.h>
11 #include <stdlib.h>
12
13 #ifdef __STDC__
14
15 #define NOARGS void
16 #define PROTOTYPE(p) p
17 typedef void * pointer;
18
19 #else
20
21 #define NOARGS
22 #define const
23 #define volatile
24 #define PROTOTYPE(p) ()
25 typedef char * pointer;
26
27 #endif /* not __STDC__ */
28
29 #include "ss.h"
30
31 #if defined(__GNUC__)
32 #define LOCAL_ALLOC(x) __builtin_alloca(x)
33 #define LOCAL_FREE(x)
34 #else
35 #if defined(vax)
36 #define LOCAL_ALLOC(x) alloca(x)
37 #define LOCAL_FREE(x)
38 extern pointer alloca PROTOTYPE((unsigned));
39 #else
40 #if defined(__HIGHC__)  /* Barf! */
41 pragma on(alloca);
42 #define LOCAL_ALLOC(x) alloca(x)
43 #define LOCAL_FREE(x)
44 extern pointer alloca PROTOTYPE((unsigned));
45 #else
46 /* no alloca? */
47 #define LOCAL_ALLOC(x) malloc(x)
48 #define LOCAL_FREE(x) free(x)
49 #endif
50 #endif
51 #endif                          /* LOCAL_ALLOC stuff */
52
53 typedef char BOOL;
54
55 typedef struct _ss_abbrev_entry {
56     char *name;                 /* abbrev name */
57     char **abbrev;              /* new tokens to insert */
58     unsigned int beginning_of_line : 1;
59 } ss_abbrev_entry;
60
61 typedef struct _ss_abbrev_list {
62     int n_abbrevs;
63     ss_abbrev_entry *first_abbrev;
64 } ss_abbrev_list;
65
66 typedef struct {
67 /*    char *path; */
68     ss_abbrev_list abbrevs[127];
69 } ss_abbrev_info;
70
71 typedef struct _ss_data {       /* init values */
72     /* this subsystem */
73     char *subsystem_name;
74     char *subsystem_version;
75     /* current request info */
76     int argc;
77     char **argv;                /* arg list */
78     char const *current_request; /* primary name */
79     /* info directory for 'help' */
80     char **info_dirs;
81     /* to be extracted by subroutines */
82     pointer info_ptr;           /* (void *) NULL */
83     /* for ss_listen processing */
84     char *prompt;
85     ss_request_table **rqt_tables;
86     ss_abbrev_info *abbrev_info;
87     struct {
88         unsigned int  escape_disabled : 1,
89                       abbrevs_disabled : 1;
90     } flags;
91     /* to get out */
92     int abort;                  /* exit subsystem */
93     int exit_status;
94 } ss_data;
95
96 #define CURRENT_SS_VERSION 1
97
98 #define ss_info(sci_idx)        (_ss_table[sci_idx])
99 #define ss_current_request(sci_idx,code_ptr)    \
100      (*code_ptr=0,ss_info(sci_idx)->current_request)
101 void ss_delete_info_dir PROTOTYPE((int sci_idx, char *info_dir,
102                                    int *code_ptr));
103 int ss_execute_line PROTOTYPE((int sci_idx, char *line_ptr));
104 char **ss_parse PROTOTYPE((int sci_idx, char *line_ptr, int *argc_ptr));
105 ss_abbrev_info *ss_abbrev_initialize PROTOTYPE((char *, int *));
106 void ss_page_stdin(NOARGS);
107
108 extern ss_data **_ss_table;
109 extern char *ss_et_msgs[];
110
111 #ifdef USE_SIGPROCMASK
112 /* fake sigmask, sigblock, sigsetmask */
113 #include <signal.h>
114 #define sigmask(x) (1L<<(x)-1)
115 #define sigsetmask(x) sigprocmask(SIG_SETMASK,&x,NULL)
116 static int _fake_sigstore;
117 #define sigblock(x) (_fake_sigstore=x,sigprocmask(SIG_BLOCK,&_fake_sigstore,0))
118 #endif
119 #endif /* _ss_internal_h */