mcgrew@dartagnan.rutgers.edu (Charles Mcgrew) (09/15/89)
Submitted-by: apctrc!zmls04@uunet.uu.net (Martin L. Smith) Posting-number: Volume 1, Issue 68 Archive-name: hype/part08 #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # src # This archive created: Thu Sep 14 20:58:40 1989 export PATH; PATH=/bin:$PATH if test ! -d 'src' then echo shar: creating directory "'src'" mkdir 'src' fi echo shar: entering directory "'src'" cd 'src' echo shar: extracting "'screen.c'" '(21248 characters)' if test -f 'screen.c' then echo shar: will not over-write existing file "'screen.c'" else sed 's/^ X//' << \SHAR_EOF > 'screen.c' X#include <suntool/sunview.h> X#include <suntool/panel.h> X#include <suntool/scrollbar.h> X#include "util.h" X#include "interface.h" X#include "dialogue.h" X#include "tlmod.h" X#include "attr.h" X#include "objmod.h" X#include "itemmod.h" X#include "info.h" X#include "color.h" X#include "../archives/hash/hash.h" X#include "../archives/mfile/mfile.h" X#include "../archives/container/container.h" X X X#define SCREEN_TABLE_SIZE (100) X X X/* sv_table should invariable map the abstract hype objects */ X/* into their opened sunview counterparts, (if visible.) */ X Xstatic HashTPtr sv_table; X Xstatic Pixfont *pixfont; X Xextern HashTPtr sv_to_hype; Xextern int superuser; Xextern int tab_length; X X Xvoid init_screen() X{ X sv_table = make_hash(); X pixfont = pf_default(); X init_hash(SCREEN_TABLE_SIZE,sv_table); X} X Xstatic firstshot = 1; X Xint object_open(obj) XOBPtr obj; X{ X Window win; X win = (Window) hlookup(obj,sv_table); X if (win == NULL) { X return FALSE; X } else { X return TRUE; X } X} Xint tl_open(tl) XTLPtr tl; X{ X Window win; X win = (Window) hlookup(tl,sv_table); X if (win == NULL) { X return FALSE; X } else { X return TRUE; X } X} Xvoid screen_fit(obj) XOBPtr obj; X{ X Window win; X win = (Window) hlookup(obj,sv_table); X window_fit(win); X close_obj(obj); X show_obj(obj); X} Xvoid screen_fit_tl(tl) XTLPtr tl; X{ X Frame frame; X Panel panel; X frame = (Window) hlookup(tl,sv_table); X panel = window_get(frame,FRAME_NTH_SUBWINDOW,0); X window_fit(panel); X window_fit(frame); X close_tl(tl); X open_tl(tl); X} Xvoid draw_obj(obj) XOBPtr obj; X{ X Rect *r; X Scolor sc; X int i; X Scrollbar sbv,sbh; X TPPtr temp; X int n; X int scr; X Window frame; X Panel panel; X TLPtr tl; X Pixwin *pw; X unsigned char red[2],gre[2],blu[2]; X X frame = window_create(NULL, FRAME, X 0); X X if (clength(object_get_label(obj)) == 0) { X window_set(frame, X FRAME_LABEL, gen_absolute_pname(obj), X 0); X } else X if ((clength(object_get_label(obj)) == 1)) X { X crewind(object_get_label(obj)); X if (mfgetc(object_get_label(obj)) == '.') { X window_set(frame, X FRAME_SHOW_LABEL,FALSE, X 0); X } else { X window_set(frame, X FRAME_LABEL, cflatten(object_get_label(obj)), X 0); X } X } else { X window_set(frame, X FRAME_LABEL, cflatten(object_get_label(obj)), X 0); X X } X X/* this code, or the equivalent, will work in X11 but doesn't work in SV. X scr = attr_get_scr(tl_get_attr(tl)); X if (scr & HYPE_SCROLL_V) { X sbv = scrollbar_create(0); X window_set(panel,WIN_VERTICAL_SCROLLBAR,sbv,0); X } X if (scr & HYPE_SCROLL_H) { X sbh = scrollbar_create(0); X window_set(panel,WIN_HORIZONTAL_SCROLLBAR,sbh,0); X } X*/ X sc = interp_color(object_get_color(obj)); X window_set(frame,FRAME_FOREGROUND_COLOR, X sc,0); X X r = (Rect *) attr_get_rect(object_get_attr(obj)); X X if (r->r_width == 0) { X r = (Rect *) window_get(frame,WIN_RECT); X attr_set_rect(object_get_attr(obj),r); X } else { X window_set(frame, X WIN_RECT, attr_get_rect(object_get_attr(obj)), X 0); X } X n = object_get_numtemps(obj); X X for (i = 0; i < n; i++) { X temp = object_get_nthtemp(obj,i); X draw_obj_tl(obj,frame,temp X ); X } X if ((obj != get_master()) || (!firstshot)) { X window_set(frame,WIN_SHOW,TRUE,0); X X } else { X firstshot = 0; X } X X assoc_window_menu(frame,obj); X add_to_hash(obj,sv_table,frame); X} X Xvoid undraw_obj(obj) XOBPtr obj; X{ X Window win; X Panel panel; X void undraw_one_objtl(); X TPPtr temp; X Rect *x; X int i,j; X win = (Window) hlookup(obj,sv_table); X x = (Rect *) window_get(win,WIN_RECT); X attr_set_rect(object_get_attr(obj),x); X delete_from_hash(obj,sv_table); X i = 0; X while (1) { X panel = window_get(win,FRAME_NTH_SUBWINDOW,i); X/* must disassociate items where approriate */ X if (panel == NULL) { X break; X } X x = (Rect *) window_get(panel,WIN_RECT); X temp = hlookup(panel,sv_to_hype); X for (j = 0; j < object_get_numtemps(obj); j++) { X if (temp == object_get_nthtemp(obj,j)) { X attr_set_rect(temp_get_attr(temp),x); X break; X } X } X undraw_obj_tl(panel); X delete_from_hash(temp,sv_table); X X disassoc_obj_tlmenu(panel); X i++; X } X disassoc_window_menu(win,obj); X window_destroy(win); X X/* notify_post_destroy(win,DESTROY_CLEANUP,NOTIFY_IMMEDIATE);*/ X} Xundraw_obj_tl(panel) XPanel panel; X{ XPanel_item p_item; X panel_each_item(panel,p_item) { X disassoc_item(p_item); X } X panel_end_each; X} Xdraw_obj_tl(obj,frame,temp) XOBPtr obj; XWindow frame; XTPPtr temp; X{ X Panel panel; X void draw_item(); X TLPtr tl; X Scrollbar sbv,sbh; X int scr; X int i,numberitems; X Pixwin *pw; X X if (temp == NULL) { X return; X } X tl = object_get_temp_tl(temp); X panel = window_create(frame,PANEL,0); X scr = attr_get_scr(tl_get_attr(tl)); X if (scr & HYPE_SCROLL_V) { X sbv = scrollbar_create(0); X window_set(panel,WIN_VERTICAL_SCROLLBAR,sbv,0); X } X if (scr & HYPE_SCROLL_H) { X sbh = scrollbar_create(0); X window_set(panel,WIN_HORIZONTAL_SCROLLBAR,sbh,0); X } X add_to_hash(temp,sv_table,panel); X window_set(panel, X WIN_RECT, object_get_temp_rect(temp), X WIN_SHOW,TRUE, X 0); X assoc_obj_tlmenu(panel,temp); X numberitems = tl_get_numitems(tl); X for (i = 0; i < numberitems; i++) { X draw_item(obj,tl_get_nthitem(i,tl),panel,tl,i); X } X window_set(panel,WIN_SHOW,TRUE,0); X X X} X Xvoid draw_tl_frame(tl) XTLPtr tl; X{ X Frame frame; X void draw_one_tl(); X int i; X X frame = window_create(NULL, FRAME, X FRAME_LABEL, gen_absolute_tlpname(tl), X 0); X window_set(frame, X WIN_RECT,attr_get_rect(tl_get_attr(tl)), X 0); X (Frame) cur_com_frame = frame; X X assoc_tl_menu(frame,tl); X add_to_hash(tl,sv_table,frame); X X draw_one_tl(tl,frame); X window_set(frame,WIN_SHOW,TRUE,0); X} Xvoid draw_one_tl(tl,frame) XFrame frame; XTLPtr tl; X{ X Panel new_panel; X int i,numberitems; X Scrollbar sbv,sbh; X int scr; X Pixwin *pw; X void draw_item_for_tl(); X Scolor sc; X X unsigned char red[2],gre[2],blu[2]; X X if (tl == NULL) { X return; X } X if (attr_get_type(tl_get_attr(tl)) == 0) { X return; X } X new_panel = window_create(frame,PANEL,0); X scr = attr_get_scr(tl_get_attr(tl)); X if (scr & HYPE_SCROLL_V) { X sbv = scrollbar_create(0); X window_set(new_panel,WIN_VERTICAL_SCROLLBAR,sbv,0); X } X if (scr & HYPE_SCROLL_H) { X sbh = scrollbar_create(0); X window_set(new_panel,WIN_HORIZONTAL_SCROLLBAR,sbh,0); X } X assoc_layer_menu(new_panel,tl); X X i = 1; X X numberitems = tl_get_numitems(tl); X X for (i = 0; i < numberitems; i++) { X draw_item_for_tl(tl_get_nthitem(i,tl),new_panel,tl,i); X } X i = 0; X window_set(new_panel,WIN_SHOW,TRUE,0); X} Xchar *space_expand(x) Xchar *x; X{ X char *y; X char *firsty; X char *firstx; X X int n; X int i; X int j; X int k; X int l; X n = strlen(x); X y = (char *) malloc(sizeof(char) * n * tab_length); X firsty = y; X firstx = x; X j = 0; X for (l = 0; l < n; l++) { X if (*x == '\n') { X *y++ = *x++; X j = 0; X } else X if (*x == '\t') { X *y++ = ' '; X j++; X k = (((1+(j-1)/tab_length)*tab_length) - (j-1)); X for (i = 0; i < k; i++) { X *y++ = ' '; X } X j += k; X x++; X } else { X *y++ = *x++; X j++; X } X } X *y++ = '\0'; X free(firstx); X return firsty; X} X#define font_offset(font) (-font->pf_char['n'].pc_home.y) X#define font_height(font) (font->pf_defaultsize.y) X Xfill_pane_with_text(pane,text,color) XTLPtr pane; XContainer text; Xint color; X{ X Panel panel; X Frame frame; X TPPtr temp; X OBPtr obj; X int n,i; X X obj = tl_get_owner(pane); X frame = hlookup(obj,sv_table); X n = object_get_numtemps(obj); X for (i = 0; i < n; i++) { X temp = object_get_nthtemp(obj,i); X if (pane == object_get_temp_tl(temp)) { X break; X } X } X if (i == n) { X return; X } X i = 0; X panel = hlookup(temp,sv_table); X fill_panel_with_text(panel,text,color); X X} Xfill_panel_with_text(panel,text,color) XPanel panel; XContainer text; Xint color; X{ X Pixwin *pw; X char *str; X char *last; X char *cur; X char safe; X int i,j; X int colwidth,rowht; X int numchars; X Rect *r; X X if (panel == NULL) X return; X X str = space_expand(cflatten(text)); X if (strlen(str) == 0) { X return; X } X pw = (Pixwin *) window_get(panel,WIN_PIXWIN); X i = 0; X j = 0; X colwidth = (int) window_get(panel,WIN_COLUMN_WIDTH); X rowht = (int) window_get(panel,WIN_ROW_HEIGHT); X numchars = (((int) window_get(panel,WIN_WIDTH)) X /(colwidth)); X numchars--; X last = str; X cur = str; X r = (Rect *) window_get(panel,WIN_RECT); X pw_lock(pw,r); X while (*cur != '\0') { X if ((i == numchars) || (*cur == '\n')) { X i = 0; X safe = *cur; X *cur = '\0'; X if (color) { X pw_ttext(pw,colwidth*2, rowht*(j+2), X (PIX_NOT(PIX_SRC) | PIX_NOT(PIX_DST)),pixfont,last); X } else { X pw_ttext(pw,colwidth*2, rowht*(j+2), X ((PIX_SRC) & (PIX_DST)),pixfont,last); X } X *cur = safe; X last = cur; X j++; X } X cur++; X i++; X } X if (color) { X pw_ttext(pw,colwidth*2, rowht*(j+2), X (PIX_NOT(PIX_SRC) | PIX_NOT(PIX_DST)),pixfont,last); X X } else { X pw_ttext(pw,colwidth*2, rowht*(j+2), X ((PIX_SRC) & (PIX_DST)),pixfont,last); X X } X pw_unlock(pw); X free(str); X} Xvoid undraw_tl_frame(tl) XTLPtr tl; X{ X Window win; X Rect *r; X void undraw_one_tl(); X/* must still disassociate items where appropriate */ X win = (Window) hlookup(tl,sv_table); X r = (Rect *) window_get(win,WIN_RECT); X attr_set_rect(tl_get_attr(tl),r); X undraw_one_tl(tl); X disassoc_tl_menu(win,tl); X delete_from_hash(tl,sv_table); X window_destroy(win); X/* notify_post_destroy(win,DESTROY_CLEANUP,NOTIFY_IMMEDIATE);*/ X} Xvoid undraw_one_tl(tl) XTLPtr tl; X{ X int i,n; X ITPtr it; X Panel panel; X Frame frame; X Panel_item p_item; X if (tl == NULL) { X return; X } X if (attr_get_type(tl_get_attr(tl)) == 0) { X return; X } X frame = (Frame) hlookup(tl,sv_table); X panel = window_get(frame,FRAME_NTH_SUBWINDOW,0); X if (panel == NULL) { X mywarning("tragedy\n"); X return; X } X panel_each_item(panel,p_item) { X disassoc_tl_item(p_item); X } X panel_end_each; X n = tl_get_numitems(tl); X for (i = 0; i < n; i++) { X it = tl_get_nthitem(i,tl); X } X disassoc_layer_menu(panel,tl); X} X Xvoid refresh_item_val(it,obj,val) XITPtr it; XOBPtr obj; XContainer val; X{ X Panel_item p_item; X Panel panel; X TLPtr tl; X TPPtr tp; X int n; X int i; X X tl = item_get_owner(it); X n = object_get_numtemps(obj); X for (i = 0; i < n; i++) { X if (tl == object_get_nthtemptl(obj,i)) { X tp = object_get_nthtemp(obj,i); X break; X } X } X if (tp == NULL) { X return; X } X panel = (Panel) hlookup(tp,sv_table); X if (panel == NULL) { X return; X } X panel_each_item(panel,p_item) { X if (it == (ITPtr) panel_get(p_item,PANEL_CLIENT_DATA)) { X switch (item_get_type(it)) { X case HYPE_TEXT: X panel_set(p_item,PANEL_VALUE,cflatten(val),0); X break; X case HYPE_BUTTON: X X break; X case HYPE_SLIDER: X panel_set(p_item,PANEL_VALUE,atoi(cflatten(val)),0); X break; X case HYPE_TOGGLE: X crewind(item_get_labels(it)); X { X long mask = 0; X crewind(val); X for (i = 0;i < item_get_numc(it); i++) { X if (atoi(cget_nth_word(val,0)) == 1) { X set_bit(i,mask); X } X } X panel_set(p_item,PANEL_VALUE,mask,0); X } X break; X case HYPE_TEXTSW: X X break; X } X X } X } X panel_end_each; X X} Xget_values(obj) XOBPtr obj; X{ X int i,n; X Frame frame; X frame = (Frame) hlookup(obj,sv_table); X n = object_get_numtemps(obj); X for (i = 0; i < n; i++) { X get_tl_values(object_get_nthtemptl(obj,i),obj,frame,i); X } X} Xget_values_tl(tl) XTLPtr tl; X{ X int i,n; X Frame frame; X OBPtr obj; X obj = tl_get_owner(tl); X frame = (Frame) hlookup(obj,sv_table); X n = object_get_numtemps(obj); X for (i = 0; i < n; i++) { X if (object_get_nthtemptl(obj,i) == tl) { X get_tl_values(tl,obj,frame,i); X } X } X} Xget_tl_values(tl,obj,frame,nth) XOBPtr obj; XTLPtr tl; Xint nth; XFrame frame; X{ X Panel pan; X Panel_item p_item; X ITPtr it; X int i,n; X X Container value; X char *str; X int v; X if (tl == NULL) { X return; X } X if (attr_get_type(tl_get_attr(tl)) == 0) { X return; X } X pan = (Panel) window_get(frame,FRAME_NTH_SUBWINDOW,nth); X if (pan == NULL) { X return; X } X X object_set_tempcoords(obj,tl, X window_get(pan,WIN_RECT)); X X panel_each_item(pan,p_item) { X it = (ITPtr) panel_get(p_item,PANEL_CLIENT_DATA); X if (it != NULL) { X switch (item_get_type(it)) { X case HYPE_TEXT: X str = escapesout(panel_get(p_item,PANEL_VALUE,0)); X value = cnew_constring(str); X object_set_info(obj, X info_add_data(object_get_info(obj), X gen_absolute_itempname(it), X value)); X free(str); X break; X case HYPE_BUTTON: X X break; X case HYPE_SLIDER: X v = (int) panel_get(p_item,PANEL_VALUE,0); X str = int_to_string(v); X value = cnew_constring(str); X object_set_info(obj, X info_add_data(object_get_info(obj), X gen_absolute_itempname(it), X value)); X X break; X case HYPE_TOGGLE: { X char *x; X long mask; X mask = (int) panel_get(p_item,PANEL_VALUE,0); X n = item_get_numc(it); X x = ""; X for (i = 0; i < n; i++) { X if (get_bit(i,mask)) { X x = mystrcat(x,"1 "); X } else { X x = mystrcat(x,"0 "); X } X } X value = cnew_constring(x); X object_set_info(obj, X info_add_data(object_get_info(obj), X gen_absolute_itempname(it), X value)); X X } X X break; X case HYPE_TEXTSW: X X break; X } X } X } X panel_end_each; X} X static short func_array[]= { X#include "twi.cursor" X }; X mpr_static(funky,16,16,1,func_array); X X/* X** FIX 8/16/88 decl of itemval_ofitem X*/ XContainer itemval_ofitem(); X Xvoid draw_item(obj,it,panel,tl,n) XOBPtr obj; XITPtr it; XPanel panel; XTLPtr tl; X{ X Panel_item p_item; X Container val; X int i; X char *x1,*x2,*x3; X Pixrect *button; X/* val = info_look(object_get_info(obj),item_get_name(it));*/ X val = itemval_ofitem(obj,it); X if (val == NULL) { X val = item_get_def(it); X } X switch (item_get_type(it)) { X case HYPE_TEXT: X x1 = cflatten(val); X x2 = escapesin(x1); X x3 = cflatten(item_get_dlen(it)); X p_item = panel_create_item(panel, PANEL_TEXT, X PANEL_NOTIFY_LEVEL, PANEL_NON_PRINTABLE, X PANEL_LABEL_STRING, item_get_label(it), X PANEL_CLIENT_DATA, it, X PANEL_VALUE_STORED_LENGTH, HYPE_TEXT_SIZE, X PANEL_VALUE_DISPLAY_LENGTH,atoi(x3), X PANEL_VALUE, x2, X 0); X free(x1); X free(x2); X free(x3); X break; X case HYPE_BUTTON: X button = panel_button_image(panel, X item_get_label(it), X strlen(item_get_label(it)), X NULL); X p_item = panel_create_item(panel, PANEL_BUTTON, X PANEL_LABEL_IMAGE, button, X PANEL_CLIENT_DATA, it, X 0); X break; X case HYPE_SLIDER: X p_item = panel_create_item(panel, PANEL_SLIDER, X PANEL_LABEL_STRING, item_get_label(it), X PANEL_NOTIFY_LEVEL, PANEL_ALL, X PANEL_CLIENT_DATA, it, X 0); X x1 = cflatten(item_get_min(it)); X panel_set(p_item, X PANEL_MIN_VALUE, atoi(x1), X 0); X x1 = cflatten(item_get_max(it)); X panel_set(p_item, X PANEL_MAX_VALUE, atoi(x1), X 0); X free(x1); X x1 = cflatten(item_get_dlen(it)); X panel_set(p_item, X PANEL_SLIDER_WIDTH,atoi(x1), X 0); X free(x1); X x1 = cflatten(val); X panel_set(p_item, X PANEL_VALUE, atoi(x1), X 0); X free(x1); X break; X case HYPE_TOGGLE: X p_item = panel_create_item(panel, PANEL_TOGGLE, X PANEL_LABEL_STRING, item_get_label(it), X PANEL_CLIENT_DATA, it, X 0); X crewind(item_get_labels(it)); X for (i = 0; i < item_get_numc(it); i++) { X panel_set(p_item,PANEL_CHOICE_STRING,i, X cget_nth_word(item_get_labels(it),i),0); X } X { X long mask = 0; X crewind(val); X for (i = 0;i < item_get_numc(it); i++) { X if (atoi(cget_nth_word(val,0)) == 1) { X set_bit(i,mask); X } X } X panel_set(p_item,PANEL_VALUE,mask,0); X } X break; X case HYPE_TEXTSW: X p_item = panel_create_item(panel,PANEL_CHOICE, X PANEL_LABEL_STRING, item_get_label(it), X PANEL_NOMARK_IMAGES,0, X PANEL_MARK_IMAGES,0, X PANEL_CHOICE_IMAGES,&funky,0, X PANEL_CLIENT_DATA, it, X PANEL_VALUE,0, X PANEL_DISPLAY_LEVEL,PANEL_CURRENT, X PANEL_FEEDBACK,PANEL_NONE, X 0); X X break; X } X panel_set(p_item,PANEL_ITEM_X,item_get_lux(it), X PANEL_ITEM_Y,item_get_luy(it), X 0); X X assoc_item(p_item,tl,it); X} X X Xvoid draw_item_for_tl(it,panel,tl,n) XITPtr it; XPanel panel; XTLPtr tl; Xint n; X{ X Panel_item p_item; X Container val; X Pixrect *button; X int i; X char *x1,*x2,*x3; X X val = item_get_def(it); X switch (item_get_type(it)) { X case HYPE_TEXT: X x1 = cflatten(val); X x2 = escapesin(x1); X x3 = cflatten(item_get_dlen(it)); X p_item = panel_create_item(panel, PANEL_TEXT, X PANEL_NOTIFY_LEVEL, PANEL_NON_PRINTABLE, X PANEL_LABEL_STRING, item_get_label(it), X PANEL_CLIENT_DATA, n, X PANEL_VALUE_STORED_LENGTH, HYPE_TEXT_SIZE, X PANEL_VALUE_DISPLAY_LENGTH,atoi(x3), X PANEL_VALUE, x2, X 0); X free(x1); X free(x2); X break; X case HYPE_BUTTON: X button = panel_button_image(panel, X item_get_label(it), X strlen(item_get_label(it)), X NULL); X p_item = panel_create_item(panel, PANEL_BUTTON, X PANEL_LABEL_IMAGE, button, X PANEL_CLIENT_DATA, n, X 0); X break; X case HYPE_SLIDER: X p_item = panel_create_item(panel, PANEL_SLIDER, X PANEL_LABEL_STRING, item_get_label(it), X PANEL_NOTIFY_LEVEL, PANEL_ALL, X PANEL_CLIENT_DATA, n, X 0); X x1 = cflatten(item_get_min(it)); X panel_set(p_item, X PANEL_MIN_VALUE, atoi(x1), X 0); X free(x1); X x1 = cflatten(item_get_max(it)); X panel_set(p_item, X PANEL_MAX_VALUE, atoi(x1), X 0); X free(x1); X x1 = cflatten(item_get_dlen(it)); X panel_set(p_item, X PANEL_SLIDER_WIDTH,atoi(x1), X 0); X free(x1); X x1 = cflatten(val); X panel_set(p_item, X PANEL_VALUE, atoi(x1), X 0); X free(x1); X break; X case HYPE_TOGGLE: X p_item = panel_create_item(panel, PANEL_TOGGLE, X PANEL_LABEL_STRING, item_get_label(it), X PANEL_CLIENT_DATA, n, X 0); X crewind(item_get_labels(it)); X for (i = 0; i < item_get_numc(it); i++) { X panel_set(p_item,PANEL_CHOICE_STRING,i, X cget_nth_word(item_get_labels(it),i),0); X } X { X long mask = 0; X crewind(val); X for (i = 0;i < item_get_numc(it); i++) { X if (atoi(cget_nth_word(val),0) == 1) { X set_bit(i,mask); X } X } X panel_set(p_item,PANEL_VALUE,mask,0); X } X break; X case HYPE_TEXTSW: X p_item = panel_create_item(panel,PANEL_CHOICE, X PANEL_LABEL_STRING, item_get_label(it), X PANEL_NOMARK_IMAGES,0, X PANEL_MARK_IMAGES,0, X PANEL_CHOICE_IMAGES,&funky,0, X PANEL_VALUE,0, X PANEL_DISPLAY_LEVEL,PANEL_CURRENT, X PANEL_FEEDBACK,PANEL_NONE, X 0); X X break; X } X panel_set(p_item,PANEL_ITEM_X,item_get_lux(it), X PANEL_ITEM_Y,item_get_luy(it), X 0); X assoc_tl_item(p_item,tl,it); X} XString scr_dialogue(quest) XString quest; X{ X char *x; X x = scr_ask(quest); X return x; X} Xint scr_choose(quest,first,second) XString quest; Xchar *first,*second; X{ X int x; X x = confirm_choose(quest,first,second); X return x; X} Xvoid scr_info_item(item,tl) XITPtr item; XTLPtr tl; X{ X String safe1; X int n; X safe1 = mystrcpy(item_get_name(item)); X n = tl_get_ord_of_item(tl,item); X info_item(tl,item,&n,object_get_level(tl_get_owner(tl))||superuser); X tl_change_item_name(tl,item,safe1); X set_alarm(); X} Xvoid scr_info_tl(tl) XTLPtr tl; X{ X OBPtr owner; X Window frame; X String safe; X safe = mystrcpy(tl_get_name(tl)); X info_tl(tl,object_get_level(tl_get_owner(tl))||superuser); X frame = (Window) hlookup(tl,sv_table); X owner = tl_get_owner(tl); X/* if (strcmp(safe,tl_get_name(tl)) != 0) { X sdelete_from_hash(safe,object_get_btable(owner),tl); X sadd_to_hash(tl_get_name(tl),object_get_btable(owner),tl); X } X*/ X window_set(frame, X FRAME_LABEL, X gen_absolute_tlpname(tl), X 0); X set_alarm(); X X} Xvoid scr_info_box(obj) XOBPtr obj; X{ X Window frame; X String safe; X safe = mystrcpy(object_get_name(obj)); X info_box(obj,object_get_level(obj) || superuser); X frame = (Window) hlookup(obj,sv_table); X/* if (strcmp(safe,object_get_name(obj)) != 0) { X sdelete_from_hash(safe,object_get_ctable(object_get_owner(obj)),obj); X sadd_to_hash(object_get_name(obj), X X X object_get_ctable(object_get_owner(obj)),obj); X } X*/ X if (clength(object_get_label(obj)) == 0) { X window_set(frame, X FRAME_LABEL, gen_absolute_pname(obj), X 0); X } else X if ((clength(object_get_label(obj)) == 1)) { X crewind(object_get_label(obj)); X if ((mfgetc(object_get_label(obj)) == '.')) { X window_set(frame, X FRAME_SHOW_LABEL,FALSE, X 0); X } else { X window_set(frame, X FRAME_LABEL, cflatten(object_get_label(obj)), X 0); X } X } else { X window_set(frame, X FRAME_LABEL, cflatten(object_get_label(obj)), X 0); X X } X set_alarm(); X return; X} SHAR_EOF if test 21248 -ne "`wc -c < 'screen.c'`" then echo shar: error transmitting "'screen.c'" '(should have been 21248 characters)' fi fi # end of overwriting check echo shar: extracting "'screen.h'" '(52 characters)' if test -f 'screen.h' then echo shar: will not over-write existing file "'screen.h'" else sed 's/^ X//' << \SHAR_EOF > 'screen.h' Xvoid draw_test(); Xvoid draw_tl(); Xvoid draw_item(); SHAR_EOF if test 52 -ne "`wc -c < 'screen.h'`" then echo shar: error transmitting "'screen.h'" '(should have been 52 characters)' fi fi # end of overwriting check echo shar: extracting "'scripter.h'" '(89 characters)' if test -f 'scripter.h' then echo shar: will not over-write existing file "'scripter.h'" else sed 's/^ X//' << \SHAR_EOF > 'scripter.h' X#define HALT 0 X X Xtypedef int (*Inst)(); Xtypedef Inst *ObjectCode; X SHAR_EOF if test 89 -ne "`wc -c < 'scripter.h'`" then echo shar: error transmitting "'scripter.h'" '(should have been 89 characters)' fi fi # end of overwriting check echo shar: extracting "'scripter.y'" '(6523 characters)' if test -f 'scripter.y' then echo shar: will not over-write existing file "'scripter.y'" else sed 's/^ X//' << \SHAR_EOF > 'scripter.y' X%{ X#include <stdio.h> X#include "iam.h" X#include "scripter.h" X#include "util.h" X#define load2(i1,i2) load(i1); load(i2); X#define load3(i1,i2,i3) load(i1); load(i2); load(i3); X#define load4(i1,i2,i3,i4) load(i1); load(i2); load(i3); load(i4); Xint numlocals = 0; Xint spc[512]; Xint spccnt = 0; Xint index; Xchar x[128]; X%} X%union { X char *text; X Inst inst; X int pc; X struct { X int pc; X int narg; X } pcx; X} X%token <pc> VAR X%token <text> NAME NUMBER X%token <text> IF THEN REPEAT WHILE FOR X%token <text> LPAREN RPAREN LBRACE RBRACE X%token <text> ELSE X%token <text> DQSTRING SQSTRING BACKGROUND STRING SC EQUAL X%token <text> OBJECTDESIG BGDESIG ITEMDESIG COMMA X%token <text> AND OR NOT CEQUAL NEQUAL LTOREQ GTOREQ LESSTHAN GREATERTHAN X%token <text> RETURN MYERRTOKEN X%token <text> CONCAT PLUS MINUS STAR SLASH BREAK CONTINUE X%token <text> PLUSPLUS LONEQUOTE X%token <text> MINUSMINUS X%token <inst> BUILTIN X%type <pc> stmts stmt expr ifthenelse while if asgn compare for X%type <pc> variable function X%type <pc> cond X%type <pcx> arglist X%left PLUS MINUS X%left STAR SLASH X$left LESSTHAN LTOREQ GREATERTHAN GTOREQ X%left CEQUAL NEQUAL X%left AND X%left OR X%right NOT X X%% Xscript: /* nothing */ {load(HALT); setnumlocals(getsymsize()); return 0; } X | stmt { load(HALT); setnumlocals(getsymsize()); return 0; } X ; Xstmts: /* nothing */ { $$ = load(nop); } X | stmt { $$ = $1; } X | stmts stmt { $$ = $1; } X ; Xstmt: error SC X { if (comp_report()) { X fprintf(stderr,"parsing error near line %d\n", X get_lineno()); X } X } X | ifthenelse X | while X | for X | BREAK SC X { $$ = load(breakcode); load(HALT); X } X | CONTINUE SC X { $$ = load(contcode); load(HALT); X } X | LBRACE stmts RBRACE X { $$ = $2; X } X | RETURN expr SC X { $$ = $2; load3(returnval,(Inst) 1,HALT); X } X | expr SC X { $$ = $1; load(popoff); X } X | SC X { $$ = load(nop); X } X ; Xifthenelse: X if cond stmt ELSE X { load(HALT); X } X stmt X { X load(HALT); X $$ = $1; X loadabsolute($1+1,$3); X loadabsolute($1+2,$6); X loadabsolute($1+3,currentpc()); X } X | if cond stmt X { X load(HALT); X $$ = $1; X loadabsolute($1+1,$3); X loadabsolute($1+2,0); X loadabsolute($1+3,currentpc()); X } X ; Xfor: FOR LPAREN X { spc[spccnt++] = load(forcode); X load4(HALT,HALT,HALT,HALT); X } X stmt X { load(HALT); X } X expr SC X { load(HALT); X loadabsolute(1+spc[(spccnt-1)],$6); X } X expr X { load(HALT); X loadabsolute(2+spc[(spccnt-1)],$9); X } X RPAREN stmt X { load(HALT); X loadabsolute(3+spc[(spccnt-1)],$12); X loadabsolute(4+spc[(spccnt-1)],currentpc()); X $$ = spc[spccnt-1]; X spccnt--; X } X ; X Xif: IF X { $$ = load4(ifcode,HALT,HALT,HALT); X } X ; Xwhile: WHILE X { spc[spccnt++] = load(whilecode); X load2(HALT,HALT); X } X cond stmt X { X load(HALT); X loadabsolute(spc[spccnt-1]+1,$4); X loadabsolute(spc[spccnt-1]+2,currentpc()) ; X $$ = spc[spccnt-1]; X spccnt--; X } X ; Xcond: LPAREN expr RPAREN X { $$ = $2; load(HALT); } X ; Xvariable: VAR X { X $$ = load2(varvalue,$1); X } X ; Xexpr: function X { $$ = $1; X } X | LPAREN expr RPAREN X { $$ = $2; X } X | variable X { $$ = $1; X } X | PLUSPLUS VAR X { X $$ = load2(preincr,$2); X } X | VAR PLUSPLUS X { X $$ = load2(postincr,$1); X } X | MINUSMINUS VAR X { X $$ = load2(predecr,$2); X } X | VAR MINUSMINUS X { X $$ = load2(postdecr,$1); X } X | NUMBER X { $$ = load(numstring); loadstring($1); X } X | STRING X { if (comp_report()) { X sprintf(x, X "Error: use of undefined variable or function: %s.\n",$1); X mywarning(x); X } X setgloberror(); X X } X | asgn X { $$ = $1; X } X | expr CONCAT expr X { X $$ = $1; X load(concat); X load((Inst) 2); X } X | compare X { $$ = $1; X } X | expr STAR expr X { $$ = $1; X load(times); X load((Inst) 2); X } X | expr SLASH expr X { $$ = $1; X load(divide); X load((Inst) 2); X } X | expr PLUS expr X { $$ = $1; X load(plus); X load((Inst) 2); X } X | expr MINUS expr X { $$ = $1; X load(minus); X load((Inst) 2); X } X | MINUS expr %prec STAR X { $$ = $2; X load(mynegate); X load((Inst) 1); X } X | DQSTRING X { X $$ = load(qstring); loadstring($1); X } X ; Xcompare: expr AND expr X { X load(andcmp); X load((Inst) 2); X $$ = $1; X } X | expr OR expr X { X load(orcmp); X load((Inst) 2); X $$ = $1; X } X | NOT expr %prec AND X { X load(notcmp); X load((Inst) 1); X $$ = $2; X } X | expr CEQUAL expr X { X load(ceqcmp); X load((Inst) 2); X $$ = $1; X } X | expr NEQUAL expr X { X load(neqcmp); X load((Inst) 2); X $$ = $1; X } X | expr LESSTHAN expr X { X load(ltcmp); X load((Inst) 2); X $$ = $1; X } X | expr GREATERTHAN expr X { X load(gtcmp); X load((Inst) 2); X $$ = $1; X } X | expr LTOREQ expr X { X load(ltoreqcmp); X load((Inst) 2); X $$ = $1; X } X | expr GTOREQ expr X { X load(gtoreqcmp); X load((Inst) 2); X $$ = $1; X } X ; X X Xasgn: STRING EQUAL X { index = define_var($1); X } X expr X { load2(assign,index); X $$ = $4; X } X | VAR EQUAL expr X { load2(assign,$1); X $$ = $3; X } X ; Xfunction: BUILTIN LPAREN arglist RPAREN X { X $$ = $3.pc; X load($1); X load($3.narg); X } X ; X Xarglist: /* nothing */ X { $$.pc = currentpc(); X $$.narg = 0; X } X | expr X { $$.pc = $1; X $$.narg = 1; X } X | arglist COMMA expr X { $$.pc = $1.pc; X $$.narg = $1.narg+1; X } X ; X%% Xyyerror() X{ X if (comp_report()) { X fprintf(stderr,"parsing error near line %d\n",get_lineno()); X } X setgloberror(); X} SHAR_EOF if test 6523 -ne "`wc -c < 'scripter.y'`" then echo shar: error transmitting "'scripter.y'" '(should have been 6523 characters)' fi fi # end of overwriting check echo shar: extracting "'select.c'" '(5436 characters)' if test -f 'select.c' then echo shar: will not over-write existing file "'select.c'" else sed 's/^ X//' << \SHAR_EOF > 'select.c' X#include <suntool/sunview.h> X#include <suntool/panel.h> X#include <suntool/scrollbar.h> X#include <ctype.h> X#include "util.h" X#include "tlmod.h" X#include "objmod.h" X#include "itemmod.h" X#include "../archives/hash/hash.h" X#include "visual.h" X#include "../archives/container/container.h" X#include "../archives/mfile/mfile.h" X#include "amcomp.h" X#include "fileio.h" X#include "pathname.h" X#include "info.h" X#include "clipboard.h" X#include "interface.h" X Xstatic Container answer; X Xstatic void recur_menu_not_proc(m,mi) XMenu m; XMenu_item mi; X{ X char *str; X if ((int) menu_get(mi,MENU_CLIENT_DATA) == 0) { X return; X } X str = menu_get(mi,MENU_STRING); X menu_get(mi,MENU_VALUE); X while (*str != '\0') { X mfputc(answer,*str); X str++; X } X mfputc(answer,' '); X} X XMenu show_recur_menu_aux(m,stuff) XContainer stuff; XMenu m; X{ X Menu submenu; X Menu_item mi; X int i,n; X char str[4096]; X char c; X X n = 0; X c = mfgetc(stuff); X while (c != ')') { X if (c == EOF) { X mywarning("syntax error in menu specification"); X return NULL; X } X while (isspace(c)) { X c = mfgetc(stuff); X } X if (c == ')') { X return m; X } X X i = 0; X while (!isspace(c) && (c != ')') && (c != ':')) { X str[i++] = c; X c = mfgetc(stuff); X } X str[i++] = '\0'; X if (c == ':') { X c = mfgetc(stuff); X while (isspace(c)) { X c = mfgetc(stuff); X } X if (c == '(') { X submenu = menu_create(MENU_BOXED,TRUE,MENU_CLIENT_DATA,1,0); X if (!show_recur_menu_aux(submenu,stuff)) X return NULL; X menu_set(submenu,MENU_NOTIFY_PROC,recur_menu_not_proc,0); X mi = menu_create_item( X MENU_STRING,mystrcpy(str), X MENU_PULLRIGHT,submenu, X MENU_CLIENT_DATA,1, X 0); X menu_set(m,MENU_APPEND_ITEM,mi,0); X c = mfgetc(stuff); X n++; X continue; X } else { X mywarning("bad menu syntax!"); X return NULL; X } X } X mi = menu_create_item( X MENU_STRING, X mystrcpy(str), X MENU_CLIENT_DATA,1, X 0); X menu_set(m,MENU_APPEND_ITEM,mi,0); X n++; X while (isspace(c)) { X c = mfgetc(stuff); X } X } X X return m; X} XContainer show_recur_menu(stuff) XContainer stuff; X{ X Menu m; X Menu_item mi; X Window win; X Event event; X Menu_item menu_return; X Container retanswer; X int i,n; X char c; X X X answer = cnew_con(); X crewind(stuff); X while (isspace(c = mfgetc(stuff)) ) { X X } X if (c != '(') { X mywarning("improper menu format"); X } X m = menu_create(MENU_BOXED,TRUE, X MENU_NOTIFY_PROC,recur_menu_not_proc, X 0); X if (!show_recur_menu_aux(m,stuff,0)) X return ccpy_con(answer); X win = interface_get_window(); X event_set_id(&event,MS_RIGHT); X event_set_x(&event,0); X event_set_y(&event,0); X event_set_down(&event); X menu_show(m,win,&event,0); X menu_destroy(m); X mfseek(answer,-1,2); X mftrunc(answer); X retanswer = ccpy_con(answer); X cdestroy(answer); X return retanswer; X} X X/* yes/no/ok notify proc */ Xstatic Panel_item p_item; X Xstatic void Xyes_no_ok(item, event) XPanel_item item; XEvent *event; X{ X int n; X int m; X int i; X int val; X char *ptr; X n = (int) panel_get(item, PANEL_CLIENT_DATA); X if (n == 0) { X } else { X m = (int) panel_get(p_item,PANEL_CLIENT_DATA); X for (i = 0; i < m; i++) { X val = (int) panel_get(p_item,PANEL_TOGGLE_VALUE,i); X ptr = panel_get(p_item,PANEL_CHOICE_STRING,i); X if (val) { X mfwrite(answer,ptr,strlen(ptr)); X mfputc(answer,' '); X } X } X } X window_return(n); X} X XContainer show_multi_selec(stuff) XContainer stuff; X{ X Panel panel; X Frame frame; X int i,n; X Rect *r; X Pixrect *pr; X int left,top,width,height; X Scrollbar sbv,sbh; X X answer = cnew_con(); X X n = cget_numwords(stuff); X X frame = window_create(NULL,FRAME, X FRAME_NO_CONFIRM,TRUE, X FRAME_SHOW_LABEL,FALSE,0); X X width = 600; X X height = 400; X X panel = window_create(frame,PANEL,0); X panel_set(panel,PANEL_LAYOUT,PANEL_VERTICAL,0); X X pr = panel_button_image(panel, "CANCEL", 3, 0); X X X X X panel_create_item(panel, PANEL_BUTTON, X PANEL_ITEM_X, ATTR_COL(10),PANEL_ITEM_Y, ATTR_ROW(0), X PANEL_LABEL_IMAGE, pr, X PANEL_CLIENT_DATA, 0, X PANEL_NOTIFY_PROC, yes_no_ok, X 0); X panel_create_item(panel, PANEL_BUTTON, X PANEL_ITEM_X,ATTR_COL(35),PANEL_ITEM_Y, ATTR_ROW(0), X PANEL_LABEL_IMAGE, panel_button_image(panel, "OK", 3, 0), X PANEL_CLIENT_DATA, 1, X PANEL_NOTIFY_PROC, yes_no_ok, X 0); X panel_create_item(panel, PANEL_MESSAGE, X PANEL_ITEM_X,ATTR_COL(2),PANEL_ITEM_Y, ATTR_ROW(2), X PANEL_LABEL_STRING, X "(If too many values use right button to get menu.)", X 0); X X p_item = panel_create_item(panel, PANEL_TOGGLE, X PANEL_LABEL_STRING, "Choose from:", X PANEL_ITEM_X,ATTR_COL(10), X PANEL_ITEM_Y,ATTR_ROW(3), X PANEL_LAYOUT,PANEL_VERTICAL, X PANEL_CLIENT_DATA,n, X 0); X X for (i = 0; i < n; i++) { X panel_set(p_item,PANEL_CHOICE_STRING,i, X cget_nth_word(stuff,i),0); X X } X X height = 400; X /* center the asker frame on the screen */ X window_set(panel,WIN_WIDTH,width,0); X window_set(panel,WIN_HEIGHT,height,0); X window_fit(frame); X r = (Rect *) window_get(frame, WIN_SCREEN_RECT); X X left = (r->r_width - width) / 2; X top = (r->r_height - height) / 2; X X if (left < 0) X left = 0; X if (top < 0) X top = 0; X X X window_set(frame, X WIN_X, left, X WIN_Y, top, 0); X X window_loop(frame); X window_destroy(frame); X return answer; X} X SHAR_EOF if test 5436 -ne "`wc -c < 'select.c'`" then echo shar: error transmitting "'select.c'" '(should have been 5436 characters)' fi fi # end of overwriting check echo shar: extracting "'select.h'" '(52 characters)' if test -f 'select.h' then echo shar: will not over-write existing file "'select.h'" else sed 's/^ X//' << \SHAR_EOF > 'select.h' X Xvoid *show_recur_menu(); Xvoid *show_mulit_selec(); SHAR_EOF if test 52 -ne "`wc -c < 'select.h'`" then echo shar: error transmitting "'select.h'" '(should have been 52 characters)' fi fi # end of overwriting check echo shar: extracting "'shash.c'" '(3763 characters)' if test -f 'shash.c' then echo shar: will not over-write existing file "'shash.c'" else sed 's/^ X//' << \SHAR_EOF > 'shash.c' X/* hash.c -- hype requires many a fine young hash table so that it can have */ X/* roughly constant time lookups for most of it's stuff. This file is an */ X/* attempt at a general hash table maintenance module. */ X X X#include "../../src/util.h" X Xtypedef struct shnode { X struct shnode *next; X char *key; X void *id; X} SHnode,*SHnodePtr; X Xtypedef struct shash { X int size; X SHnodePtr *entry; X} SHashT,*SHashTPtr; X Xvoid *slookup(); X XSHashTPtr smake_hash() X{ X SHashTPtr temp; X temp = (SHashTPtr) malloc(sizeof(SHashT) * 1); X temp->entry = NULL; X temp->size = 0; X return temp; X} XSHnodePtr smake_hnode() X{ X SHnodePtr temp; X temp = (SHnodePtr) malloc(sizeof(SHnode) * 1); X temp->key = ""; X temp->next = NULL; X temp->id = 0; X return temp; X} X Xchar *shash_get_nth(hash,n) XSHashTPtr hash; Xint n; X{ X SHnodePtr s; X int i = 0; X int j = 0; X s = hash->entry[j]; X while(s == NULL) { X if (j >= hash->size) { X return NULL; X } X j++; X s = hash->entry[j]; X } X while (1) { X if (i == n) X return s->key; X i++; X s = s->next; X while(s == NULL) { X if (j >= hash->size) { X return NULL; X } X s = hash->entry[j]; X j++; X } X } X} Xvoid Sinit_hash( size, hash) Xint size; XSHashTPtr hash; X{ X int i; X hash->size = size; X hash->entry = (SHnodePtr *) malloc(sizeof(SHnodePtr) * size); X for (i = 0; i < size; i++) { X hash->entry[i] = NULL; X } X} X Xvoid sunmake_hnode_list(ptr) XSHnodePtr ptr; X{ X if (ptr != NULL) { X sunmake_hnode_list(ptr->next); X free(ptr->key); X free(ptr); X } X} Xvoid sunmake_hash(hash) XSHashTPtr hash; X{ X int i; X for (i = 0; i < hash->size; i++) { X sunmake_hnode_list(hash->entry[i]); X } X free(hash->entry); X free(hash); X} Xint shashval( x, size) Xchar *x; Xint size; X{ X int l,n,i; X l = strlen(x); X n = l; X if( l - 1 > 0) { X n = n * x[l-1]; X } X if (l - 4 > 0) { X n = n * x[l-1]; X } X for (i = 0;i < l;i++) { X n += x[i]; X } X n = n % size; X return n; X} X Xint sadd_to_hash(key, hash, id) Xchar *key; XSHashTPtr hash; Xvoid *id; X{ X SHnodePtr temp,cur; X int fval; X if (slookup(key,hash) != NULL) { X mywarning("duplicate hash key attempted\n"); X return NULL; X } X if (strlen(key) == 0) { X return 0; X } X temp = smake_hnode(); X temp->key = mystrcpy(key); X temp->id = id; X temp->next = NULL; X X fval = shashval(temp->key,hash->size); X cur = hash->entry[fval]; X if (cur == NULL) { X hash->entry[fval] = temp; X } else { X temp->next = hash->entry[fval]; X hash->entry[fval] = temp; X } X} Xint sdelete_from_hash(key, hash) Xchar *key; XSHashTPtr hash; X{ X int fval; X SHnodePtr temp,cur; X if (strlen(key) == 0) { X return 0; X } X fval = shashval(key,hash->size); X X cur = hash->entry[fval]; X if (cur == NULL) { X mywarning("hash.c: tried to delete non-existent element from hash table\n"); X } X if (!strcmp(cur->key,key)) { X hash->entry[fval] = cur->next; X free(cur->key); X free(cur); X return; X } X while ((cur->next != NULL) && (strcmp(cur->next->key,key) )) { X cur = cur->next; X } X if (cur->next == NULL) { X mywarning("hash.c: tried to delete non-existent element from hash table\n"); X } else { X temp = cur->next; X cur->next = cur->next->next; X free(temp->key); X free(temp); X } X} X Xvoid *slookup(key,hash) XSHashTPtr hash; Xchar *key; X{ X int fval; X SHnodePtr cur; X if (strlen(key) == 0) { X return NULL; X } X fval = shashval(key,hash->size); X cur = hash->entry[fval]; X if (cur == NULL) { X return NULL; X } X if (strcmp(cur->key,key) == 0) { X return cur->id; X } X while (cur != NULL) { X if (strcmp(cur->key,key) == 0) { X return cur->id; X } else { X cur = cur->next; X } X } X return NULL; X} SHAR_EOF if test 3763 -ne "`wc -c < 'shash.c'`" then echo shar: error transmitting "'shash.c'" '(should have been 3763 characters)' fi fi # end of overwriting check echo shar: extracting "'sighandler.c'" '(2786 characters)' if test -f 'sighandler.c' then echo shar: will not over-write existing file "'sighandler.c'" else sed 's/^ X//' << \SHAR_EOF > 'sighandler.c' X#include "sighandler.h" X#include "util.h" X#include "../archives/container/container.h" X#include <sys/time.h> X X#define SIG_STACK_SIZE (100) X Xtypedef struct ele { X int signal; X int pid; X int status; X} SIG_ELEMENT; X Xextern int job_done_obj; Xextern int sigq_non_empty; Xstatic SIG_ELEMENT sigstk[SIG_STACK_SIZE]; Xstatic int sigcur = 0; X Xint editor_id; Xint editor_open; Xint editor_done; X X/* The SunView manual says not to make any "signal" or "wait" function */ X/* calls, but rather to use their functions. I haven't been able to */ X/* get their stuff to work. */ X/* X** FIX 8/26/88 changed return type from int * to void * X*/ X Xvoid (*svsignal(sig,fn)) () Xint sig, (*fn) (); X{ X return signal(sig,fn); X} X Xstatic void pushsigstack(sig,pid,status) Xint sig; Xint pid,status; X{ X if (sigcur == SIG_STACK_SIZE) { X mywarning("Signal stack overflowed!! This is a MAJOR errror!\n"); X exit(1); X } X sigq_non_empty = 1; X sigstk[sigcur].signal = sig; X sigstk[sigcur].pid = pid; X sigstk[sigcur].status = status; X sigcur++; X} Xstatic SIG_ELEMENT sigpop() X{ X sigcur--; X if (sigcur == 0) { X sigq_non_empty = 0; X } X return sigstk[sigcur]; X} Xint oninterrupt(sig, code, scp) Xint sig, code; Xstruct sigcontext *scp; X{ X int k; X switch(gsigflag) { X case TOPLEVEL: X if (confirm_yes("Interrupt received: Do you want to quit without saving?\n")) { X exit(4); X } X break; X case INSCRIPT: X pushsigstack(sig); X break; X case RUNNINGJOB: X mywarning("Warning: interrupt recieved during system wait!\n"); X gsigflag = INSCRIPT; X svsignal(SIGINT,oninterrupt); X longjmp(sigbuff[1]); X break; X } X} X Xint onsigchild(sig, code, scp) Xint sig, code; Xstruct sigcontext *scp; X{ X int k; X int i; X char *str,*target; X Container c; X set_alarm(); X k = wait(&i); X if (editor_open && (k == editor_id)) { X editor_done = 1; X editor_open = 0; X } else { X pushsigstack(sig,k,i); X } X} X X Xint onsigalarm(sig, code, scp) Xint sig, code; Xstruct sigcontext *scp; X{ X sigprocess(); X} X Xsigprocess() X{ X SIG_ELEMENT sig; X int k,i; X char c,*str; X char *target; X Container cont; X X if (sigq_non_empty) { X sig = sigpop(); X switch (sig.signal) { X case SIGINT: X switch(gsigflag) { X case TOPLEVEL: X if (confirm_yes( X "Interrupt recieved: Do you want to quit without saving?\n")) { X exit(4); X } X break; X case INSCRIPT: X mywarning( X "Danger: system may now be corrupt due to interrupt!\n"); X gsigflag = TOPLEVEL; X svsignal(SIGINT,oninterrupt); X longjmp(sigbuff[0]); X break; X } X break; X case SIGCHLD: X k = sig.pid; X str = int_to_string(k); X cont = cnew_constring(str); X broadcast(get_master(),"jobDone",cont); X break; X } X } X} SHAR_EOF if test 2786 -ne "`wc -c < 'sighandler.c'`" then echo shar: error transmitting "'sighandler.c'" '(should have been 2786 characters)' fi fi # end of overwriting check echo shar: extracting "'sighandler.h'" '(210 characters)' if test -f 'sighandler.h' then echo shar: will not over-write existing file "'sighandler.h'" else sed 's/^ X//' << \SHAR_EOF > 'sighandler.h' X#include <signal.h> X#include <setjmp.h> X X#define TOPLEVEL 0 X#define INSCRIPT 1 X#define RUNNINGJOB 2 X Xint oninterrupt(); Xint onsigchild(); Xint onsigalarm(); Xint gsigflag; Xint runpid; X Xjmp_buf sigbuff[2]; SHAR_EOF if test 210 -ne "`wc -c < 'sighandler.h'`" then echo shar: error transmitting "'sighandler.h'" '(should have been 210 characters)' fi fi # end of overwriting check echo shar: extracting "'string.h'" '(3 characters)' if test -f 'string.h' then echo shar: will not over-write existing file "'string.h'" else sed 's/^ X//' << \SHAR_EOF > 'string.h' X X X SHAR_EOF if test 3 -ne "`wc -c < 'string.h'`" then echo shar: error transmitting "'string.h'" '(should have been 3 characters)' fi fi # end of overwriting check echo shar: extracting "'strings.h'" '(0 character)' if test -f 'strings.h' then echo shar: will not over-write existing file "'strings.h'" else sed 's/^ X//' << \SHAR_EOF > 'strings.h' SHAR_EOF if test 0 -ne "`wc -c < 'strings.h'`" then echo shar: error transmitting "'strings.h'" '(should have been 0 character)' fi fi # end of overwriting check echo shar: extracting "'symbol.c'" '(687 characters)' if test -f 'symbol.c' then echo shar: will not over-write existing file "'symbol.c'" else sed 's/^ X//' << \SHAR_EOF > 'symbol.c' X#define BLTIN (0) X#define VAR (1) X#include <stdio.h> X#include "../archives/hash/shash.h" X Xstatic SHashTPtr table; X Xstatic int cursize; X Xvoid init_symtable() X{ X table = smake_hash(); X Sinit_hash(300,table); X cursize = 1; X} Xvoid empty_symtable() X{ X sunmake_hash(table); X} Xvoid *symlookup(name) Xchar *name; X{ X return (void *) slookup(name,table); X} Xvoid install(s,data) Xchar *s; Xvoid *data; X{ X sadd_to_hash(s,table,data); X/* cursize++;*/ X} Xint getsymsize() X{ X return cursize; X} Xint define_var(str) Xchar *str; X{ X int n; X n = slookup(str,table); X if (n == 0) { X install(str,cursize); X cursize++; X return cursize - 1; X } else { X return n; X } X X} X SHAR_EOF if test 687 -ne "`wc -c < 'symbol.c'`" then echo shar: error transmitting "'symbol.c'" '(should have been 687 characters)' fi fi # end of overwriting check echo shar: extracting "'symbol.h'" '(84 characters)' if test -f 'symbol.h' then echo shar: will not over-write existing file "'symbol.h'" else sed 's/^ X//' << \SHAR_EOF > 'symbol.h' X Xvoid init_symtable(); X Xvoid *symlookup(); X Xvoid empty_symtable(); X Xvoid install(); SHAR_EOF if test 84 -ne "`wc -c < 'symbol.h'`" then echo shar: error transmitting "'symbol.h'" '(should have been 84 characters)' fi fi # end of overwriting check echo shar: extracting "'pathname.c'" '(7739 characters)' if test -f 'pathname.c' then echo shar: will not over-write existing file "'pathname.c'" else sed 's/^ X//' << \SHAR_EOF > 'pathname.c' X#include <stdio.h> X#include <string.h> X#include <ctype.h> X#include "util.h" X#include "itemmod.h" X#include "tlmod.h" X#include "objmod.h" X#include "info.h" X#include "../archives/hash/shash.h" X#include "../archives/container/container.h" X Xchar *eat_slashes(x) Xchar *x; X{ X while (*x == '/') { X x++; X } X return x; X} Xint path_only_digits(x) Xchar *x; X{ X int i; X char a[128]; X i = 0; X while (isdigit(x[i])) { X i++; X } X if (isalpha(x[i])) { X return -1; X } X if ((x[i] == '/') || (x[i] == '\0') || (x[i] == '$') || (x[i] == '!') || (x[i] == '%') || (x[i] == '\0')) { X strncpy(a,x,i); X a[i] = '\0'; X return atoi(a); X } X return -1; X} XOBPtr obj_ofpname(pname,ref) Xchar *pname; XOBPtr ref; X{ X char lit[256]; X int i; X int n; X if ((pname[0] == '!') || (pname[0] == '$')){ X return ref; X } X if (strlen(pname) == 0) { X return ref; X } X if (pname[0] == '/') { X ref = (OBPtr) get_treeroot(); X pname = eat_slashes(pname); X return obj_ofpname(pname,ref); X } X if (ref == NULL) { X mywarning("over the top, dudemeister\n"); X return NULL; X } X X if ((pname[0] == '.') && (pname[1] == '.')) { X if (ref == (OBPtr) get_master()) X return get_master(); X else X return obj_ofpname(eat_slashes(pname+2),object_get_owner(ref)); X } X if (pname[0] == '.') { X return obj_ofpname(eat_slashes(pname+1),ref); X } X X i = 0; X X while ((*pname != '/') && (*pname != '\0') && (*pname != '$') && (*pname != '!') && (*pname != '%')){ X lit[i++] = *pname; X pname++; X } X if (i == 0) { X return ref; X } X lit[i] = '\0'; X n = path_only_digits(lit); X if (n != -1) { X if (n >= object_get_numtemps(ref)) { X return NULL; X } else { X ref = object_get_nthobj(n,ref); X } X } else { X ref = (OBPtr) slookup(lit,object_get_ctable(ref)); X } X if (ref == NULL) { X return NULL; X } X return obj_ofpname(eat_slashes(pname),ref); X} X XTLPtr temptl_ofpname(bpname,ref) Xchar *bpname; XOBPtr ref; X{ X OBPtr obj; X TLPtr tl; X char *litname; X char *cur,*index(); X int i,n,j; X X obj = ref; X cur = strchr(bpname,'$'); X if (cur != NULL) { X obj = obj_ofpname(bpname,ref); X if (obj == NULL) { X return NULL; X } X } X if (cur == NULL) { X return NULL; X } else { X litname = cur+1; X } X j = path_only_digits(litname); X n = object_get_numtemps(obj); X if (j != -1) { X if (j >= n) { X return NULL; X } X return object_get_nthtemptl(obj,j); X } X n = object_get_numtemps(obj); X X for (i = 0; i < n; i++) { X tl = object_get_nthtemptl(obj,i); X if (strncmp(tl_get_name(tl),litname,strlen(tl_get_name(tl))) == 0) { X return tl; X } X } X return NULL; X} X XTLPtr tl_ofpname(bpname,ref) Xchar *bpname; XOBPtr ref; X{ X OBPtr obj; X TLPtr tl; X char *litname; X char *cur,*index(); X int i,n,j; X X obj = ref; X cur = strchr(bpname,'!'); X if (cur != NULL) { X obj = obj_ofpname(bpname,ref); X if (obj == NULL) { X return NULL; X } X } X if (cur == NULL) { X return NULL; X/* X** FIX 8/16/88 commented out unreachable?? X** litname = mystrcpy(bpname); X*/ X } else { X litname = mystrcpy(cur+1); X } X i = 0; X while ((litname[i] != '#') && (litname[i] != '\0')) { X i++; X } X litname[i] = '\0'; X j = path_only_digits(litname); X if (j != -1) { X free(litname); X if (j >= object_get_numtls(obj)) { X return NULL; X } else { X return object_get_nthtl(j,obj); X } X } X tl = (TLPtr) slookup(litname,object_get_btable(obj)); X free(litname); X return tl; X} X X XITPtr item_ofpname(ipname,ref) Xchar *ipname; XOBPtr ref; X{ X TLPtr tl; X OBPtr obj; X ITPtr it; X char *litname; X char *cur,*index(); X int j; X obj = ref; X tl = NULL; X cur = strchr(ipname,'#'); X if (cur != NULL) { X tl = temptl_ofpname(ipname,ref); X if (tl == NULL) { X tl = tl_ofpname(ipname,ref); X if (tl == NULL) { X return NULL; X } X } X } else { X return NULL; X } X if (cur == NULL) { X litname = ipname; X } else { X litname = cur+1; X } X j = path_only_digits(litname); X if (j != -1) { X if (j >= tl_get_numitems(tl)) { X return NULL; X } else { X return tl_get_nthitem(j,tl); X } X } X it = (ITPtr) slookup(litname,tl_get_itable(tl)); X return it; X} XContainer itemval_ofitem(obj,it) XOBPtr obj; XITPtr it; X{ X TLPtr tl; X Container val; X char *litname; X char *cur,*index(); X char *cur2; X char *gen_absolute_itempname(); X X int i,j,k,n; X X if (obj == NULL) { X return NULL; X } X litname = gen_absolute_itempname(it); X if (litname == NULL) { X return NULL; X } X val = (Container) info_look(object_get_info(obj),litname); X free(litname); X if (val != NULL) { X return val; X } X return item_get_def(it); X} Xchar *gen_itempname(item,obj,tl) XITPtr item; XOBPtr obj; XTLPtr tl; X{ X char *str,*str1,*str2; X char *gen_absolute_pname(),*gen_temppname(); X if (item == NULL) { X if (tl != NULL) { X str = gen_temppname(obj,tl); X return str; X } else { X str = gen_absolute_pname(obj); X return str; X } X } X str1 = mystrcat(gen_temppname(obj,tl),"#"); X str = mystrcat(str1,item_get_name(item)); X free(str1); X return str; X} X Xchar *gen_anc_pname(father,son,curstring) XOBPtr father; XOBPtr son; Xchar *curstring; X{ X char x[256]; X x[0] = '\0'; X if (father == son) { X return curstring+1; X } else { X strcat(x,"/.."); X strcat(x,curstring); X return gen_anc_pname(father,object_get_owner(son),mystrcpy(x)); X } X X} Xchar *gen_anc_tlpname(tl,curobj) XTLPtr tl; XOBPtr curobj; X{ X char x[256]; X char *y; X x[0] = '/'; X x[1] = '\0'; X if (tl == NULL) { X return NULL; X } X y = gen_anc_pname(tl_get_owner(tl),curobj,x); X strcpy(x,y); X strcat(x,"!"); X strcat(x,tl_get_name(tl)); X return mystrcpy(x); X} X Xchar *gen_pname1(father,son,curstring) XOBPtr father; XOBPtr son; Xchar *curstring; X{ X char x[256]; X if (father == son) { X return mystrcpy(""); X } X x[0] = '\0'; X if (father == object_get_owner(son)) { X strcat(x,object_get_name(son)); X strcat(x,curstring); X free(curstring); X return mystrcpy(x); X } X strcat(x,"/"); X strcat(x,object_get_name(son)); X strcat(x,curstring); X free(curstring); X return gen_pname1(father,object_get_owner(son),mystrcpy(x)); X} Xchar *gen_pname(father,son) XOBPtr father; XOBPtr son; X{ X char *x; X x = gen_pname1(father,son,mystrcpy("")); X return x; X} Xchar *gen_absolute_pname(obj) XOBPtr obj; X{ X char *str,*str1,*str2; X OBPtr root; X root = (OBPtr) get_treeroot(); X str1 = gen_pname1(root,obj,mystrcpy("")); X str = mystrcat("/",str1); X free(str1); X return str; X} Xchar *gen_absolute_tlpname(tl) XTLPtr tl; X{ X char *str; X char *str1; X str1 = gen_absolute_pname(tl_get_owner(tl)); X str = mystrcat(str1,"!"); X free(str1); X str1 = mystrcat(str,tl_get_name(tl)); X free(str); X return str1; X} Xchar *gen_absolute_tppname(tl) XTLPtr tl; X{ X char *str,*str1; X str = gen_absolute_pname(tl_get_owner(tl)); X str1 = mystrcat(str,"$"); X free(str); X str = mystrcat(str1,tl_get_name(tl)); X free(str1); X return str; X} X Xchar *gen_temppname(obj,tl) XOBPtr obj; XTLPtr tl; X{ X char *str; X str = mystrcat(gen_absolute_pname(obj),"$"); X str = mystrcat(str,tl_get_name(tl)); X return str; X} X Xchar *gen_absolute_itempname(it) XITPtr it; X{ X char *str1,*str2,*str3; X TLPtr tl; X str1 = gen_absolute_tlpname(item_get_owner(it)); X str2 = mystrcat(str1,"#"); X str3 = mystrcat(str2,item_get_name(it)); X free(str1); X free(str2); X return str3; X} Xchar *gen_tlpname(fobj,stl) XOBPtr fobj; XTLPtr stl; X{ X char x[256]; X char *y; X y = gen_pname(fobj,tl_get_owner(stl)); X strcat(x,y); X strcat(x,"!"); X strcat(x,tl_get_name(stl)); X return mystrcpy(x); X} SHAR_EOF if test 7739 -ne "`wc -c < 'pathname.c'`" then echo shar: error transmitting "'pathname.c'" '(should have been 7739 characters)' fi fi # end of overwriting check echo shar: extracting "'pathname.h'" '(342 characters)' if test -f 'pathname.h' then echo shar: will not over-write existing file "'pathname.h'" else sed 's/^ X//' << \SHAR_EOF > 'pathname.h' X Xvoid *tl_ofpname(); Xvoid *temptl_ofpname(); Xvoid *obj_ofpname(); X Xchar *gen_anc_tlpname(); Xchar *gen_anc_pname(); X Xchar *gen_arb_pname(); Xchar *gen_pname(); Xchar *gen_tlpname(); Xchar *gen_itempname(); X Xchar *gen_absolute_pname(); Xchar *gen_absolute_tlpname(); Xchar *gen_absolute_itempname(); X Xvoid *itemval_ofpname(); X Xvoid *item_ofpname(); SHAR_EOF if test 342 -ne "`wc -c < 'pathname.h'`" then echo shar: error transmitting "'pathname.h'" '(should have been 342 characters)' fi fi # end of overwriting check echo shar: extracting "'pmap.h'" '(3 characters)' if test -f 'pmap.h' then echo shar: will not over-write existing file "'pmap.h'" else sed 's/^ X//' << \SHAR_EOF > 'pmap.h' X X X SHAR_EOF if test 3 -ne "`wc -c < 'pmap.h'`" then echo shar: error transmitting "'pmap.h'" '(should have been 3 characters)' fi fi # end of overwriting check echo shar: done with directory "'src'" cd .. # End of shell archive exit 0