mcgrew@aramis.rutgers.edu (Charles Mcgrew) (05/15/91)
Submitted-by: chuck@trantor.harris-atd.com (Chuck Musciano) Posting-number: Volume 3, Issue 3 Archive-name: catcher/part02 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 2 (of 5)." # Contents: catcher.h execute.c lex.c misc.c option.c panel.c # place_dialog.c samples/sort.dd # Wrapped by chuck@melmac on Wed Jan 16 13:10:28 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'catcher.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'catcher.h'\" else echo shar: Extracting \"'catcher.h'\" \(3686 characters\) sed "s/^X//" >'catcher.h' <<'END_OF_FILE' X/************************************************************************/ X/* Copyright 1987-1991 by Chuck Musciano and Harris Corporation */ X/* */ X/* Full ownership of this software, and all rights pertaining to */ X/* the for-profit distribution of this software, are retained by */ X/* Chuck Musciano and Harris Corporation. You are permitted to */ X/* use this software without fee. This software is provided "as */ X/* is" without express or implied warranty. You may redistribute */ X/* this software, provided that this copyright notice is retained, */ X/* and that the software is not distributed for profit. If you */ X/* wish to use this software in a profit-making venture, you must */ X/* first license this code and its underlying technology from */ X/* Harris Corporation. */ X/* */ X/* Bottom line: you can have this software, you can use it, you */ X/* can give it away. You just can't sell any or all parts of it */ X/* without prior permission from Harris Corporation. */ X/************************************************************************/ X X/************************************************************************/ X/* */ X/* catcher.h main catcher data structures */ X/* */ X/************************************************************************/ X X#define PARM_TEXT 0 X#define PARM_NUMERIC 1 X X#define OPT_EXCLUSIVE 0 X#define OPT_NONEXCLUSIVE 1 X#define OPT_TEXT 2 X Xtypedef struct catch Catch; Xtypedef struct choice Choice; Xtypedef struct command Command; Xtypedef struct option Option; Xtypedef struct text Text; X Xstruct catch {char *icon; /* the tool icon */ X char *icon_mask; /* and its mask, for color systems */ X char *label; /* name for title bar */ X char *suffix; /* suffix to use for dropped text */ X char escape; /* substitution escape character */ X char ldelim; /* substitution left delimiter */ X char rdelim; /* substitution right delimiter */ X char *message; /* message for the footer while running */ X Command *command; /* a list of command specs */ X }; X Xstruct command {char *command; /* the command to be run */ X char *label; /* name to put in the panel */ X int optional; /* is this command optional? */ X Option *option; /* a list of command options */ X Panel panel; /* the control panel for this command */ X Panel_item toggle; /* if optional, the comand toggle */ X Command *next; /* more commands */ X }; X Xstruct text {int type; /* one of PARM_* */ X int length; /* display length of this field */ X int low; /* if numeric, the range minimum */ X int high; /* if numeric, the range maximum */ X char *text_init; /* if text, the initial value */ X int int_init; /* if numeric, the initial value */ X }; X Xstruct option {char *id; /* internal id of this option */ X char *label; /* name of this option group */ X int type; /* one of OPT_* */ X int horizontal; /* if a choice, layout direction */ X Text text; /* if a text option, the parameters */ X Choice *choice; /* if a choice, the various choices */ X Panel_item item; /* the panel item for this option */ X Option *next; /* more options */ X }; X Xstruct choice {char *id; /* internal id of this choice */ X char *value; /* insertion text for this choice */ X char *label; /* displayed name of this choice */ X int parameter; /* is there a text parameter? */ X int is_default; /* if a choice, is this one selected? */ X Text text; /* text parameter, if it exists */ X Panel_item item; /* the panel item for the parameter */ X Choice *next; /* more choices */ X }; X XPUBLIC Catch config; X XPUBLIC int output_width; XPUBLIC int output_height; END_OF_FILE if test 3686 -ne `wc -c <'catcher.h'`; then echo shar: \"'catcher.h'\" unpacked with wrong size! fi # end of 'catcher.h' fi if test -f 'execute.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'execute.c'\" else echo shar: Extracting \"'execute.c'\" \(7281 characters\) sed "s/^X//" >'execute.c' <<'END_OF_FILE' X/************************************************************************/ X/* Copyright 1987-1991 by Chuck Musciano and Harris Corporation */ X/* */ X/* Full ownership of this software, and all rights pertaining to */ X/* the for-profit distribution of this software, are retained by */ X/* Chuck Musciano and Harris Corporation. You are permitted to */ X/* use this software without fee. This software is provided "as */ X/* is" without express or implied warranty. You may redistribute */ X/* this software, provided that this copyright notice is retained, */ X/* and that the software is not distributed for profit. If you */ X/* wish to use this software in a profit-making venture, you must */ X/* first license this code and its underlying technology from */ X/* Harris Corporation. */ X/* */ X/* Bottom line: you can have this software, you can use it, you */ X/* can give it away. You just can't sell any or all parts of it */ X/* without prior permission from Harris Corporation. */ X/************************************************************************/ X X/************************************************************************/ X/* */ X/* execute.c fork and run a subcommand */ X/* */ X/************************************************************************/ X X#include <stdio.h> X#include <fcntl.h> X X#include <sys/types.h> X#include <sys/ioctl.h> X#include <sys/wait.h> X X#include <xview/xview.h> X#include <xview/textsw.h> X X#include "manifest.h" X XEXPORT int output_width = 80; XEXPORT int output_height = 40; X XPUBLIC Frame base; X XPRIVATE Frame out_win = NULL, err_win = NULL; XPRIVATE Textsw out_text, err_text; X XPRIVATE struct {int pid; X int output; X int errors; X } child[32]; X XPRIVATE int children = 0; X X/************************************************************************/ XPRIVATE close_window(frame) X XFrame frame; X X{ X textsw_reset((frame == out_win)? out_text : err_text, 0, 0); X xv_set(frame, FRAME_CMD_PUSHPIN_IN, FALSE, XV_SHOW, FALSE, NULL); X} X X/************************************************************************/ XPRIVATE Notify_value catch_close(frame, event, arg, type) X XFrame frame; XEvent *event; XNotify_arg arg; XNotify_event_type type; X X{ X if (event_id(event) == '\003' && event_is_down(event)) { X close_window((frame == (Frame) xv_get(out_text, OPENWIN_NTH_VIEW, 0))? out_win : err_win); X return(NOTIFY_DONE); X } X return(notify_next_event_func(frame, event, arg, type)); X} X X/************************************************************************/ XPRIVATE create_windows() X X{ char buf[128]; X X lets_get_busy(base, TRUE, NULL); X sprintf(buf, "%s: Output", xv_get(base, FRAME_LABEL)); X out_win = (Frame) xv_create(base, FRAME_CMD, X FRAME_LABEL, buf, X FRAME_SHOW_FOOTER, TRUE, X FRAME_DONE_PROC, close_window, X FRAME_SHOW_RESIZE_CORNER, TRUE, X NULL); X xv_set(xv_get(out_win, FRAME_CMD_PANEL), WIN_SHOW, FALSE, NULL); X out_text = (Textsw) xv_create(out_win, TEXTSW, XV_X, 0, XV_Y, 0, NULL); X xv_set(out_text, XV_WIDTH, xv_cols(out_text, output_width), XV_HEIGHT, xv_rows(out_text, output_height), NULL); X window_fit(out_win); X sprintf(buf, "%s: Errors", xv_get(base, FRAME_LABEL)); X err_win = (Frame) xv_create(base, FRAME_CMD, X FRAME_LABEL, buf, X FRAME_SHOW_FOOTER, TRUE, X FRAME_DONE_PROC, close_window, X FRAME_SHOW_RESIZE_CORNER, TRUE, X NULL); X xv_set(xv_get(err_win, FRAME_CMD_PANEL), WIN_SHOW, FALSE, NULL); X err_text = (Textsw) xv_create(err_win, TEXTSW, XV_X, 0, XV_Y, 0, NULL); X xv_set(err_text, XV_WIDTH, xv_cols(err_text, output_width), XV_HEIGHT, xv_rows(err_text, output_height), NULL); X window_fit(err_win); X place_dialog(base, out_win); X place_dialog(base, err_win); X notify_interpose_event_func(xv_get(out_text, OPENWIN_NTH_VIEW, 0), catch_close, NOTIFY_SAFE); X notify_interpose_event_func(xv_get(err_text, OPENWIN_NTH_VIEW, 0), catch_close, NOTIFY_SAFE); X lets_get_busy(base, FALSE, NULL); X} X X/************************************************************************/ XPRIVATE Notify_value reader(client, fd) X XNotify_client client; Xint fd; X X{ int i, output, size; X char buf[1024]; X X for (i = 0; i < children; i++) X if (child[i].output == fd) { X output = TRUE; X break; X } X else if (child[i].errors == fd) { X output = FALSE; X break; X } X if (i >= children) X error("output from unknown descriptor %d", fd); X else if (ioctl(fd, FIONREAD, &size) == 0) X while (size > 0) X if ((i = read(fd, buf, sizeof(buf))) > 0) { X textsw_insert(output? out_text : err_text, buf, i); X xv_set(output? out_win : err_win, WIN_SHOW, TRUE, FRAME_CMD_PUSHPIN_IN, TRUE, NULL); X if (xv_get(base, FRAME_CLOSED)) X xv_set(base, FRAME_CLOSED, FALSE, NULL); X size -= i; X } X return(NOTIFY_DONE); X} X X/************************************************************************/ XPRIVATE Notify_value reaper(client, pid, status) X XNotify_client client; Xint pid; Xunion wait *status; X X{ int i, j; X X if (WIFEXITED(*status)) { X for (i = 0; i < children; i++) X if (child[i].pid == pid) { X notify_set_input_func(client, NOTIFY_FUNC_NULL, child[i].output); X notify_set_input_func(client, NOTIFY_FUNC_NULL, child[i].errors); X xv_set(base, FRAME_LEFT_FOOTER, "", NULL); X close(child[i].output); X close(child[i].errors); X for (j = i + 1; j < children; j++) X child[j - 1] = child[j]; X children--; X break; X } X return(NOTIFY_DONE); X } X return(NOTIFY_IGNORED); X} X X/************************************************************************/ XEXPORT execute(cmd, path) X Xchar *cmd; Xchar *path; X X{ int pid, input, output[2], errors[2], result; X FILE *f; X X if (out_win == NULL) X create_windows(); X if (pipe(output) == -1) { X error("cannot create a pipe: %s", sys_errlist[errno]); X return; X } X if (pipe(errors) == -1) { X error("cannot create a pipe: %s", sys_errlist[errno]); X return; X } X if ((input = open(path, O_RDONLY)) == -1) { X error("cannot open %s for reading: %s", path, sys_errlist[errno]); X return; X } X if ((pid = fork()) == -1) { X error("cannot fork subcommand: %s", sys_errlist[errno]); X return; X } X else if (pid == 0) { X if (input != 0) { X dup2(input, 0); X close(input); X } X dup2(output[1], 1); X dup2(errors[1], 2); X close(output[0]); X close(output[1]); X close(errors[0]); X close(errors[1]); X result = system(cmd); X sleep(2); /* let the output make it through */ X exit(result); X } X else { X child[children].pid = pid; X child[children].output = output[0]; X child[children].errors = errors[0]; X children++; X close(input); X close(output[1]); X close(errors[1]); X notify_set_input_func(base, reader, output[0]); X notify_set_input_func(base, reader, errors[0]); X notify_set_wait3_func(base, reaper, pid); X xv_set(out_win, FRAME_LEFT_FOOTER, cmd, NULL); X xv_set(err_win, FRAME_LEFT_FOOTER, cmd, NULL); X } X} X X/************************************************************************/ XEXPORT shutdown_windows() X X{ X if (out_win) { X close_window(out_win); X close_window(err_win); X } X} END_OF_FILE if test 7281 -ne `wc -c <'execute.c'`; then echo shar: \"'execute.c'\" unpacked with wrong size! fi # end of 'execute.c' fi if test -f 'lex.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'lex.c'\" else echo shar: Extracting \"'lex.c'\" \(7343 characters\) sed "s/^X//" >'lex.c' <<'END_OF_FILE' X/************************************************************************/ X/* Copyright 1987-1991 by Chuck Musciano and Harris Corporation */ X/* */ X/* Full ownership of this software, and all rights pertaining to */ X/* the for-profit distribution of this software, are retained by */ X/* Chuck Musciano and Harris Corporation. You are permitted to */ X/* use this software without fee. This software is provided "as */ X/* is" without express or implied warranty. You may redistribute */ X/* this software, provided that this copyright notice is retained, */ X/* and that the software is not distributed for profit. If you */ X/* wish to use this software in a profit-making venture, you must */ X/* first license this code and its underlying technology from */ X/* Harris Corporation. */ X/* */ X/* Bottom line: you can have this software, you can use it, you */ X/* can give it away. You just can't sell any or all parts of it */ X/* without prior permission from Harris Corporation. */ X/************************************************************************/ X X#define RETURN(x) return(last_token = (x)) X X#define FIRST_KEYWORD BY X#define LAST_KEYWORD WINDOW_ X#define NUM_KEYWORDS (LAST_KEYWORD - FIRST_KEYWORD + 1) X XPRIVATE FILE *f = NULL; XPRIVATE int last_token = -1; XPRIVATE char buf[1024]; X XPRIVATE struct {char *name; X int value; X } token[] = {{"by", BY}, X {"choice", CHOICE}, X {"command", COMMAND}, X {"default", DEFAULT}, X {"delimiter", DELIMITER}, X {"exclusive", EXCLUSIVE}, X {"horizontal", HORIZONTAL}, X {"icon", ICON_}, X {"icon_mask", ICON_MASK}, X {"init", INIT}, X {"label", LABEL}, X {"message", MESSAGE}, X {"nonexclusive", NONEXCLUSIVE}, X {"numeric", NUMERIC}, X {"optional", OPTIONAL}, X {"output", OUTPUT}, X {"parameter", PARAMETER}, X {"suffix", SUFFIX}, X {"text", TEXT}, X {"to", TO}, X {"value", VALUE}, X {"window", WINDOW_}}; X X X XPRIVATE struct {char first; X char next; X int name; X } punc[] = {{'{', '\0', LBRACE}, X {'}', '\0', RBRACE}, X {'\0', '\0', -1}}; X X/************************************************************************/ XEXPORT int lex_init(path) X Xchar *path; X X{ X if (f) X fclose(f); X if (path == NULL) { X curr_file = "stdin"; X f = stdin; X line_count = 1; X ungetc = -1; X return(TRUE); X } X else if (f = fopen(path, "r")) { X curr_file = strsave(path); X line_count = 1; X ungetc = -1; X return(TRUE); X } X else X return(FALSE); X} X X/************************************************************************/ XPRIVATE char getch() X X{ register char c; X static int first = TRUE; X X if (ungetc != -1) X c = ungetc, ungetc = -1; X else if (f == NULL) X return(EOF); X else { X c = getc(f); X if (c == '\n') X line_count++; X } X return(c); X} X X/************************************************************************/ XEXPORT fix_escapes(buf) X Xchar *buf; X X{ char *q; X int i; X X for (q = buf; *buf; buf++, q++) X if (*buf == '\\') X switch (*++buf) { X case 'b' : *q = '\010'; /* ^h */ X break; X case 'e' : *q = '\033'; /* esc */ X break; X case 'f' : *q = '\014'; /* ^l */ X break; X case 'n' : *q = '\012'; /* ^j */ X break; X case 'r' : *q = '\015'; /* ^m */ X break; X case 't' : *q = '\011'; /* ^i */ X break; X case '0' : X case '1' : X case '2' : X case '3' : X case '4' : X case '5' : X case '6' : X case '7' : *q = *buf++ - '0'; X for (i = 0; i < 2 && *buf >= '0' && *buf <= '7'; i++) X *q = (*q << 3) + *buf++ - '0'; X buf--; X break; X default : *q = *buf; X break; X } X else if (*buf == '^' && *(buf + 1) >= '@' && *(buf + 1) <= '_') X *q = *++buf & 0x1f; X else X *q = *buf; X *q = '\0'; X} X X/************************************************************************/ XPRIVATE int is_keyword(s) X Xchar *s; X X{ register int cmp, high, low, pos; X X for (low = 0, high = NUM_KEYWORDS - 1; low <= high; ) X if ((cmp = strcmp(s, token[pos = (high - low) / 2 + low].name)) == 0) X return(token[pos].value); X else if (cmp < 0) X high = pos - 1; X else X low = pos + 1; X return(NULL); X} X X/************************************************************************/ XPRIVATE int yylex() X X{ register char c, c1, *p; X register int i, j, val; X char *index(), *temp; X double atof(); X X c = getch(); X while (isspace(c)) X c = getch(); X if (isalpha(c)) { X p = buf; X *p++ = c; X while (isalnum(c = getch()) || c == '_') X *p++ = c; X ungetc = c; X *p = '\0'; X temp = strsave(buf); X for (p = buf; *p; p++) X if (isupper(*p)) X *p = tolower(*p); X if (i = is_keyword(buf)) { X free(temp); X RETURN(i); X } X else { X strcpy(buf, temp); X free(temp); X yylval.cpval = buf; X RETURN(ID); X } X } X else if (c == '"') { X for (p = buf; TRUE; p++) X if ((*p = getch()) == '"') X break; X else if (*p == '\\') X *++p = getch(); X else if (*p == '\n' || *p == '\r') { X yyerror("Newline in string not allowed"); X break; X } X *p = '\0'; X fix_escapes(buf); X yylval.cpval = buf; X RETURN(STRING); X } X else if (c == '-' || isdigit(c)) { X p = buf; X *p++ = c; X while (isdigit(c = getch())) X *p++ = c; X *p = '\0'; X ungetc = c; X yylval.ival = atoi(buf); X RETURN(INTEGER); X } X else if (c == EOF) { X fclose(f); X f = NULL; X RETURN(EOF); X } X else if (c == '#') { X while (getch() != '\n') X ; X RETURN(yylex()); X } X else { X for (i = 0; punc[i].first; i++) X if (c == punc[i].first) { X for (c1 = getch(), j = 1; punc[i + j].first == c; j++) X if (c1 == punc[i + j].next) X RETURN(punc[i + j].name); X ungetc = c1; X RETURN(punc[i].name); X } X yyerror("Invalid character in source file: %c (0x%02x)", c, c); X } X RETURN(yylex()); X} X X/************************************************************************/ XPRIVATE char *get_last_token() X X{ int i; X static char msg[512]; X X if (last_token == INTEGER || last_token == STRING || last_token == ID) X sprintf(msg, "\"%s\"", buf); X else if (last_token >= LBRACE && last_token <= RBRACE) { X for (i = 0; punc[i].first; i++) X if (punc[i].name == last_token) { X sprintf(msg, "\"%c\"", punc[i].first); X if (punc[i].next) X sprintf(msg + 2, "%c\"", punc[i].next); X break; X } X if (punc[i].first == '\0') X sprintf(msg, "!!Geez! Some punctuation, I don't know!!"); X } X else if (last_token >= FIRST_KEYWORD && last_token <= LAST_KEYWORD) X sprintf(msg, "\"%s\"", token[last_token - FIRST_KEYWORD].name); X else if (last_token == EOF) X sprintf(msg, "End Of File"); X else X sprintf(msg, "!!Geez! Some keyword, I don't know!!"); X return(msg); X} END_OF_FILE if test 7343 -ne `wc -c <'lex.c'`; then echo shar: \"'lex.c'\" unpacked with wrong size! fi # end of 'lex.c' fi if test -f 'misc.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'misc.c'\" else echo shar: Extracting \"'misc.c'\" \(2821 characters\) sed "s/^X//" >'misc.c' <<'END_OF_FILE' X/************************************************************************/ X/* Copyright 1987-1991 by Chuck Musciano and Harris Corporation */ X/* */ X/* Full ownership of this software, and all rights pertaining to */ X/* the for-profit distribution of this software, are retained by */ X/* Chuck Musciano and Harris Corporation. You are permitted to */ X/* use this software without fee. This software is provided "as */ X/* is" without express or implied warranty. You may redistribute */ X/* this software, provided that this copyright notice is retained, */ X/* and that the software is not distributed for profit. If you */ X/* wish to use this software in a profit-making venture, you must */ X/* first license this code and its underlying technology from */ X/* Harris Corporation. */ X/* */ X/* Bottom line: you can have this software, you can use it, you */ X/* can give it away. You just can't sell any or all parts of it */ X/* without prior permission from Harris Corporation. */ X/************************************************************************/ X X/************************************************************************/ X/* */ X/* misc.c miscellaneous support and conversion routines */ X/* */ X/************************************************************************/ X X#include <stdio.h> X#include <ctype.h> X X#include "manifest.h" X X/************************************************************************/ XEXPORT error(a, b, c, d, e, f, g, h) X Xint a, b, c, d, e, f, g, h; X X{ char buf[1024]; X X sprintf(buf, a, b, c, d, e, f, g, h); X fprintf(stderr, "%s\n", buf); X} X X/************************************************************************/ XEXPORT abend(a, b, c, d, e, f, g, h) X Xint a, b, c, d, e, f, g, h; X X{ X error(a, b, c, d, e, f, g, h); X exit(1); X} X X/************************************************************************/ XPRIVATE delarg(argc, argv) X Xint *argc; Xchar **argv; X X{ char *p; X X while (*argv = *(argv+1)) X argv++; X (*argc)--; X} X X/************************************************************************/ XEXPORT char getopt(argc, argv, opts, parm) X Xint *argc; Xchar **argv; Xchar *opts; Xchar **parm; X X{ char c, *p, *index(); X int killed; X X *parm = NULL; X while (*argv && ((**argv != '-') || (*(*argv+1) == '\0'))) X argv++; X if (*argv == NULL) X return(EOF); X c = *(*argv+1); X *++(*argv) = '-'; X if (killed = (*(*argv+1) == '\0')) X delarg(argc, argv); X if ((p = index(opts, c)) == NULL) X c = '\0'; X else if (*(p+1) == ':') { X *parm = killed ? *argv : *argv+1; X delarg(argc, argv); X } X return(c); X} X X/************************************************************************/ XEXPORT int is_empty(s) X Xchar *s; X X{ X if (s == NULL) X return(TRUE); X for (; *s; s++) X if (!isspace(*s)) X return(FALSE); X return(TRUE); X} END_OF_FILE if test 2821 -ne `wc -c <'misc.c'`; then echo shar: \"'misc.c'\" unpacked with wrong size! fi # end of 'misc.c' fi if test -f 'option.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'option.c'\" else echo shar: Extracting \"'option.c'\" \(5448 characters\) sed "s/^X//" >'option.c' <<'END_OF_FILE' X/************************************************************************/ X/* Copyright 1987-1991 by Chuck Musciano and Harris Corporation */ X/* */ X/* Full ownership of this software, and all rights pertaining to */ X/* the for-profit distribution of this software, are retained by */ X/* Chuck Musciano and Harris Corporation. You are permitted to */ X/* use this software without fee. This software is provided "as */ X/* is" without express or implied warranty. You may redistribute */ X/* this software, provided that this copyright notice is retained, */ X/* and that the software is not distributed for profit. If you */ X/* wish to use this software in a profit-making venture, you must */ X/* first license this code and its underlying technology from */ X/* Harris Corporation. */ X/* */ X/* Bottom line: you can have this software, you can use it, you */ X/* can give it away. You just can't sell any or all parts of it */ X/* without prior permission from Harris Corporation. */ X/************************************************************************/ X X/************************************************************************/ X/* */ X/* option.c build a single option */ X/* */ X/************************************************************************/ X X#include <stdio.h> X X#include <xview/xview.h> X#include <xview/panel.h> X X#include "manifest.h" X#include "catcher.h" X X/************************************************************************/ XPRIVATE choice_toggle(item, value, event) X XPanel_item item; Xint value; XEvent *event; X X{ Option *opt; X Choice *c; X int i; X X opt = (Option *) xv_get(item, PANEL_CLIENT_DATA); X for (i = 0, c = opt->choice; c; i++, c = c->next) X if (c->item) X if (opt->type == OPT_EXCLUSIVE) X xv_set(c->item, PANEL_INACTIVE, value != i, NULL); X else X xv_set(c->item, PANEL_INACTIVE, !(value & (1 << i)), NULL); X} X X/************************************************************************/ XPRIVATE create_text(panel, item, i, choice) X XPanel panel; XPanel_item item; Xint i; XChoice *choice; X X{ X if (choice->text.type == PARM_TEXT) X choice->item = (Panel_item) xv_create(panel, PANEL_TEXT, X PANEL_VALUE_DISPLAY_LENGTH, choice->text.length, X PANEL_VALUE_STORED_LENGTH, 10 * choice->text.length, X PANEL_VALUE, choice->text.text_init? choice->text.text_init : "", X PANEL_INACTIVE, TRUE, X XV_X, (int) X_MARGIN + (int) xv_get(item, XV_WIDTH) + ITEM_GAP, X XV_Y, (int) xv_get(item, PANEL_CHOICE_Y, i) + 5, X NULL); X else X choice->item = (Panel_item) xv_create(panel, PANEL_NUMERIC_TEXT, X PANEL_MIN_VALUE, choice->text.low, X PANEL_MAX_VALUE, choice->text.high, X PANEL_VALUE_DISPLAY_LENGTH, choice->text.length, X PANEL_VALUE_STORED_LENGTH, 10 * choice->text.length, X PANEL_VALUE, choice->text.int_init, X PANEL_INACTIVE, TRUE, X XV_X, (int) X_MARGIN + (int) xv_get(item, XV_WIDTH) + ITEM_GAP, X XV_Y, (int) xv_get(item, PANEL_CHOICE_Y, i) + 5, X NULL); X} X X/************************************************************************/ XEXPORT create_option(panel, opt, option_y) X XPanel panel; XOption *opt; Xint option_y; X X{ int i, val; X Choice *c; X X if (opt->type == OPT_EXCLUSIVE) X opt->item = (Panel_item) xv_create(panel, PANEL_CHOICE, X PANEL_LABEL_STRING, opt->label, X PANEL_LABEL_BOLD, TRUE, X opt->horizontal? PANEL_CHOICE_NROWS : PANEL_CHOICE_NCOLS, 1, X PANEL_CLIENT_DATA, opt, X PANEL_NOTIFY_PROC, choice_toggle, X XV_X, X_MARGIN, X XV_Y, option_y, X NULL); X else if (opt->type == OPT_NONEXCLUSIVE) X opt->item = (Panel_item) xv_create(panel, PANEL_TOGGLE, X PANEL_LABEL_STRING, opt->label, X PANEL_LABEL_BOLD, TRUE, X opt->horizontal? PANEL_CHOICE_NROWS : PANEL_CHOICE_NCOLS, 1, X PANEL_CLIENT_DATA, opt, X PANEL_NOTIFY_PROC, choice_toggle, X XV_X, X_MARGIN, X XV_Y, option_y, X NULL); X else if (opt->text.type == PARM_TEXT) X opt->item = (Panel_item) xv_create(panel, PANEL_TEXT, X PANEL_LABEL_STRING, opt->label, X PANEL_LABEL_BOLD, TRUE, X PANEL_VALUE_DISPLAY_LENGTH, opt->text.length, X PANEL_VALUE_STORED_LENGTH, 10 * opt->text.length, X XV_X, X_MARGIN, X XV_Y, option_y, X NULL); X else X opt->item = (Panel_item) xv_create(panel, PANEL_NUMERIC_TEXT, X PANEL_LABEL_STRING, opt->label, X PANEL_LABEL_BOLD, TRUE, X PANEL_MIN_VALUE, opt->text.low, X PANEL_MAX_VALUE, opt->text.high, X PANEL_VALUE_DISPLAY_LENGTH, opt->text.length, X PANEL_VALUE_STORED_LENGTH, 10 * opt->text.length, X XV_X, X_MARGIN, X XV_Y, option_y, X NULL); X if (opt->type != OPT_TEXT) { X for (i = val = 0, c = opt->choice; c; i++, c = c->next) { X xv_set(opt->item, PANEL_CHOICE_STRING, i, c->label, NULL); X if (c->is_default) X if (opt->type == OPT_EXCLUSIVE) X val = i; X else X val |= 1 << i; X } X for (i = 0, c = opt->choice; c; i++, c = c->next) X if (c->parameter) X create_text(panel, opt->item, i, c); X xv_set(opt->item, PANEL_VALUE, val, NULL); X choice_toggle(opt->item, val, NULL); X } X} END_OF_FILE if test 5448 -ne `wc -c <'option.c'`; then echo shar: \"'option.c'\" unpacked with wrong size! fi # end of 'option.c' fi if test -f 'panel.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'panel.c'\" else echo shar: Extracting \"'panel.c'\" \(3631 characters\) sed "s/^X//" >'panel.c' <<'END_OF_FILE' X/************************************************************************/ X/* Copyright 1987-1991 by Chuck Musciano and Harris Corporation */ X/* */ X/* Full ownership of this software, and all rights pertaining to */ X/* the for-profit distribution of this software, are retained by */ X/* Chuck Musciano and Harris Corporation. You are permitted to */ X/* use this software without fee. This software is provided "as */ X/* is" without express or implied warranty. You may redistribute */ X/* this software, provided that this copyright notice is retained, */ X/* and that the software is not distributed for profit. If you */ X/* wish to use this software in a profit-making venture, you must */ X/* first license this code and its underlying technology from */ X/* Harris Corporation. */ X/* */ X/* Bottom line: you can have this software, you can use it, you */ X/* can give it away. You just can't sell any or all parts of it */ X/* without prior permission from Harris Corporation. */ X/************************************************************************/ X X/************************************************************************/ X/* */ X/* panel.c build a command panel */ X/* */ X/************************************************************************/ X X#include <stdio.h> X X#include <xview/xview.h> X#include <xview/panel.h> X X#include "manifest.h" X#include "catcher.h" X X/************************************************************************/ XPRIVATE command_toggle(item, value, event) X XPanel_item item; Xint value; XEvent *event; X X{ Option *o; X Command *c; X Choice *ch; X int i, val; X X c = (Command *) xv_get(item, PANEL_CLIENT_DATA); X for (o = c->option; o; o = o->next) { X xv_set(o->item, PANEL_INACTIVE, !value, NULL); X if (o->type != OPT_TEXT) { X val = (int) xv_get(o->item, PANEL_VALUE); X for (i = 0, ch = o->choice; ch; ch = ch->next, i++) X if (ch->item) X if (value == 0) X xv_set(ch->item, PANEL_INACTIVE, TRUE, NULL); X else if (o->type == OPT_EXCLUSIVE) X xv_set(ch->item, PANEL_INACTIVE, val != i, NULL); X else if (o->type == OPT_NONEXCLUSIVE) X xv_set(ch->item, PANEL_INACTIVE, !(val & (1 << i)), NULL); X } X } X} X X/************************************************************************/ XEXPORT create_panel(base, cmd, panel_y) X XFrame base; XCommand *cmd; Xint panel_y; X X{ int y; X Option *opt; X Choice *c; X X cmd->panel = (Panel) xv_create(base, PANEL, X XV_X, 0, X XV_Y, panel_y, X WIN_BORDER, TRUE, X NULL); X if (cmd->optional) X cmd->toggle = (Panel_item) xv_create(cmd->panel, PANEL_CHECK_BOX, X PANEL_CHOICE_STRINGS, "", NULL, X PANEL_LABEL_STRING, cmd->label, X PANEL_LABEL_BOLD, TRUE, X PANEL_VALUE_X, TOP_MARGIN, X PANEL_VALUE_Y, TOP_MARGIN, X PANEL_LABEL_X, TOP_MARGIN + 20, X PANEL_LABEL_Y, TOP_MARGIN, X PANEL_VALUE, 1, X PANEL_NOTIFY_PROC, command_toggle, X PANEL_CLIENT_DATA, cmd, X NULL); X else X cmd->toggle = (Panel_item) xv_create(cmd->panel, PANEL_MESSAGE, X PANEL_LABEL_STRING, cmd->label, X PANEL_LABEL_BOLD, TRUE, X PANEL_LABEL_X, TOP_MARGIN, X PANEL_LABEL_Y, TOP_MARGIN, X NULL); X X y = (int) xv_get(cmd->toggle, XV_HEIGHT) + TOP_MARGIN + ITEM_GAP; X for (opt = cmd->option; opt; opt = opt->next) { X create_option(cmd->panel, opt, y); X y += (int) xv_get(opt->item, XV_HEIGHT) + ITEM_GAP; X } X X window_fit(cmd->panel); X} END_OF_FILE if test 3631 -ne `wc -c <'panel.c'`; then echo shar: \"'panel.c'\" unpacked with wrong size! fi # end of 'panel.c' fi if test -f 'place_dialog.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'place_dialog.c'\" else echo shar: Extracting \"'place_dialog.c'\" \(2563 characters\) sed "s/^X//" >'place_dialog.c' <<'END_OF_FILE' X/************************************************************************/ X/* Copyright 1987-1991 by Chuck Musciano and Harris Corporation */ X/* */ X/* Full ownership of this software, and all rights pertaining to */ X/* the for-profit distribution of this software, are retained by */ X/* Chuck Musciano and Harris Corporation. You are permitted to */ X/* use this software without fee. This software is provided "as */ X/* is" without express or implied warranty. You may redistribute */ X/* this software, provided that this copyright notice is retained, */ X/* and that the software is not distributed for profit. If you */ X/* wish to use this software in a profit-making venture, you must */ X/* first license this code and its underlying technology from */ X/* Harris Corporation. */ X/* */ X/* Bottom line: you can have this software, you can use it, you */ X/* can give it away. You just can't sell any or all parts of it */ X/* without prior permission from Harris Corporation. */ X/************************************************************************/ X X/************************************************************************/ X/* */ X/* place_dialog.c position a dialog box at the right place */ X/* */ X/************************************************************************/ X X#include <stdio.h> X#include <sys/param.h> X#include <sys/types.h> X#include <xview/xview.h> X#include <X11/Xutil.h> X X#include "manifest.h" X X/************************************************************************/ XEXPORT void place_dialog(base, dialog) X XXv_opaque base; XXv_opaque dialog; X X{ Rect br, dr, sr; X XWMHints *hints; X X sr = *((Rect *) xv_get(base, WIN_SCREEN_RECT)); X frame_get_rect(base, &br); X frame_get_rect(dialog, &dr); X if (rect_right(&br) + dr.r_width < sr.r_width) { X dr.r_left = rect_right(&br); X dr.r_top = br.r_top; X } X else if (dr.r_width <= br.r_left) { X dr.r_left = br.r_left - dr.r_width; X dr.r_top = br.r_top; X } X else { X dr.r_left = br.r_left + 32; X dr.r_top = br.r_top + 32; X } X if (dr.r_top + dr.r_height > sr.r_height) X dr.r_top = sr.r_height - dr.r_height; X if (dr.r_top < 0) X dr.r_top = 0; X if (rect_right(&dr) > sr.r_width) X dr.r_left = sr.r_width - dr.r_width; X if (dr.r_left < 0) X dr.r_left = 0; X frame_set_rect(dialog, &dr); X X hints = XGetWMHints(xv_get(dialog, XV_DISPLAY), xv_get(dialog, XV_XID)); X hints->flags |= StateHint; X hints->initial_state = NormalState; X XSetWMHints(xv_get(dialog, XV_DISPLAY), xv_get(dialog, XV_XID), hints); X XFree(hints); X} X END_OF_FILE if test 2563 -ne `wc -c <'place_dialog.c'`; then echo shar: \"'place_dialog.c'\" unpacked with wrong size! fi # end of 'place_dialog.c' fi if test -f 'samples/sort.dd' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'samples/sort.dd'\" else echo shar: Extracting \"'samples/sort.dd'\" \(2522 characters\) sed "s/^X//" >'samples/sort.dd' <<'END_OF_FILE' X#!/usr/local/bin/catcher X# X# Sort, uniq, and wc a dropped file X Xlabel "Sort A File" Xicon "sort.icon" Xicon_mask "sort.mask" Xoutput 24 by 80 Xsuffix "" Xmessage "Processing ${file:t}..." Xcommand { X label "Sort a file:" X optional X command "sort $dict $fold $month $number $reverse $field" X exclusive field { X label "Key field:" X horizontal X choice { X label "First" X value "" X default X } X choice { X label "Second" X value "+1" X } X choice { X label "Third" X value "+2" X } X choice { X label "Fourth" X value "+3" X } X choice { X label "Fifth" X value "+4" X } X } X nonexclusive { X label "Options:" X choice fold { X label "Case does not matter" X value "-f" X } X choice month { X label "Sort by months" X value "-M" X } X choice reverse { X label "Sort in reverse order" X value "-r" X } X choice number { X label "Sort numerically" X value "-n" X } X choice dict { X label "Use dictionary order" X value "-d" X } X } X } Xcommand { X label "Remove duplicate lines:" X optional X command "uniq $option" X exclusive option { X label "Extract:" X choice { X label "One copy of each line" X value "" X } X choice { X label "One copy of each line, with occurence counts" X value "-c" X } X choice { X label "One copy of lines only" X value "-d" X } X choice { X label "One copy of lines only" X value "-u" X } X } X } Xcommand { X label "Count lines:" X optional X command "wc $option" X exclusive option { X label "Count:" X horizontal X choice { X label "Characters" X value "-c" X } X choice { X label "Words" X value "-w" X } X choice { X label "Lines" X value "-l" X default X } X } X } Xcommand { X label "Disposition of results:" X command "cat $result" X exclusive result { X label "" X choice { X label "A window" X value "" X default X } X choice { X label "A file suffixed with .sort" X value ">${file:r}.sort" X } X choice { X label "Another file" X parameter text 25 X value ">${result.value}" X } X } X } END_OF_FILE if test 2522 -ne `wc -c <'samples/sort.dd'`; then echo shar: \"'samples/sort.dd'\" unpacked with wrong size! fi # end of 'samples/sort.dd' fi echo shar: End of archive 2 \(of 5\). cp /dev/null ark2isdone MISSING="" for I in 1 2 3 4 5 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 5 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0