Path: utzoo!utgpu!cs.utexas.edu!swrinde!zaphod.mps.ohio-state.edu!think.com!mintaka!bloom-beacon!eru!hagbard!sunic!mcsun!ukc!icdoc!syma!eddyg From: eddyg@syma.sussex.ac.uk (Edward J. Groenendaal) Newsgroups: alt.sources Subject: X Desktop Manager Message-ID: <4866@syma.sussex.ac.uk> Date: 17 Apr 91 20:49:06 GMT Sender: eddyg@syma.sussex.ac.uk Organization: University of Sussex Lines: 1646 ---- Cut Here and unpack ---- #!/bin/sh # this is part 3 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file code/map.c continued # CurArch=3 if test ! -r s2_seq_.tmp then echo "Please unpack part 1 first!" exit 1; fi ( read Scheck if test "$Scheck" != $CurArch then echo "Please unpack part $Scheck next!" exit 1; else exit 0; fi ) < s2_seq_.tmp || exit 1 echo "x - Continuing file code/map.c" sed 's/^X//' << 'SHAR_EOF' >> code/map.c X#include X#include X#include X#include X#include "Xedw/XedwForm.h" X#include "Xedw/XedwList.h" X Xextern void realize_dialog(Widget); X X/* Widgets */ X Xprivate Widget mappopup; /* For mapping prog over files */ Xprivate Widget mapform; Xprivate Widget maplabel; Xprivate Widget mappromptlabel; Xprivate Widget maptext; Xprivate Widget mapCancel; Xprivate Widget mapOK; X Xpublic void init_map(Widget top) X{ X Arg arglist[5]; X Cardinal i; X XtTranslations mapTranslations; X X static char defaultTranslations[] = X "CtrlA: beginning-of-line() \n\ X CtrlE: end-of-line() \n\ X Escape: beginning-of-line() kill-to-end-of-line() \n\ X Right: forward-character() \n\ X Left: backward-character() \n\ X Delete: delete-previous-character() \n\ X BackSpace: delete-previous-character() \n\ X : insert-char() \n\ X : focus-in() \n\ X : focus-out() \n\ X : select-start()"; X X X mappopup = XtCreatePopupShell("mappopup", X transientShellWidgetClass, X top, X NULL, 0); X X mapform = XtCreateManagedWidget("mapform", X xedwFormWidgetClass, X mappopup, X NULL, 0); X X i = 0; X XtSetArg(arglist[i], XtNborderWidth, 0); i++; X XtSetArg(arglist[i], XtNfullWidth, True); i++; X XtSetArg(arglist[i], XtNjustify, XtJustifyCenter); i++; X maplabel = XtCreateManagedWidget("maplabel", X labelWidgetClass, X mapform, X arglist, i); X X i = 1; X XtSetArg(arglist[i], XtNfromVert, maplabel); i++; X mappromptlabel = XtCreateManagedWidget("mappromptlabel", X labelWidgetClass, X mapform, X arglist, i); X X i = 2; X XtSetArg(arglist[i], XtNfromHoriz, mappromptlabel); i++; X XtSetArg(arglist[i], XtNfullWidth, True); i++; X XtSetArg(arglist[i], XtNeditType, XawtextEdit); i++; X maptext = XtCreateManagedWidget("maptext", X asciiTextWidgetClass, X mapform, X arglist, i); X X i = 0; X XtSetArg(arglist[i], XtNjustify, XtJustifyCenter); i++; X XtSetArg(arglist[i], XtNfromVert, maptext); i++; X XtSetArg(arglist[i], XtNlabel, "Cancel"); i++; X mapCancel = XtCreateManagedWidget("mapCancel", X commandWidgetClass, X mapform, X arglist, i); X X i = 2; X XtSetArg(arglist[i], XtNfromHoriz, mapCancel); i++; X XtSetArg(arglist[i], XtNwidthLinked, mapCancel); i++; X XtSetArg(arglist[i], XtNlabel, "OK"); i++; X mapOK = XtCreateManagedWidget("mapOK", X commandWidgetClass, X mapform, X arglist, i); X X X XtUninstallTranslations(maptext); X mapTranslations = XtParseTranslationTable(defaultTranslations); X XtOverrideTranslations(maptext, mapTranslations); X X} X Xpublic void map_dialog(Boolean map) X{ X /* if map is true then put map dialog up, otherwise use the X * select dialog. X */ X private void mapQueryResult(Widget, Boolean, caddr_t); X private void selectQueryResult(Widget, Boolean, caddr_t); X Arg arglist[1]; X X XtSetArg(arglist[0], XtNstring, ""); X XtSetValues(maptext, arglist, 1); X X if (map == True) { X XtSetArg(arglist[0], XtNlabel, " Map Program over Selected Files "); X XtSetValues(maplabel, arglist, 1); X X XtSetArg(arglist[0], XtNlabel, "Program:"); X XtSetValues(mappromptlabel, arglist, 1); X X XtAddCallback(mapCancel, XtNcallback, mapQueryResult, False); X XtAddCallback(mapOK, XtNcallback, mapQueryResult, True); X } else { X XtSetArg(arglist[0], XtNlabel, "Select Files by Regular Expression"); X XtSetValues(maplabel, arglist, 1); X X XtSetArg(arglist[0], XtNlabel, "RegExp: "); X XtSetValues(mappromptlabel, arglist, 1); X X XtAddCallback(mapCancel, XtNcallback, selectQueryResult, False); X XtAddCallback(mapOK, XtNcallback, selectQueryResult, True); X } X X realize_dialog(mappopup); X} X Xprivate void destroy_map_dialog(void) X{ X Arg arglist[1]; X X XtPopdown(mappopup); X X XtRemoveAllCallbacks(mapCancel, XtNcallback); X XtRemoveAllCallbacks(mapOK, XtNcallback); X} X Xprivate void mapQueryResult(Widget w, Boolean ok, caddr_t call_data) X{ X extern String build_arguments(String, SelOptions); X extern int execute(String, String, String, Boolean); X extern void setCursor(Cursor); X extern Cursor busy; X String mapprogram, program, filename; X Arg arglist[1]; X X destroy_map_dialog(); X X if (ok == True) { X setCursor(busy); X /* get program name from text widget */ X XtSetArg(arglist[0], XtNstring, &mapprogram); X XtGetValues(maptext, arglist, 1); X X program = XtNewString(mapprogram); X X /* extract filename from program */ X filename = XtNewString(program); X filename = strtok(filename, " "); X X /* Get list of files */ X program = build_arguments(program, M_SEL); X X execute(NULL, filename, program, False); X setCursor(NULL); X } X} X Xprivate void selectQueryResult(Widget w, Boolean ok, caddr_t call_data) X{ X extern void highlight_by_re(String); X extern void setCursor(Cursor); X extern Cursor busy; X String re; X Arg arglist[1]; X X destroy_map_dialog(); X X if (ok == True) { X /* Get regular expression */ X setCursor(busy); X XtSetArg(arglist[0], XtNstring, &re); X XtGetValues(maptext, arglist, 1); X X highlight_by_re(re); X X setCursor(NULL); X } X} SHAR_EOF echo "File code/map.c is complete" chmod 0644 code/map.c || echo "restore of code/map.c fails" echo "x - extracting code/menus.c (Text)" sed 's/^X//' << 'SHAR_EOF' > code/menus.c && X/***************************************************************************** X ** File : menus.c ** X ** Purpose : Create, and handle the pull down menus ** X ** Author : Edward Groenendaal ** X ** Date : 18th Feb 1991 ** X ** Documentation : Xdtm Design Folder ** X ** Related Files : ** X *****************************************************************************/ X X#include "xdtm.h" X#include "menus.h" X#include X#include X#include X#include X#include X X#include "Xedw/XedwList.c" X#include "Xedw/XedwForm.h" X#include "bitmaps/Tick" X#include "bitmaps/EmptyTick" X Xstatic MenuContents fileMenuStrings[] = { X { "about", "About Xdtm...", About, noflag }, X { "help", "Help", Help, noflag }, X { LINE, NULL, 0, noflag }, X { "new", "New File", New, noflag }, X { "duplicate", "Duplicate File", Duplicate, noflag }, X { LINE, NULL, 0, noflag }, X { "getinfo", "Get Info", Getinfo, noflag }, X { "copy", "Copy files", Copy, noflag }, X { "move", "Move files", Move, noflag }, X { "trash", "Delete files", Trash, noflag }, X { LINE, NULL, 0, noflag }, X { "quit", "Quit Program", Quit, noflag }, X}; X Xstatic MenuContents optionMenuStrings[] = { X { "map", "Map Program over Files", Map, noflag }, X { "select", "Select Files by Template", Select, noflag }, X}; X Xstatic MenuContents viewMenuStrings[] = { X { "icons", "Show Icons", Icons, flagged }, X { "short", "No Icons", Short, flagged }, X { LINE, NULL, 0, flagged }, X { "long", "Long Listing", Long, flagged }, X { "options", "Options", Options, flagged }, X}; X XCardinal fileMenuSize = sizeof(fileMenuStrings) / X sizeof(fileMenuStrings[0]); XCardinal optionMenuSize = sizeof(optionMenuStrings) / X sizeof(optionMenuStrings[0]); XCardinal viewMenuSize = sizeof(viewMenuStrings) / X sizeof(viewMenuStrings[0]); X Xpublic Arg chain_position[] = { XtNtop, XtChainTop, X XtNbottom, XtChainBottom, X XtNleft, XtChainLeft, X XtNright, XtChainRight, X NULL, NULL X }; X XCardinal chain_size = sizeof(chain_position)/sizeof(chain_position[0]); X Xpublic Pixmap tick, emptytick; Xpublic Widget menuBar; X Xpublic Icon_mode current_mode; X X Xpublic void createMenuWidgets(Widget w) X{ X private void menuSelect(Widget, Cardinal, caddr_t); X public void createMenu(Widget, MenuContents[], Cardinal, X void (*)(Widget, Cardinal, caddr_t) ); X X Widget fileMenuButton, optionMenuButton, viewMenuButton, selectionMenuButton; X Widget fileMenu, optionMenu, viewMenu; X Arg arglist[5], *newlist; X Cardinal i; X X i = 0; X XtSetArg(arglist[i], XtNrubberWidth, False); i++; X XtSetArg(arglist[i], XtNrubberHeight, False); i++; X XtSetArg(arglist[i], XtNborderWidth, 0); i++; X newlist = XtMergeArgLists(arglist, i, chain_position, chain_size); X menuBar = XtCreateManagedWidget("menuBar", X xedwFormWidgetClass, X w, X newlist, i + chain_size); X XtFree(newlist); X X i = 0; X XtSetArg(arglist[i], XtNhighlightThickness, 0); i++; X XtSetArg(arglist[i], XtNborderWidth, 0); i++; X XtSetArg(arglist[i], XtNmenuName, "fileMenu"); i++; X XtSetArg(arglist[i], XtNlabel, "File"); i++; X XtSetArg(arglist[i], XtNvertDistance, 0); i++; X fileMenuButton = XtCreateManagedWidget("fileMenuButton", X menuButtonWidgetClass, X menuBar, X arglist, i); X X i = 2; X XtSetArg(arglist[i], XtNmenuName, "optionMenu"); i++; X XtSetArg(arglist[i], XtNlabel, "Options"); i++; X XtSetArg(arglist[i], XtNfromHoriz, fileMenuButton); i++; X XtSetArg(arglist[i], XtNvertDistance, 0); i++; X optionMenuButton = XtCreateManagedWidget("optionMenuButton", X menuButtonWidgetClass, X menuBar, X arglist, i); X X i = 2; X XtSetArg(arglist[i], XtNmenuName, "viewMenu"); i++; X XtSetArg(arglist[i], XtNlabel, "View"); i++; X XtSetArg(arglist[i], XtNfromHoriz, optionMenuButton); i++; X XtSetArg(arglist[i], XtNvertDistance, 0); i++; X viewMenuButton = XtCreateManagedWidget("viewMenuButton", X menuButtonWidgetClass, X menuBar, X arglist, i); X X fileMenu = XtCreatePopupShell("fileMenu", X simpleMenuWidgetClass, X fileMenuButton, X NULL, 0); X X optionMenu = XtCreatePopupShell("optionMenu", X simpleMenuWidgetClass, X optionMenuButton, X NULL, 0); X X viewMenu = XtCreatePopupShell("viewMenu", X simpleMenuWidgetClass, X viewMenuButton, X NULL, 0); X X tick = XCreateBitmapFromData(XtDisplay(w), X RootWindowOfScreen(XtScreen(w)), X tick_bits, tick_width, X tick_height); X X emptytick = XCreateBitmapFromData(XtDisplay(w), X RootWindowOfScreen(XtScreen(w)), X EmptyTick_bits, X EmptyTick_width, X EmptyTick_height); X X createMenu(fileMenu, fileMenuStrings, fileMenuSize, menuSelect); X X createMenu(optionMenu, optionMenuStrings, optionMenuSize, menuSelect); X X createMenu(viewMenu, viewMenuStrings, viewMenuSize, menuSelect); X X current_mode.options = (PERMS | NLINKS | OWNER | GROUP | SIZE); X X} X X X Xpublic void createMenu(Widget menu, MenuContents menuStrings[], X Cardinal menuSize, void (*function)()) X{ X Widget menuEntry; X Cardinal i, n; X Arg arglist[3]; X X for(n=0; n < menuSize; n++) { X MenuContents entry = menuStrings[n]; X String widgetname = entry.paneName; X if (!strcmp(LINE, widgetname)) X menuEntry = XtCreateManagedWidget(widgetname, smeLineObjectClass, X menu, NULL, 0); X else { X i = 0; X XtSetArg(arglist[i], XtNlabel, entry.paneLabel); i++; X if (entry.set == flagged) { X XtSetArg(arglist[i], XtNleftMargin, (tick_width*1.5)); i++; X if (entry.paneNumber == current_mode.mode) { X XtSetArg(arglist[i], XtNleftBitmap, tick); i++; X } else { X XtSetArg(arglist[i], XtNleftBitmap, None); i++; X } X } X X menuEntry = XtCreateManagedWidget(widgetname, smeBSBObjectClass, X menu, arglist, i); X if (entry.paneNumber == current_mode.mode && entry.set == flagged) X current_mode.w = menuEntry; X X XtAddCallback(menuEntry, XtNcallback, function, X (caddr_t) entry.paneNumber); X } X } X} X X Xprivate void menuSelect(Widget w, Cardinal paneNumber, caddr_t rubbish) X{ X extern void map_dialog(Boolean); X extern void quit_dialog(void); X extern void query_dialog(String, Boolean); X extern void displayfile(String); X extern void newfile_dialog(Boolean, String, Boolean); X extern void button_selected(Widget, Cardinal, caddr_t); X extern void listoption_dialog(void); X extern Boolean directoryManagerNewDirectory(String); X extern String getfilename(String); X extern void setCursor(Cursor); X extern Cursor busy; X extern String cwd; X extern Widget directoryManager; X XedwListReturnStruct *highlighted; X String filename, fullname, level; X struct stat filestatus; X Arg arglist[6]; X Cardinal i; X X switch (paneNumber) { X case About: X level = XtMalloc (sizeof(char) * 25); X sprintf(level, " Xdtm v%d.%d ", RELEASE, PATCHLEVEL); X query_dialog(level, False); X break; X case Help: X if (access(SYSTEM_HELP, R_OK) == 0) X displayfile(SYSTEM_HELP); X else X query_dialog("Help not found!", False); X break; X X case New: X newfile_dialog(False, NULL, False); X break; X X case Duplicate: X /* Find out whether highlighted file is a regular file or a directory */ X highlighted = XedwListShowCurrent(directoryManager); X if (highlighted->xedwList_index != XDTM_LIST_NONE) { X if (highlighted->next != NULL) X query_dialog("Only one file!", False); X else { X filename = getfilename(highlighted->string); X fullname=(String) XtMalloc((strlen(filename)+strlen(cwd)+1) * sizeof(char)); X strcpy(fullname, cwd); X if (strcmp(cwd, "/") != 0) X strcat(fullname, "/"); X strcat(fullname, filename); X if (stat(fullname, &filestatus) == -1) { X fprintf(stderr,"xdtm: ARRRGGHHH stat error\n"); X } else { X if ((filestatus.st_mode & S_IFMT) == S_IFDIR) X /* Is a directory */ X newfile_dialog(True, filename, True); X else if ((filestatus.st_mode & S_IFMT) == S_IFREG) X newfile_dialog(True, filename, False); X else X query_dialog("Wrong file type!", False); X } X XtFree(fullname); X } X } else X fprintf(stderr, "Error: Duplicate selected when should have been" X " disabled\n"); X break; X X case Getinfo: X query_dialog("Not implemented!", False); X break; X X case Copy: X case Move: X case Trash: X /* Call button press with it */ X button_selected(w, paneNumber, 0); X break; X X case Quit: X quit_dialog(); X break; X X case Map: X map_dialog(True); X break; X X case Select: X map_dialog(False); X break; X X case Icons: X if (current_mode.mode != Icons) { X i = 0; X XtSetArg(arglist[i], XtNleftBitmap, None); i++; X XtSetValues(current_mode.w, arglist, i); X i = 0; X XtSetArg(arglist[i], XtNleftBitmap, tick); i++; X XtSetValues(w, arglist, i); X current_mode.w = w; X current_mode.mode = Icons; X XtSetArg(arglist[i], XtNshowIcons, True); i++; X XtSetArg(arglist[i], XtNrowSpacing, 10); i++; X XtSetArg(arglist[i], XtNforceColumns, False); i++; X XtSetArg(arglist[i], XtNdefaultColumns, 2); i++; X XtSetValues(directoryManager, arglist, i); X directoryManagerNewDirectory(cwd); X } X break; X X case Short: X if (current_mode.mode != Short) { X i = 0; X XtSetArg(arglist[i], XtNleftBitmap, None); i++; X XtSetValues(current_mode.w, arglist, i); X i = 0; X XtSetArg(arglist[i], XtNleftBitmap, tick); i++; X XtSetValues(w, arglist, i); X current_mode.w = w; X current_mode.mode = Short; X i = 0; X XtSetArg(arglist[i], XtNshowIcons, False); i++; X XtSetArg(arglist[i], XtNrowSpacing, 5); i++; X XtSetArg(arglist[i], XtNforceColumns, False); i++; X XtSetArg(arglist[i], XtNdefaultColumns, 2); i++; X XtSetValues(directoryManager, arglist, i); X directoryManagerNewDirectory(cwd); /* To be consistent */ X } X break; X X case Long: X if (current_mode.mode != Long) { X i = 0; X XtSetArg(arglist[i], XtNleftBitmap, None); i++; X XtSetValues(current_mode.w, arglist, i); X i = 0; X XtSetArg(arglist[i], XtNleftBitmap, tick); i++; X XtSetValues(w, arglist, i); X current_mode.w = w; X current_mode.mode = Long; X i = 0; X XtSetArg(arglist[i], XtNshowIcons, False); i++; X XtSetArg(arglist[i], XtNrowSpacing, 5); i++; X XtSetArg(arglist[i], XtNforceColumns, True); i++; X XtSetArg(arglist[i], XtNdefaultColumns, 1); i++; X XtSetValues(directoryManager, arglist, i); X directoryManagerNewDirectory(cwd); /* To be consistent */ X } X break; X X case Options: X listoption_dialog(); X break; X X default: X fprintf(stderr, "Menu option number %d not supported\n", paneNumber); X break; X } X X X} X SHAR_EOF chmod 0644 code/menus.c || echo "restore of code/menus.c fails" echo "x - extracting code/menus.h (Text)" sed 's/^X//' << 'SHAR_EOF' > code/menus.h && X/*********************************************************************************** X ** File : menus.h ** X ** Purpose : ** X ** Author : Edward Groenendaal ** X ** Date : 18th Feb 1990 ** X ** Documentation : Xedw Design Folder ** X ** Related Files : menus.c ** X ***********************************************************************************/ X X#ifndef _EG_menus_h X#define _EG_menus_h X X#include X X#define LINE "line" X X#define PERMS (1 << 1) X#define NLINKS (1 << 2) X#define OWNER (1 << 3) X#define GROUP (1 << 4) X#define SIZE (1 << 5) X#define MODTM (1 << 6) X#define ACCTM (1 << 7) X Xtypedef enum {flagged, noflag} Flags; X Xtypedef enum { X About, X Help, X New, X Duplicate, X Getinfo, X Copy, X Move, X Trash, X Quit, X Map, X Select, X Icons, X Short, X Long, X Options X} MenuValue; X Xtypedef struct { X String paneName; X String paneLabel; X MenuValue paneNumber; X Flags set; X} MenuContents; X Xtypedef struct { X Widget w; X MenuValue mode; X /* long listing options */ X Cardinal length; X char options; X} Icon_mode; X Xextern Widget menuBar; Xextern Icon_mode current_mode; Xextern Pixmap tick; Xextern Pixmap emptytick; X X#endif /* _EG_menus_h */ SHAR_EOF chmod 0644 code/menus.h || echo "restore of code/menus.h fails" echo "x - extracting code/newfile.c (Text)" sed 's/^X//' << 'SHAR_EOF' > code/newfile.c && X/***************************************************************************** X ** File : newfile.c ** X ** Purpose : Initialise and Realise newfile dialog ** X ** Author : Edward Groenendaal ** X ** Date : April 1991 ** X ** Documentation : Xdtm Design Folder ** X ** Related Files : ** X *****************************************************************************/ X X#include "xdtm.h" X X#include X#include X#include X#include X#include "Xedw/XedwForm.h" X Xextern void realize_dialog(Widget); X X/* Widgets */ X Xprivate Widget newfilepopup; Xprivate Widget newfileform; Xprivate Widget newfilelabel; Xprivate Widget newfiletext; Xprivate Widget newfilefile; Xprivate Widget newfiledir; Xprivate Widget newfilecancel; X Xtypedef struct { X String filename; X Boolean isdir; X} Filetype; X Xpublic void init_newfile(Widget top) X{ X /* Create Widgets for newfile dialog */ X private void destroy_newfile_dialog(Widget, caddr_t, caddr_t); X X Arg arglist[5]; X Cardinal i; X XtTranslations newfileTranslations; X X static char defaultTranslations[] = X "CtrlA: beginning-of-line() \n\ X CtrlE: end-of-line() \n\ X Escape: beginning-of-line() kill-to-end-of-line() \n\ X Right: forward-character() \n\ X Left: backward-character() \n\ X Delete: delete-previous-character() \n\ X BackSpace: delete-previous-character() \n\ X : insert-char() \n\ X : focus-in() \n\ X : focus-out() \n\ X : select-start()"; X X X newfilepopup = XtCreatePopupShell("newfilepopup", X transientShellWidgetClass, X top, X NULL, 0); X X newfileform = XtCreateManagedWidget("newfileform", X xedwFormWidgetClass, X newfilepopup, X NULL, 0); X X /* label widget to prompt for new filename */ X X i = 0; X XtSetArg(arglist[i], XtNfullWidth, True); i++; X XtSetArg(arglist[i], XtNborderWidth, 0); i++; X XtSetArg(arglist[i], XtNjustify, XtJustifyCenter); i++; X newfilelabel = XtCreateManagedWidget("newfilelabel", X labelWidgetClass, X newfileform, X arglist, i); X X /* new filename text input widget */ X X i = 1; X XtSetArg(arglist[i], XtNfromVert, newfilelabel); i++; X XtSetArg(arglist[i], XtNeditType, XawtextEdit); i++; X newfiletext = XtCreateManagedWidget("newfiletext", X asciiTextWidgetClass, X newfileform, X arglist, i); X X i = 0; X XtSetArg(arglist[i], XtNfromVert, newfiletext); i++; X XtSetArg(arglist[i], XtNlabel, "Directory"); i++; X newfiledir = XtCreateManagedWidget("newfiledir", X commandWidgetClass, X newfileform, X arglist, i); X i = 1; X XtSetArg(arglist[i], XtNfromHoriz, newfiledir); i++; X XtSetArg(arglist[i], XtNwidthLinked, newfiledir); i++; X XtSetArg(arglist[i], XtNlabel, "File"); i++; X newfilefile = XtCreateManagedWidget("newfilefile", X commandWidgetClass, X newfileform, X arglist, i); X X i = 1; X XtSetArg(arglist[i], XtNfromHoriz, newfilefile); i++; X XtSetArg(arglist[i], XtNwidthLinked, newfilefile); i++; X XtSetArg(arglist[i], XtNlabel, "Cancel"); i++; X newfilecancel = XtCreateManagedWidget("newfilecancel", X commandWidgetClass, X newfileform, X arglist, i); X X /* Add callbacks for buttons */ X XtAddCallback(newfilecancel, XtNcallback, destroy_newfile_dialog, 0); X X /* Do the translations on the text widget */ X XtUninstallTranslations(newfiletext); X newfileTranslations = XtParseTranslationTable(defaultTranslations); X XtOverrideTranslations(newfiletext, newfileTranslations); X} X Xpublic void newfile_dialog(Boolean rename, String newname, Boolean isdir) X{ X /* Popup the newfile dialog on screen with the correct data */ X private void newfileQueryReturn(Widget, Boolean, caddr_t); X private void duplicateQueryReturn(Widget, Filetype*, caddr_t); X Arg arglist[1]; X String filename; X Filetype *filetype; X X static String defaultfilename = "untitled"; X X filetype = (Filetype*) XtMalloc (sizeof(Filetype)); X X if (newname == NULL) X filename = defaultfilename; X else X filename = newname; X X if (rename == False) { X /* Create a new file */ X X XtSetArg(arglist[0], XtNlabel, "Create a new file"); X XtSetValues(newfilelabel, arglist, 1); X X XtSetArg(arglist[0], XtNstring, filename); X XtSetValues(newfiletext, arglist, 1); X X /* Add callbacks for buttons */ X XtAddCallback(newfiledir, XtNcallback, newfileQueryReturn, True); X XtAddCallback(newfilefile, XtNcallback, newfileQueryReturn, False); X } else { X /* rename an existing file */ X filetype->filename = filename; X filetype->isdir = isdir; X X XtSetArg(arglist[0], XtNlabel, "Duplicate file"); X XtSetValues(newfilelabel, arglist, 1); X X XtSetArg(arglist[0], XtNstring, filename); X XtSetValues(newfiletext, arglist, 1); X X if (isdir == True) X XtSetSensitive(newfilefile, False); X else X XtSetSensitive(newfiledir, False); X XtAddCallback(newfiledir, XtNcallback, duplicateQueryReturn, filetype); X XtAddCallback(newfilefile, XtNcallback, duplicateQueryReturn, filetype); X } X X realize_dialog(newfilepopup); X X} X Xprivate void destroy_newfile_dialog(Widget w, caddr_t dummy1, caddr_t dummy2) X{ X X XtPopdown(newfilepopup); X X XtSetSensitive(newfilefile, True); X XtSetSensitive(newfiledir, True); X XtRemoveAllCallbacks(newfilefile, XtNcallback); X XtRemoveAllCallbacks(newfiledir, XtNcallback); X} X Xprivate void newfileQueryReturn(Widget w, Boolean isdir, caddr_t dummy) X{ X extern void query_dialog(String, Boolean); X extern String cwd; X String filename, fullname; X Arg arglist[1]; X int fd; X X destroy_newfile_dialog(w, 0, 0); X X XtSetArg(arglist[0], XtNstring, &filename); X XtGetValues(newfiletext, arglist, 1); X X fullname = (String) XtMalloc (sizeof(char) * (strlen(cwd) + X strlen(filename) + 2)); X sprintf(fullname, "%s/%s", cwd, filename); X X if (isdir == True) { X /* Create a directory with the name 'filename' */ X if ((fd = mkdir(fullname, 0777)) == -1) X query_dialog("Can't create dir", False); X else X directoryManagerNewDirectory(cwd); X } else { X /* Create a file with the name 'filename' */ X if ((fd = creat(fullname, 0666)) == -1) { X /* Can't create fullname, maybe should look in errno to see why? */ X query_dialog("Can't create file", False); X } else { X close(fd); X directoryManagerNewDirectory(cwd); X } X } X X XtFree(fullname); X} X X Xprivate void duplicateQueryReturn(Widget w, Filetype *filetype, caddr_t dummy) X{ X extern void query_dialog(String, Boolean); X extern String cwd; X String filename, command; X Arg arglist[1]; X int fd; X X destroy_newfile_dialog(w, 0, 0); X X XtSetArg(arglist[0], XtNstring, &filename); X XtGetValues(newfiletext, arglist, 1); X X command = XtMalloc (sizeof(char) * (strlen(filetype->filename) + X strlen(filename) + 20)); X X if (filetype->isdir == True) { X /* make new directory, copy contents of old one into it */ X if ((fd = mkdir(filename, 0777)) == -1) X query_dialog("Can't create dir", False); X sprintf(command, "sh -c 'cp -r \"%s\"/ \"%s\"'", filetype->filename, X filename); X X if (execute(NULL, "sh", command, True) != 0) X query_dialog("Can't copy files!", False); X else X directoryManagerNewDirectory(cwd); X } else { X sprintf(command, "cp '%s' '%s'", filetype->filename, filename); X X if (execute(NULL, "cp", command, True) != 0) X query_dialog("Can't create file!", False); X else X directoryManagerNewDirectory(cwd); X } X X XtFree(command); X} SHAR_EOF chmod 0644 code/newfile.c || echo "restore of code/newfile.c fails" echo "x - extracting code/parse.c (Text)" sed 's/^X//' << 'SHAR_EOF' > code/parse.c && X/***************************************************************************** X ** File : parse.c ** X ** Purpose : Parse setup file, select icon to be used. ** X ** Author : Edward Groenendaal ** X ** Date : 19th Feb 1990 ** X ** Documentation : Xdtm Design Folder ** X ** Related Files : ** X *****************************************************************************/ X X#include "xdtm.h" X X#include X#include X#include X#include X#include X#include X#include "parse.h" X#include "menus.h" X X#include "Xedw/XedwList.h" X X#include "bitmaps/Grey.Mask" X#include "bitmaps/folder.icon" X#include "bitmaps/file.icon" X Xtypedef struct _BTree { X Pixmap icon; X Pixmap grey; X struct _BTree *left; X struct _BTree *right; X} BTree; X Xextern FILE *yyin; Xextern int step(char*, char*); Xextern int circf; Xextern typePrefs *prefs ; X Xpublic uid_t user; Xpublic uid_t group; Xprivate BTree *grey_tree; X Xprivate Pixmap applyprefs(typePrefs*, String, String, struct stat*); Xprivate Pixmap do_iconprefs(iconPrefs*, String, String, struct stat*); X Xpublic GC xdtmgc; Xpublic Pixmap foldericon, fileicon, grey_mask; /* default icons */ X Xpublic Boolean getIconType(String filename, String path, XedwList *element) X{ X /* Return True if file should be displayed, otherwise False. X * If long listing is on, element should be DUMMY, and this X * routine should fill the entries into the icon_list. X */ X X private Pixmap grey_icon(Pixmap); X X extern Icon_mode current_mode; X struct stat *filestatus; X typePrefs *myprefs = prefs; X String fullname; X Pixmap icon; X X element->string = XtNewString(filename); X X if (current_mode.mode != Short) { X filestatus = (struct stat*) XtMalloc (sizeof(struct stat)); X fullname=(String) XtMalloc((strlen(filename)+strlen(path)+1) * sizeof(char)); X strcpy(fullname, path); X strcat(fullname, "/"); X strcat(fullname, filename); X if (lstat(fullname, filestatus) == -1) { X /* maybe a link to a nonexistent file? */ X return(False); X } else { X if (current_mode.mode == Icons) { X element->icon = fileicon; X if ((filestatus->st_mode & S_IFMT) == S_IFDIR) /* stat(5) for details */ X element->icon = foldericon; X X /* try all rules in prefs */ X if ((icon = applyprefs(myprefs, fullname, filename, filestatus)) != NULL) { X X /* If the file is a directory but is not readable AND executable by the user X * then grey it. If the file is not readable then grey it. X */ X X /* if not readable then grey it */ X if (icon != DUMMY) X if (!(((filestatus->st_mode & S_IRUSR) != 0 && X user == filestatus->st_uid) || X ((filestatus->st_mode & S_IRGRP) != 0 && X group == filestatus->st_gid) || X ((filestatus->st_mode & S_IROTH) != 0))) { X icon = grey_icon(icon); X } else { X if ((filestatus->st_mode & S_IFMT) == S_IFDIR) X if (!(((filestatus->st_mode & S_IXUSR) != 0 && X user == filestatus->st_uid) || X ((filestatus->st_mode & S_IXGRP) != 0 && X group == filestatus->st_gid) || X ((filestatus->st_mode & S_IXOTH) != 0))) { X icon = grey_icon(icon); X } X } X element->icon = icon; X } X } else { X /* Long Listing */ X Cardinal length; X char cm = current_mode.options; X String output_line = ""; X X element->icon = NULL; X length = 0; X if (cm & PERMS) { X char type; X char xusr, xgrp, xoth; X unsigned short mode = (filestatus->st_mode); X X output_line = (String) XtMalloc (sizeof(char) * 12); X X /* I could use the S_IS* macros here but I prefer to see what's X * going on. X */ X if ((mode & S_IFMT) == S_IFDIR) type = 'd'; /* Directory */ X else if ((mode & S_IFMT) == S_IFBLK) type = 'b'; /* Block device */ X else if ((mode & S_IFMT) == S_IFCHR) type = 'c'; /* Character device */ X else if ((mode & S_IFMT) == S_IFREG) type = ' '; /* Plain file */ X else if ((mode & S_IFMT) == S_IFIFO) type = 'f'; /* Fifo */ X else if ((mode & S_IFMT) == S_IFLNK) type = 'l'; /* Symbolic link */ X else if ((mode & S_IFMT) == S_IFSOCK) type = 's'; /* Socket */ X else type = '?'; X X if (mode & S_ISUID) /* Set User Id */ X xusr = 's'; X else if (mode & S_IXUSR) X xusr = 'x'; X else X xusr = '-'; X X if (mode & S_ISGID) /* Set Group Id */ X xgrp = 's'; X else if (mode & S_IXGRP) X xgrp = 'x'; X else X xgrp = '-'; X X if (mode & S_ISVTX) /* Save Text */ X xoth = 't'; X else if (mode & S_IXOTH) X xoth = 'x'; X else X xoth = '-'; X X sprintf(output_line, X "%c%c%c%c%c%c%c%c%c%c ", X type, X (mode & S_IRUSR) ? 'r' : '-', X (mode & S_IWUSR) ? 'w' : '-', X xusr, X (mode & S_IRGRP) ? 'r' : '-', X (mode & S_IWGRP) ? 'w' : '-', X xgrp, X (mode & S_IROTH) ? 'r' : '-', X (mode & S_IWOTH) ? 'w' : '-', X xoth); X } X X if (cm & NLINKS) { X output_line = XtRealloc (output_line, X sizeof(char) * X (strlen(output_line) + 3 + 2)); X X sprintf(output_line, "%s%3d ", output_line, X filestatus->st_nlink); X } X if (cm & OWNER) { X struct passwd *pw; X X output_line = XtRealloc (output_line, X sizeof(char) * X (strlen(output_line) + 8 + 2)); X X if ((pw = getpwuid(filestatus->st_uid)) == NULL) X sprintf(output_line, "%s%-8d ", output_line, filestatus->st_uid); X else X sprintf(output_line, "%s%-8s ", output_line, pw->pw_name); X X } X if (cm & GROUP) { X struct group *gr; X X output_line = XtRealloc (output_line, X sizeof(char) * X (strlen(output_line) + 8 + 2)); X X if ((gr = getgrgid(filestatus->st_gid)) == NULL) X sprintf(output_line, "%s%-8d ", output_line, filestatus->st_gid); X else X sprintf(output_line, "%s%-8s ", output_line, gr->gr_name); X X } X if (cm & SIZE) { X unsigned short mode = (filestatus->st_mode); X X output_line = XtRealloc (output_line, X sizeof(char) * X (strlen(output_line) + 9 + 2)); X if ((mode & S_IFMT) == S_IFBLK || (mode & S_IFMT) == S_IFCHR) X sprintf(output_line, "%s%5d,%3d ", output_line, X (filestatus->st_rdev >> 8) & 0377, X (filestatus->st_rdev) & 0377); X else X sprintf(output_line, "%s%9d ", output_line, filestatus->st_size); X } X if (cm & MODTM) { X String time; X output_line = XtRealloc (output_line, X sizeof(char) * X (strlen(output_line) + 35 + 2)); X X time = ctime(&(filestatus->st_mtime)); X *(time + (strlen(time) - 1)) = '\0'; X sprintf(output_line, "%s%s ", output_line, time); X } X if (cm & ACCTM) { X String time; X output_line = XtRealloc (output_line, X sizeof(char) * X (strlen(output_line) + 35 + 2)); X X time = ctime(&(filestatus->st_atime)); X *(time + (strlen(time) - 1)) = '\0'; X sprintf(output_line, "%s%s ", output_line, time); X } X current_mode.length = strlen(output_line); /* length of data */ X output_line = XtRealloc (output_line, X sizeof(char) * X (strlen(output_line) + strlen(filename) + 2)); X sprintf(output_line, "%s%s", output_line, filename); X element->string = output_line; X } X } X XtFree(filestatus); X XtFree(fullname); X } X X if (element->icon == DUMMY) X return(False); X else X return(True); X} X Xprivate Pixmap applyprefs(typePrefs *tp, String fullname, String filename, X struct stat *filestatus) X{ X /* Recursively traverse the prefs structure until a match is found. X * Jump out as soon as a match is found, try special files first */ X X Pixmap icon = NULL; X X /* Try directories */ X if (icon == NULL && X tp->dir != NULL && X (filestatus->st_mode & S_IFMT) == S_IFDIR) { X icon = applyprefs(tp->dir, fullname, filename, filestatus); X } X X /* Try plain files */ X if (icon == NULL && X tp->file != NULL && X (filestatus->st_mode & S_IFMT) == S_IFREG) { X icon = applyprefs(tp->file, fullname, filename, filestatus); X } X X /* Try executable files */ X if (icon == NULL && X tp->exe != NULL && X (filestatus->st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) != 0) { X icon = applyprefs(tp->exe, fullname, filename, filestatus); X } X /* Try Readable files */ X if (icon == NULL && X tp->read != NULL && X (filestatus->st_mode & (S_IRUSR | S_IRGRP | S_IROTH)) != 0) { X icon = applyprefs(tp->read, fullname, filename, filestatus); X } X X /* Try Writable files */ X if (icon == NULL && X tp->write != NULL && X (filestatus->st_mode & (S_IWUSR | S_IWGRP | S_IWOTH)) != 0) { X icon = applyprefs(tp->write, fullname, filename, filestatus); X } X X /* defaults */ X if (icon == NULL && tp->iconprefs != NULL) { X icon = do_iconprefs(tp->iconprefs, fullname, filename, filestatus); X } X X return(icon); X} X Xprivate Pixmap grey_icon(Pixmap icon) X{ X private BTree *grey_search(Pixmap, Pixmap*, BTree*); X Pixmap result; X X grey_tree = grey_search(icon, &result, grey_tree); X X return(result); X} X Xprivate BTree *grey_search(Pixmap icon, Pixmap *new, BTree *tree) X{ X Pixmap newpixmap; X Widget w; X BTree *result; X extern Widget topLevel; X X if (tree == NULL) { X /* Create Pixmap */ X result = (BTree*) XtMalloc (sizeof(BTree)); X result->icon = icon; X result->left = NULL; X result->right = NULL; X newpixmap = XCreatePixmap(XtDisplay(topLevel), X RootWindowOfScreen(XtScreen(topLevel)), X 32, 32, DefaultDepthOfScreen(XtScreen(topLevel))); X XSetFunction(XtDisplay(topLevel), xdtmgc, GXcopy); X XCopyPlane(XtDisplay(topLevel), X icon, newpixmap, xdtmgc, 0, 0, 32, 32, 0, 0, 1); X XSetFunction(XtDisplay(topLevel), xdtmgc, GXand); X XCopyPlane(XtDisplay(topLevel), X grey_mask, newpixmap, xdtmgc, 0, 0, 32, 32, 0, 0, 1); X result->grey = newpixmap; X *new = newpixmap; X } else X if (tree->icon == icon) { X *new = tree->grey; X result = tree; X } else X if (tree->icon < icon) X result = grey_search(icon, new, tree->left); X else X result = grey_search(icon, new, tree->right); X X return(result); X} X Xprivate Pixmap do_iconprefs(iconPrefs *ip, String fullname, String filename, X struct stat *filestatus) X{ X /* traverse linked list trying to match regular expressions against X * the current filename X */ X Pixmap icon = NULL; X String string; X X if (ip != NULL) X if (ip->expbuf == NULL) { X /* default value */ X icon = ip->icon; X } else { X /* try to match regular expression, X * Add stuff here to check for whether to use fullname or filename. X */ X if (ip->checkpath == True) X string = fullname; X else X string = filename; X circf = ip->circf; X if (step(string, ip->expbuf) != 0) { X if (ip->extra != NULL) { X icon = applyprefs((typePrefs*)ip->extra, fullname, filename, filestatus); X } X if (icon == NULL) X icon = ip->icon; X } else { X icon = do_iconprefs(ip->next, fullname, filename, filestatus); X } X } X return(icon); X} X Xpublic Boolean parsePreferences(Widget w) X{ X private void initBitmaps(Widget); X extern int yyparse(void); X extern void selectionChange(Widget, Cardinal, caddr_t); X extern typePrefs *newTypePref(void); X extern AppSelection **appselections; X extern Cardinal selectionindex; X extern String home; X extern Widget selectionMenu; X MenuContents *selectionmenu; X String setupfile; X Cardinal i; X int n; X X initBitmaps(w); X X /* check to see it there is an .xdtmrc in the users home directory. X * If not use the system one.. or the command line argument one. X */ X X setupfile = (String) XtMalloc ((strlen(home) + 8) * sizeof(char)); X X user = geteuid(); X group = getegid(); X X strcpy(setupfile, home); X strcat(setupfile, "/.xdtmrc"); X if (((yyin = fopen(setupfile, "r")) == NULL) && X ((yyin = fopen(SYSTEM_XDTMRC, "r")) == NULL)) { X fprintf(stderr, "Warning: No user or system xdtmrc found\n"); X prefs = newTypePref(); X } else { X /* parse the file */ X (void) yyparse(); X } X XtFree(setupfile); X X /* Create selection menu */ X selectionmenu = (MenuContents*) XtMalloc (sizeof(MenuContents) * selectionindex); X for(i = 0; i < selectionindex; i++) { X selectionmenu[i].paneName = appselections[i]->name; X selectionmenu[i].paneLabel = appselections[i]->name; X selectionmenu[i].paneNumber = i; X selectionmenu[i].set = noflag; X } X X createMenu(selectionMenu, selectionmenu, i, selectionChange); X X} X Xprivate void initBitmaps(Widget w) X{ X XGCValues values; X X foldericon = XCreateBitmapFromData( XtDisplay(w), X RootWindowOfScreen(XtScreen(w)), X folder_bits, X IconBitmapWidth, IconBitmapHeight); X fileicon = XCreateBitmapFromData( XtDisplay(w), X RootWindowOfScreen(XtScreen(w)), X file_bits, X IconBitmapWidth, IconBitmapHeight); X grey_mask = XCreateBitmapFromData( XtDisplay(w), X RootWindowOfScreen(XtScreen(w)), X Grey_bits, X IconBitmapWidth, IconBitmapHeight); X X if ((BlackPixelOfScreen(XtScreen(w))) == 1) { X values.background = WhitePixelOfScreen(XtScreen(w)); X values.foreground = BlackPixelOfScreen(XtScreen(w)); X } else { X values.background = BlackPixelOfScreen(XtScreen(w)); X values.foreground = WhitePixelOfScreen(XtScreen(w)); X } X X xdtmgc = XtGetGC(w, (unsigned) GCBackground | GCForeground, &values); X X grey_tree = NULL; X} X X Xpublic void highlight_by_re(String re) X{ X /* This procedure is called by selectQueryResult in map.c, it should be in X * map.c but can't because can only be accessable from within X * one file. X */ X extern void selection_made(Widget, caddr_t, caddr_t); X extern XedwList **icon_list; X extern Cardinal icon_list_size; X extern Widget directoryManager; X String buffer; X Cardinal i; X X buffer = (char*) XtMalloc (sizeof(char) * ESIZE); X compile(re, buffer, &(buffer[ESIZE]), '\0'); X X /* traverse icon_list calling XedwListHighlight on every filename X * matched. X */ X for (i = 0; i < icon_list_size; i++) { X if (step(icon_list[i]->string, buffer) != 0) X XedwListHighlight(directoryManager, i); X } X X selection_made(directoryManager, 0, 0); X X XtFree(buffer); X X} X X X X X X X X X X X X X SHAR_EOF chmod 0644 code/parse.c || echo "restore of code/parse.c fails" echo "x - extracting code/parse.h (Text)" sed 's/^X//' << 'SHAR_EOF' > code/parse.h && X/***************************************************************************** X ** File : parse.h ** X ** Purpose : ** X ** Author : Edward Groenendaal ** X ** Date : 18th Feb 1990 ** X ** Documentation : Xdtm Design Folder ** X ** Related Files : parse.c, lexical.h, parser.y ** X *****************************************************************************/ X X#ifndef _parse_h X#define _parse_h X X/* Directory Manager Structures */ X Xtypedef struct _iconPrefs { X char *expbuf; X int circf; X Boolean checkpath; X XtPointer extra; X Pixmap icon; X struct _iconPrefs *next; X} iconPrefs; X Xtypedef struct _typePrefs { X iconPrefs *iconprefs; X struct _typePrefs *dir; X struct _typePrefs *file; X struct _typePrefs *exe; X struct _typePrefs *read; X struct _typePrefs *write; X} typePrefs; X X/* Application Manager Structure */ X X#define APPPSIZE 10 /* Initial size of an AppProgram Array */ X#define APPPINC 5 /* Increment by which to increase AppProgram Array on overflow */ X Xtypedef enum {M_SEL, O_SEL, N_SEL} SelOptions; X Xtypedef struct { X String string; X Pixmap icon; X String program; X SelOptions options; X} AppProgram; X Xtypedef struct { X String name; X Cardinal number; X AppProgram **list; X} AppSelection; X X/* Regular Expression macros */ X X#define ESIZE 1024 /* maximum size of an expression */ X X#define INIT register String sp = instring; X#define GETC() (*sp++) X#define PEEKC() (*sp) X#define UNGETC(c) (--sp) X#define RETURN(c) return; X#define ERROR(c) {fprintf(stderr,"regexp error %d\n", c); exit(1);}; X X#endif /* _parse_h */ SHAR_EOF chmod 0644 code/parse.h || echo "restore of code/parse.h fails" echo "x - extracting code/parser.y (Text)" sed 's/^X//' << 'SHAR_EOF' > code/parser.y && X%{ /*-*- Mode: C -*-*/ X/************************************************************************** X * Filename : parser.y X * Author : Edward Groenendaal X * Date : 31/1/91 X * Purpose : X * X **************************************************************************/ X X#define YYDEBUG 1 X#include "xdtm.h" X#include "parse.h" X#include X Xtypedef struct _iconTree { X String fullname; /* index on this */ X Pixmap icon; X struct _iconTree *left; X struct _iconTree *right; X} iconTree; X Xtypedef struct _varStack { X String *defpath; X Cardinal dirinpath; X Boolean checkpath; X iconPrefs *iconpref; X typePrefs *current; X struct _varStack *next; X} varStack; X Xpublic typePrefs *newTypePref(void); Xprivate void start_block(typePrefs*,iconPrefs*); Xprivate void end_block(void); Xprivate String *stringtopath(String, Cardinal*); Xprivate Pixmap lookupicon(String); Xprivate iconPrefs *getlast(iconPrefs*); Xprivate iconPrefs *inserticonpref(iconPrefs*, iconPrefs*); Xprivate String strip_quotes(String); Xprivate iconTree *get_pixmap(iconTree*,iconTree*); Xprivate void set_path(String); Xprivate void set_icon(String, Boolean); Xprivate void set_deficon(String); Xprivate void set_ignore(void); Xprivate void newselection(String); Xprivate void setapp(int, String); X X/* imported variables/procedures */ Xextern int parseerror; /* quantity of parse errors so far */ Xextern int yylineno; /* line number being parsed */ Xextern void yyerror(char *, ...); /* normal error printing routine */ X X#ifndef DEBUG_YACC Xextern Widget topLevel; X#endif X Xpublic AppSelection **appselections; Xpublic typePrefs *prefs; /* preferneces */ Xprivate varStack *varframe; /* stack frames */ Xprivate iconTree *icontable; /* table of pixmaps */ Xprivate char *ptr; /* general use pointer */ Xprivate AppSelection *current_selection; Xprivate Cardinal listindex; /* index into current appprogram list */ Xprivate Cardinal currentlistmax; /* current list appprogram size */ Xpublic Cardinal selectionindex; /* index into appselections */ X X%} /* Start of YACC declarations */ X X%start xdtmrc X X%union /* valid types */ X{ X int number; /* number */ X char *string; /* string */ X} X X/* declare terminals with their types */ X X%token STRING_T X%token IF_T SET_T ICON_T NAME_T PATH_T DEFICON_T TYPE_T CHECKPATH_T X%token TRUE_T FALSE_T IGNORE_T X%token DIR_T FILE_T READ_T WRITE_T EXE_T PROG_T OPTIONS_T X%token MSEL_T OSEL_T NSEL_T DEFINE_T X%token ASSIGN_T EQUAL_T SEMIC_T COMMA_T X%token O_PAR_T C_PAR_T O_BRACE_T C_BRACE_T X%token EOFTOKEN ERRORTOKEN X X%type identifier X%type block type var option X X%% /* Beginning of rule section */ X Xxdtmrc : { init_structs(); } X statements X { free_structs(); } X ; Xstatements : /* Empty */ X | statements statement X ; Xstatement : ifstatement X | setstatement SEMIC_T X | define X ; Xifstatement : IF_T O_PAR_T expression C_PAR_T block X ; Xsetstatement : SET_T var ASSIGN_T identifier { switch ($2) { X case PATH_T: X set_path($4); X break; X case ICON_T: X set_icon($4, False); X break; X case DEFICON_T: X set_deficon($4); X break; X } X } X | SET_T CHECKPATH_T ASSIGN_T TRUE_T X { varframe->checkpath = True; } X | SET_T CHECKPATH_T ASSIGN_T FALSE_T X { varframe->checkpath = False; } X | SET_T IGNORE_T X { set_icon("", True);} X ; Xdefine : DEFINE_T identifier {newselection($2);} ASSIGN_T defineblock X ; Xblock : O_BRACE_T X statements {end_block();} X C_BRACE_T X ; Xdefineblock : O_BRACE_T descriptions C_BRACE_T X {current_selection->number = listindex;} X ; Xdescriptions : /* Empty */ X | descriptions description X ; Xdescription : O_BRACE_T X X { /* Allocate a new AppProgram */ SHAR_EOF echo "End of part 3" echo "File code/parser.y is continued in part 4" echo "4" > s2_seq_.tmp exit 0