/* * Copyright 1987, 1988 by MIT Student Information Processing Board * * Permission to use, copy, modify, and distribute this software and * its documentation for any purpose is hereby granted, provided that * the names of M.I.T. and the M.I.T. S.I.P.B. not be used in * advertising or publicity pertaining to distribution of the software * without specific, written prior permission. M.I.T. and the * M.I.T. S.I.P.B. make no representations about the suitability of * this software for any purpose. It is provided "as is" without * express or implied warranty. */ #ifndef _ss_ss_internal_h #define _ss_ss_internal_h __FILE__ #include <stdio.h> #include <string.h> #include <stdlib.h> #define PROTOTYPE(p) p typedef void * pointer; #include "ss.h" typedef char BOOL; typedef struct _ss_abbrev_entry { char *name; /* abbrev name */ char **abbrev; /* new tokens to insert */ unsigned int beginning_of_line : 1; } ss_abbrev_entry; typedef struct _ss_abbrev_list { int n_abbrevs; ss_abbrev_entry *first_abbrev; } ss_abbrev_list; typedef struct { /* char *path; */ ss_abbrev_list abbrevs[127]; } ss_abbrev_info; typedef struct _ss_data { /* init values */ /* this subsystem */ const char *subsystem_name; const char *subsystem_version; /* current request info */ int argc; char **argv; /* arg list */ char const *current_request; /* primary name */ /* info directory for 'help' */ char **info_dirs; /* to be extracted by subroutines */ pointer info_ptr; /* (void *) NULL */ /* for ss_listen processing */ char *prompt; ss_request_table **rqt_tables; ss_abbrev_info *abbrev_info; struct { unsigned int escape_disabled : 1, abbrevs_disabled : 1; } flags; /* * Dynamic usage of readline library if present */ void *readline_handle; void (*readline_shutdown)(struct _ss_data *info); char *(*readline)(const char *); void (*add_history)(const char *); void (*redisplay)(void); char **(*rl_completion_matches)(const char *, char *(*completer)(const char *, int)); /* to get out */ int abort; /* exit subsystem */ int exit_status; } ss_data; #define CURRENT_SS_VERSION 1 #define ss_info(sci_idx) (_ss_table[sci_idx]) #define ss_current_request(sci_idx,code_ptr) \ (*code_ptr=0,ss_info(sci_idx)->current_request) void ss_add_info_dir (int sci_idx, char *info_dir, int *code_ptr); void ss_delete_info_dir (int sci_idx, char *info_dir, int *code_ptr); int ss_execute_line(int sci_idx, char *line_ptr); char **ss_parse(int sci_idx, char *line_ptr, int *argc_ptr); ss_abbrev_info *ss_abbrev_initialize(char *, int *); void ss_page_stdin(void); void ss_list_requests(int, char const * const *, int, pointer); int ss_execute_command(int sci_idx, char *argv[]); int ss_pager_create(void); char *ss_safe_getenv(const char *arg); char **ss_rl_completion(const char *text, int start, int end); extern ss_data **_ss_table; extern char *ss_et_msgs[]; extern char *_ss_pager_name; #ifdef USE_SIGPROCMASK /* fake sigmask, sigblock, sigsetmask */ #include <signal.h> #define sigmask(x) (1L<<(x)-1) #define sigsetmask(x) sigprocmask(SIG_SETMASK,&x,NULL) static int _fake_sigstore; #define sigblock(x) (_fake_sigstore=x,sigprocmask(SIG_BLOCK,&_fake_sigstore,0)) #endif #endif /* _ss_internal_h */