[comp.sources.sun] v01i068: hype - a SunView object-oriented window builder, Part08/11

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