v01i068: hype - a SunView object-oriented window builder, Part08/11
Charles Mcgrew
mcgrew at dartagnan.rutgers.edu
Fri Sep 15 12:50:51 AEST 1989
Submitted-by: apctrc!zmls04 at 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
More information about the Comp.sources.sun
mailing list