argv@island.uu.net (Dan Heller) (07/18/89)
Submitted-by: Mark Moraes <moraes@ai.toronto.edu> Posting-number: Volume 4, Issue 57 Archive-name: xtroff/part12 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 12 (of 18)." # Contents: xtroff/XtStuff/Menu.c xtroff/devpsc/bdfdit.awk # Wrapped by moraes@neat.ai on Thu Jul 13 20:55:18 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'xtroff/XtStuff/Menu.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'xtroff/XtStuff/Menu.c'\" else echo shar: Extracting \"'xtroff/XtStuff/Menu.c'\" \(19435 characters\) sed "s/^X//" >'xtroff/XtStuff/Menu.c' <<'END_OF_FILE' X#ifndef lint Xstatic char rcsid[] = "$Header: Menu.c,v 1.3 88/06/01 02:22:16 moraes Exp $"; X#endif lint X X/* X * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. X * X * All Rights Reserved X * X * Permission to use, copy, modify, and distribute this software and its X * documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation, and that the name of Digital Equipment X * Corporation not be used in advertising or publicity pertaining to X * distribution of the software without specific, written prior permission. X * X * X * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING X * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL X * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR X * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, X * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, X * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS X * SOFTWARE. X */ X/* X * Menu.c - X * X * Author: Robert P. Shen X * Malcolm Forbes X * Digital Equipment Corporation X * ESG Systems Engineering X * X * Date: February 1, 1988 X */ X X#include <X11/IntrinsicP.h> X#include <X11/StringDefs.h> X#include <X11/XawMisc.h> X#include <X11/Xmu.h> X#include "MenuP.h" X#include "MenuItem.h" X#include "CheckItem.h" X#include <X11/Label.h> X#include <ctype.h> X X/**************************************************************** X * X * Menu Resources X * X ****************************************************************/ X Xstatic XtOrientation init_orient = XtorientVertical; Xstatic XtResource resources[] = { X {XtNxMargin, XtCHSpace, XtRInt, sizeof(int), X XtOffset(MenuWidget, menu.x_margin), XtRString, "0"}, X {XtNyMargin, XtCVSpace, XtRInt, sizeof(int), X XtOffset(MenuWidget, menu.y_margin), XtRString, "0"}, X {XtNx, XtCPosition, XtRPosition, sizeof(Position), X XtOffset(MenuWidget,core.x),XtRString, "800"}, X {XtNy, XtCPosition, XtRPosition, sizeof(Position), X XtOffset(MenuWidget,core.y),XtRString, "800"}, X {XtNborder,"MyBorder",XtRPixel,sizeof(Pixel), X XtOffset(MenuWidget,core.border_pixel),XtRString, "Black"}, X/* X {XtNborder,XtCBorderColor,XtRPixel,sizeof(Pixel), X XtOffset(MenuWidget,core.border_pixel),XtRString, "White"}, X*/ X {XtNmenuForeground, XtCForeground,XtRPixel, sizeof(Pixel), X XtOffset(MenuWidget,menu.menu_foreground_pixel),XtRString, "Black"}, X {XtNcheckForeground, XtCForeground,XtRPixel, sizeof(Pixel), X XtOffset(MenuWidget,menu.check_foreground_pixel),XtRString, "Black"}, X {XtNbackground, XtCBackground,XtRPixel, sizeof(Pixel), X XtOffset(MenuWidget,core.background_pixel),XtRString, "White"}, X {XtNborderWidth, XtCBorderWidth, XtRDimension, sizeof(Dimension), X XtOffset(MenuWidget,core.border_width),XtRString, "2"}, X {XtNorientation, XtCOrientation, XtROrientation, sizeof(XtOrientation), X XtOffset(MenuWidget,menu.orient),XtRString, "vertical"}, X {XtNmenuItemsList, "MenuItemsList", XtRPointer, sizeof(MenuItems), X XtOffset(MenuWidget,menu.items),XtRPointer, NULL}, X}; X/**************************************************************** X * X * Full class record constant X * X ****************************************************************/ X Xstatic void Initialize(); Xstatic void Realize(); Xstatic void Resize(); Xstatic Boolean SetValues(); Xstatic XtGeometryResult GeometryManager(); Xstatic void ChangeManaged(); Xstatic void ClassInitialize(); X XMenuClassRec menuClassRec = { X { X/* core_class fields */ X /* superclass */ (WidgetClass) &compositeClassRec, X /* class_name */ "Menu", X /* widget_size */ sizeof(MenuRec), X /* class_initialize */ ClassInitialize, X /* class_part_init */ NULL, X /* class_inited */ FALSE, X /* initialize */ Initialize, X /* initialize_hook */ NULL, X /* realize */ Realize, X /* actions */ NULL, X /* num_actions */ 0, X /* resources */ resources, X /* num_resources */ XtNumber(resources), X /* xrm_class */ NULLQUARK, X /* compress_motion */ TRUE, X /* compress_exposure */ TRUE, X /* compress_enterleave*/ TRUE, X /* visible_interest */ FALSE, X /* destroy */ NULL, X /* resize */ Resize, X /* expose */ NULL, X /* set_values */ SetValues, X /* set_values_hook */ NULL, X /* set_values_almost */ NULL, X /* get_values_hook */ NULL, X /* accept_focus */ NULL, X /* version */ XtVersion, X /* callback_private */ NULL, X /* tm_table */ NULL, X /* query_geometry */ NULL, X /* display_accelerator */ XtInheritDisplayAccelerator, X /* extension */ NULL X },{ X/* composite_class fields */ X /* geometry_manager */ GeometryManager, X /* change_managed */ ChangeManaged, X /* insert_child */ NULL, /* Inherit from superclass */ X /* delete_child */ NULL, /* Inherit from superclass */ X },{ X /* mumble */ 0 /* Make C compiler happy */ X } X}; X XWidgetClass menuWidgetClass = (WidgetClass)&menuClassRec; Xstatic Dimension no_resize_width, no_resize_height; X X X X Xstatic void CvtStringToOrientation(); X Xstatic XrmQuark XrmQEvertical; Xstatic XrmQuark XrmQEhorizontal; X/* ARGSUSED */ Xstatic void CvtStringToOrientation(args, pargs, fromVal, toVal) X XrmValuePtr args; X Cardinal pargs; X XrmValuePtr fromVal; X XrmValuePtr toVal; X{ X static XtOrientation e; X XrmQuark q; X char *s = (char *) fromVal->addr; X char lowerName[1000]; X int i; X X if (s == NULL) return; X X for (i=0; i<=strlen(s); i++) { X char c = s[i]; X lowerName[i] = isupper(c) ? (char) tolower(c) : c; X } X X q = XrmStringToQuark(lowerName); X X toVal->size = sizeof(XtOrientation); X toVal->addr = (caddr_t) &e; X X if (q == XrmQEvertical) { e = XtorientVertical; return; } X if (q == XrmQEhorizontal) { e = XtorientHorizontal; return; } X X toVal->size = 0; X toVal->addr = NULL; X}; X X/**************************************************************** X * X * Private Routines X * X ****************************************************************/ X Xstatic void ClassInitialize() X{ X CompositeWidgetClass superclass; X MenuWidgetClass myclass; X X myclass = (MenuWidgetClass) menuWidgetClass; X superclass = (CompositeWidgetClass) myclass->core_class.superclass; X X /* Inherit insert_child and delete_child from Composite */ X myclass->composite_class.insert_child = X superclass->composite_class.insert_child; X myclass->composite_class.delete_child = X superclass->composite_class.delete_child; X X XrmQEvertical = XrmStringToQuark("vertical"); X XrmQEhorizontal = XrmStringToQuark("horizontal"); X X XtAddConverter(XtRString, XtROrientation, CvtStringToOrientation, X NULL, (Cardinal)0 ); X} X X/* X * X * Do a layout, either actually assigning positions, or just calculating size. X * Returns TRUE on success; FALSE if it couldn't make things fit. X * X */ X Xstatic void horizontal_layout_plan(menuw, width, height, position) X MenuWidget menuw; X Dimension *width, *height; X{ X Widget kid; X Dimension w, h; X Dimension child_w, child_h, x, y, x_margin, y_margin; X int i; X X /* Menu width and height */ X w = x = child_w = x_margin = menuw->menu.x_margin; X h = y = child_h = y_margin = menuw->menu.y_margin; X X for (i = 0; i < menuw->composite.num_children; i++) { X kid = menuw->composite.children[i]; X if (kid->core.managed) { X /* Compute menu width */ X child_w = kid->core.width + 2*kid->core.border_width + x_margin; X AssignMax(child_h, kid->core.height); X w += child_w; X h = child_h + 2*kid->core.border_width+2* y_margin; X X if (position) { X X XtMoveWidget(kid, (int)x, (int)y); X XtResizeWidget(kid,kid->core.width,child_h,kid->core.border_width); X X } X x = w; X } /* if managed */ X } /* for */ X X *width = w; X *height = h; X X} X Xstatic void redeploy_kids(menuw) X MenuWidget menuw; X{ X Widget kid; X int i; X Dimension menu_width, kid_width; X Dimension x, y; X Dimension x_margin, y_margin; X X menu_width = menuw->core.width; X x = x_margin = menuw->menu.x_margin; X y = y_margin = menuw->menu.y_margin; X X for (i = 0; i <menuw->composite.num_children; i++) { X kid = menuw->composite.children[i]; X if (kid->core.managed) { X kid_width = menu_width - 2*kid->core.border_width - 2*x_margin; X/* X XtResizeWidget(kid,kid_width,kid->core.height,kid->core.border_width); X*/ X XtMoveWidget(kid, (int)x, (int)y); X y += kid->core.height + 2*kid->core.border_width + y_margin; X } X } X} X X X/* ARGSUSED */ Xstatic LayoutPlan(menuw, width, height, replyWidth, replyHeight, position) X MenuWidget menuw; X Dimension width, height; X Dimension *replyWidth, *replyHeight; /* RETURN */ X Boolean position; /* actually reposition the windows? */ X{ X Cardinal i; X Dimension w, h; /* Width and height needed for menu panel */ X Dimension x, y; X Dimension child_w, child_h; X Dimension x_margin, y_margin; /* Local copy of menuw->menu.x_margin */ X Dimension hlayout_width, hlayout_height; X Widget kid; /* Current menu */ X X /* Menu width and height */ X w = x = x_margin = menuw->menu.x_margin; X h = y = y_margin = menuw->menu.y_margin; X X for (i = 0; i < menuw->composite.num_children; i++) { X kid = menuw->composite.children[i]; X if (kid->core.managed) { X /* Compute menu width */ X child_w = kid->core.width + 2*kid->core.border_width + 2*x_margin; X child_h = kid->core.height + 2*kid->core.border_width + y_margin; X AssignMax(w, child_w); X h += child_h + y_margin; X X if (position) { X X XtMoveWidget(kid, (int)x, (int)y); X XtResizeWidget(kid,(width-2*kid->core.border_width-2*x_margin), X kid->core.height,kid->core.border_width); X X } X y = h; X } /* if managed */ X } /* for */ X X h += y_margin; X X *replyWidth = Max(w, 1); X *replyHeight = Max(h, 1); X} X X/* X * X * Calculate preferred size, given constraining box X * X */ X Xstatic Boolean PreferredSize(menuw, width, height, replyWidth, replyHeight) X MenuWidget menuw; X Dimension width, height; X Dimension *replyWidth, *replyHeight; X{ X LayoutPlan(menuw, width, height, replyWidth, replyHeight, FALSE); X return ((*replyWidth <= width) && (*replyHeight <= height)); X} X X/* X * X * Actually layout the menu panel X * X */ X Xstatic void Resize(menuw) X MenuWidget menuw; X{ X Widget kid; X Dimension junk, width, height; X X if (menuw->menu.orient == XtorientVertical) { X LayoutPlan((MenuWidget)menuw, menuw->core.width, menuw->core.height, X &junk, &junk, TRUE); X } X else if (menuw->menu.orient == XtorientHorizontal) { X horizontal_layout_plan (menuw, &width, &height, TRUE); X } X/* X redeploy_kids(w); X*/ X} /* Resize */ X X/* X * X * Try to do a new layout within the current width and height; X * if that fails try to do it within the box returned by PreferredSize. X * X * TryNewLayout just says if it's possible, and doesn't actually move the kids X */ X Xstatic Boolean TryNewLayout(menuw) X MenuWidget menuw; X{ X Dimension width, height, junk_w, junk_h; X X if (!PreferredSize(menuw, menuw->core.width, menuw->core.height, &width, &height)) X (void) PreferredSize(menuw, width, height, &width, &height); X X if ((menuw->core.width == width) && (menuw->core.height == height)) { X /* Same size */ X return (TRUE); X } X X /* let's see if our parent will go for a new size. */ X switch (XtMakeResizeRequest((Widget) menuw, width, height, &width, &height)) { X X case XtGeometryYes: X return (TRUE); X X case XtGeometryNo: X if ((width <= menuw->core.width) && (height <= menuw->core.height)) X return (TRUE); X else X return (FALSE); X X case XtGeometryAlmost: X if (! PreferredSize(menuw, width, height, &junk_w, &junk_h)) X return (FALSE); X (void) XtMakeResizeRequest((Widget) menuw, width, height, X &width, &height); X return (TRUE); X } X} X X/* X * X * Geometry Manager X * X */ X X/*ARGSUSED*/ Xstatic XtGeometryResult GeometryManager(w, request, reply) X Widget w; X XtWidgetGeometry *request; X XtWidgetGeometry *reply; /* RETURN */ X X{ X Dimension width, height, borderWidth; X MenuWidget menuw; X X /* Position request always denied */ X if (request->request_mode & (CWX | CWY)) X return (XtGeometryNo); X X /* Size changes must see if the new size can be accomodated */ X if (request->request_mode & (CWWidth | CWHeight | CWBorderWidth)) { X X /* Make all three fields in the request valid */ X if ((request->request_mode & CWWidth) == 0) X request->width = w->core.width; X if ((request->request_mode & CWHeight) == 0) X request->height = w->core.height; X if ((request->request_mode & CWBorderWidth) == 0) X request->border_width = w->core.border_width; X X /* Save current size and set to new size */ X width = w->core.width; X height = w->core.height; X borderWidth = w->core.border_width; X w->core.width = request->width; X w->core.height = request->height; X w->core.border_width = request->border_width; X X /* Decide if new layout works: (1) new menu is smaller, X (2) new menu fits in existing Menu, (3) Menu can be X expanded to allow new menu to fit */ X X menuw = (MenuWidget) w->core.parent; X X/* whenever a child changes his geometry, we attempt to X * change ours to be the minimum enclosing size... X if (((request->width + request->border_width <= width + borderWidth) && X (request->height + request->border_width <= height + borderWidth)) X || PreferredSize(menuw, menuw->core.width, menuw->core.height, &junk, &junk) X || TryNewLayout(menuw)) { X */ X if (TryNewLayout(menuw)) { X /* Fits in existing or new space, relayout */ X Resize((Widget)menuw); X return (XtGeometryYes); X } else { X /* Cannot satisfy request, change back to original geometry */ X w->core.width = width; X w->core.height = height; X w->core.border_width = borderWidth; X return (XtGeometryNo); X } X }; /* if any size changes requested */ X X /* Any stacking changes don't make a difference, so allow if that's all */ X return (XtGeometryYes); X} X Xstatic void ChangeManaged(w) X MenuWidget w; X{ X Dimension hlayout_width, h_layout_height, kid_height; X Dimension x_margin, y_margin; X Dimension width, height; X X if (w->menu.orient == XtorientVertical) X { X X (void) TryNewLayout((MenuWidget)w); X X Resize(w); X/* X redeploy_kids(w); X*/ X } X else if (w->menu.orient == XtorientHorizontal) X { X horizontal_layout_plan (w, &width, &height, FALSE); X switch (XtMakeResizeRequest((Widget)w, width, height, &width, &height)) X { X case XtGeometryYes: break; X case XtGeometryNo: break; X case XtGeometryAlmost: break; X } X horizontal_layout_plan (w, &width, &height, TRUE); X } X} X X/* ARGSUSED */ Xstatic void Initialize(request, new) X Widget request, new; X { X MenuWidget newmenuw = (MenuWidget)new; X Widget cmd; X MenuItems items; X int i, j; X/* char str[32]; */ X/* static char check_pad[] = " "; */ X/* static char space_pad[] = " "; */ X X static Arg labelArgs[] = { X {XtNbackground, (XtArgVal) NULL}, X {XtNforeground, (XtArgVal) NULL} X }; X static Arg menuArgs[] = { X {XtNbackground, (XtArgVal) NULL}, X {XtNforeground, (XtArgVal) NULL}, X {XtNborderWidth, (XtArgVal) 0}, X {XtNcallback, (XtArgVal) NULL} X }; X static Arg checkArgs[] = { X {XtNbackground, (XtArgVal) NULL}, X {XtNforeground, (XtArgVal) NULL}, X {XtNborderWidth, (XtArgVal) 0}, X {XtNcheckState, (XtArgVal) TRUE}, X {XtNcallback, (XtArgVal) NULL} X }; X static Arg uncheckArgs[] = { X {XtNbackground, (XtArgVal) NULL}, X {XtNforeground, (XtArgVal) NULL}, X {XtNborderWidth, (XtArgVal) 0}, X {XtNcheckState, (XtArgVal) FALSE}, X {XtNcallback, (XtArgVal) NULL} X }; X X X/* ||| What are consequences of letting height, width be 0? If okay, then X Initialize can be NULL */ X X if (newmenuw->core.width == 0) X newmenuw->core.width = ((newmenuw->menu.x_margin != 0) X ? newmenuw->menu.x_margin : 1); /* MOD */ X if (newmenuw->core.height == 0) X newmenuw->core.height = ((newmenuw->menu.y_margin != 0) X ? newmenuw->menu.y_margin : 1); /* MOD */ X X XtSetArg(labelArgs[0], XtNbackground,newmenuw->menu.menu_foreground_pixel); X XtSetArg(labelArgs[1], XtNforeground,newmenuw->core.background_pixel); X XtSetArg(menuArgs[0], XtNbackground,newmenuw->core.background_pixel); X XtSetArg(menuArgs[1],XtNforeground,newmenuw->menu.menu_foreground_pixel); X XtSetArg(checkArgs[0], XtNbackground, newmenuw->core.background_pixel); X XtSetArg(checkArgs[1],XtNforeground,newmenuw->menu.check_foreground_pixel); X XtSetArg(uncheckArgs[0], XtNbackground, newmenuw->core.background_pixel); X XtSetArg(uncheckArgs[1],XtNforeground,newmenuw->menu.check_foreground_pixel); X cmd = XtCreateManagedWidget (newmenuw->core.name, X labelWidgetClass, new, X labelArgs, XtNumber(labelArgs)); X X if( newmenuw->menu.items ) X { X XtCallbackList temprec; X X items = newmenuw->menu.items; X for (; items->proc; items++) { /* at least proc must exist! */ X temprec = (XtCallbackList)XtMalloc(sizeof(XtCallbackRec)*2); X temprec->callback = items->proc; X temprec->closure = items->closure; X (temprec+1)->callback = NULL; X (temprec+1)->closure = NULL; X if (items->flags & (XtitemCheckable | XtitemIsChecked)) { X XtSetArg(checkArgs[4], XtNcallback, temprec); X XtSetArg(uncheckArgs[4], XtNcallback, temprec); X cmd = XtCreateManagedWidget (items->text, X checkitemWidgetClass, new, X (items->flags & XtitemIsChecked ? X (ArgList) checkArgs : X (ArgList) uncheckArgs), X (items->flags & XtitemIsChecked ? X XtNumber(checkArgs) : X XtNumber(uncheckArgs))); X X } X else { X XtSetArg(menuArgs[3], XtNcallback, temprec); X cmd = XtCreateManagedWidget (items->text, X menuitemWidgetClass, new, X (ArgList) menuArgs, X XtNumber(menuArgs)); X } X XtSetSensitive (cmd, !(items->flags & XtitemUnselectable)); X } X } X} /* Initialize */ X X/* ||| Should Realize just return a modified mask and attributes? Or will some X of the other parameters change from class to class? */ Xstatic void Realize(w, valueMask, attributes) X X register Widget w; X Mask *valueMask; X XSetWindowAttributes *attributes; X{ X MenuWidget newmenuw = (MenuWidget)w; X X attributes->bit_gravity = NorthWestGravity; X *valueMask |= CWBitGravity; X X XtCreateWindow( w, (unsigned)InputOutput, (Visual *)CopyFromParent, X *valueMask, attributes); X} /* Realize */ X X/* X * X * Set Values X * X */ X X/* ARGSUSED */ Xstatic Boolean SetValues (current, request, new, last) X Widget current, request, new; X Boolean last; X{ X /* ||| Old code completely bogus, need background, etc. then relayout */ X X /*XtSetValuesGeometryRequest( current, new, (XtWidgetGeometry *)NULL );*/ X X /* ||| should handle XtGeometryAlmost */ X X return (FALSE); X} END_OF_FILE if test 19435 -ne `wc -c <'xtroff/XtStuff/Menu.c'`; then echo shar: \"'xtroff/XtStuff/Menu.c'\" unpacked with wrong size! fi # end of 'xtroff/XtStuff/Menu.c' fi if test -f 'xtroff/devpsc/bdfdit.awk' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'xtroff/devpsc/bdfdit.awk'\" else echo shar: Extracting \"'xtroff/devpsc/bdfdit.awk'\" \(17215 characters\) sed "s/^X//" >'xtroff/devpsc/bdfdit.awk' <<'END_OF_FILE' X# devpsc/bdfdit.awk X# X# Copyright (c) 1988 Cray Research, Inc. All Rights Reserved. X# X# This awk(1) program serves two purposes. It helps convert X# X11 bdf font metrics files (bdf files) into ditroff X# font description files (as input to makedev), and it X# helps create the ditroff device description file (DESC) for X# bdf fonts. X# X XBEGIN { X SCALE = 5.0 # font width scale factor to X # achieve proper dynamic range X # (ditroff widths are <= 256) X X # file names for pieces. These are cat'ed together. X header = "temp.header" # comments and ligature list X spaces = "temp.spaces" # space widths and "charset" header X trailer = "temp.trailer"# actual character data X aux = "temp.aux" X X isspecial = 0 X istext = 1 X X# ligatures X X ligature["ff"] = "ff" X ligature["ffi"] = "Fi" X ligature["ffl"] = "Fl" X ligature["fi"] = "fi" X ligature["fl"] = "fl" X X# ditmap is a mapping from non-ascii bdf file character names X# (plus a few special ones) to DITROFF \( special codes. X# Note that some chars have more than one code (separated by spaces). X X ditmap[".ditspace"] = "\\^ \\| \\&" X ditmap["AE"] = "AE" X ditmap["Alpha"] = "*A" X ditmap["Beta"] = "*B" X ditmap["Chi"] = "*X" X ditmap["Delta"] = "*D" X ditmap["Epsilon"] = "*E" X ditmap["Eta"] = "*Y" X ditmap["Gamma"] = "*G" X ditmap["Iota"] = "*I" X ditmap["Kappa"] = "*K" X ditmap["Lambda"] = "*L" X ditmap["Lslash"] = "PL" X ditmap["Mu"] = "*M" X ditmap["Nu"] = "*N" X ditmap["OE"] = "OE" X ditmap["Omega"] = "*W" X ditmap["Omicron"] = "*O" X ditmap["Oslash"] = "O/" X ditmap["Phi"] = "*F" X ditmap["Pi"] = "*P" X ditmap["Psi"] = "*Q" X ditmap["Rho"] = "*R" X ditmap["Sigma"] = "*S" X ditmap["Tau"] = "*T" X ditmap["Theta"] = "*H" X ditmap["Upsilon"] = "*U" X ditmap["Xi"] = "*C" X ditmap["Zeta"] = "*Z" X ditmap["acute"] = "aa \\'" X ditmap["ae"] = "ae" X ditmap["aleph"] = "al" X ditmap["alpha"] = "*a" X ditmap["angle"] = "ag" X ditmap["angleleft"] = "l< L<" X ditmap["angleright"] = "r> R>" X ditmap["apple"] = "AL" X ditmap["approxequal"] = "~=" X ditmap["arrowboth"] = "<>" X ditmap["arrowdbldown"] = "d=" X ditmap["arrowdblboth"] = "io" X ditmap["arrowdblleft"] = "<: lh" # left double arrow (& hand) X ditmap["arrowdblright"] = ":> im rh" # right double arrow (& hand) X ditmap["arrowdblup"] = "u=" X ditmap["arrowdown"] = "da" X ditmap["arrowleft"] = "<-" X ditmap["arrowright"] = "->" X ditmap["arrowup"] = "ua" X ditmap["asciicircum"] = "a^" X ditmap["asciitilde"] = "a~" X ditmap["asteriskmath"] = "**" X ditmap["bar"] = "or" X ditmap["beta"] = "*b" X# ditmap["br"] = "br" # box rule X# ditmap["bu"] = "bu" # bullet X# ditmap["bv"] = "bv" # bold vertical X# ditmap["bx"] = "bx" # box X ditmap["breve"] = "be" X ditmap["bullet"] = "bu" X ditmap["caron"] = "hc" X ditmap["cedilla"] = "cd" X ditmap["cent"] = "ct" X ditmap["chi"] = "*x" X ditmap["circumflex"] = "^" X ditmap["carriagereturn"] = "cr" X# ditmap["ci"] = "ci" # circle X ditmap["circlemultiply"] = "ax" X ditmap["circleplus"] = "a+" X ditmap["club"] = "Cc" X ditmap["congruent"] = "=~" X ditmap["copyrightserif"] = "co" X ditmap["dagger"] = "dg" X ditmap["daggerdbl"] = "dd" X ditmap["degree"] = "de" X ditmap["delta"] = "*d" X ditmap["diamond"] = "Cd" X ditmap["dieresis"] = "um .." # umlaut X ditmap["dotaccent"] = "dt" X ditmap["dotlessi"] = "ui" X ditmap["divide"] = "di" X ditmap["dotmath"] = "m." X ditmap["element"] = "mo" X ditmap["emdash"] = "em" X ditmap["emptyset"] = "es" X ditmap["endash"] = "en" X ditmap["epsilon"] = "*e" X ditmap["equal"] = "eq" ; mathonly["eq"] = "equal" X ditmap["equivalence"] = "==" X ditmap["eta"] = "*y" X ditmap["exclamdown"] = "!! I!" X ditmap["existential"] = "te" X ditmap["ff"] = "ff" X ditmap["ffi"] = "Fi" X ditmap["ffl"] = "Fl" X ditmap["fi"] = "fi" X ditmap["fl"] = "fl" X ditmap["florin"] = "$D" X ditmap["germandbls"] = "ss" X ditmap["gamma"] = "*g" X ditmap["gradient"] = "gr" X ditmap["grave"] = "ga \\`" X ditmap["greaterequal"] = ">=" X ditmap["guillemotleft"] = "d<" X ditmap["guillemotright"] = "d>" X ditmap["guillmotleft"] = "d<" X ditmap["guillmotright"] = "d>" X ditmap["guilsinglleft"] = "l<" X ditmap["guilsinglright"] = "r>" X ditmap["heart"] = "bs Ch" X ditmap["hungarumlaut"] = "''" X ditmap["hyphen"] = "hy" X ditmap["infinity"] = "if" X ditmap["integral"] = "is" X# ditmap["lb"] = "lb" # left bot curly X# ditmap["lc"] = "lc" # left ceil X# ditmap["lf"] = "lf" # left floor X# ditmap["lk"] = "lk" # left center curly X ditmap["logicaland"] = "an la" X ditmap["logicalor"] = "lo" X ditmap["lozenge"] = "dm" X ditmap["intersection"] = "ca" X ditmap["iota"] = "*i" X ditmap["kappa"] = "*k" X ditmap["lambda"] = "*l" X ditmap["lessequal"] = "<=" X ditmap["logicalnot"] = "no" X ditmap["lslash"] = "Pl" X ditmap["onequarter"] = "14" X ditmap["onehalf"] = "12" X ditmap["threequarters"] = "34" X ditmap["macron"] = "mc ma" X ditmap["minus"] = "\\- mi" ; mathonly["mi"] = "minus" X# ditmap["minus"] = "\\- mi" X ditmap["minute"] = "fm mt" X ditmap["mu"] = "*m" X ditmap["multiply"] = "mu" X ditmap["notelement"] = "!m" X ditmap["notsubset"] = "!s" X ditmap["notequal"] = "!=" X ditmap["nu"] = "*n" X ditmap["ogonek"] = "og" X ditmap["oe"] = "oe" X ditmap["omega"] = "*w" X ditmap["omicron"] = "*o" X ditmap["oslash"] = "o/" X ditmap["onehalf"] = "12" X ditmap["onequarter"] = "14" X ditmap["paragraph"] = "pp" X ditmap["partialdiff"] = "pd" X ditmap["phi"] = "*f" X ditmap["pi"] = "*p" X ditmap["plus"] = "pl" ; mathonly["pl"] = "plus" X ditmap["plusminus"] = "+-" X ditmap["propersubset"] = "sb" X ditmap["propersuperset"] = "sp" X ditmap["proportional"] = "pt" X ditmap["psi"] = "*q" X ditmap["questiondown"] = "?? I?" X ditmap["quotedblbase"] = "bq" X ditmap["quotedblleft"] = "lq oq" X ditmap["quotedblright"] = "rq cq" X ditmap["quotesingle"] = "n'" X ditmap["radical"] = "sr" X ditmap["radicalex"] = "rn" X ditmap["reflexsubset"] = "ib" X ditmap["reflexsuperset"] = "ip" X ditmap["registerserif"] = "rg" X ditmap["rho"] = "*r" X ditmap["ring"] = "ri" X ditmap["second"] = "sd" X ditmap["section"] = "sc" X ditmap["sigma"] = "*s" X ditmap["sigma1"] = "ts" X ditmap["similar"] = "ap" X ditmap["slash"] = "sl" X ditmap["spade"] = "Cs" X ditmap["sterling"] = "ps po" X ditmap["suchthat"] = "cm" X ditmap["tau"] = "*t" X ditmap["therefore"] = "tf" X ditmap["theta"] = "*h" X ditmap["tilde"] = "~" X ditmap["trademarkserif"] = "tm" X ditmap["underscore"] = "ul \\_" X# ditmap["ul"] = "ul" # under rule X# ditmap["underscore"] = "\\_" X# ditmap["vr"] = "vr" # vertical rule X ditmap["union"] = "cu" X ditmap["universal"] = "fa" X ditmap["upsilon"] = "*u" X ditmap["xi"] = "*c" X ditmap["yen"] = "yn" X ditmap["yen"] = "yi yn $J" X ditmap["zeta"] = "*z" X ditmap["circle"] = "ci" X ditmap["square"] = "sq" X X# Additional troff characters. The mod to add these special X# characters to the bdf character set is needed. X X ditmap["box"] = "bx" X ditmap["boxrule"] = "br" X ditmap["rule"] = "ru" X ditmap["boldvertical"] = "bv" X ditmap["lefttopcurly"] = "lt" X ditmap["leftbotcurly"] = "lb" X ditmap["righttopcurly"] = "rt" X ditmap["rightbotcurly"] = "rb" X# ditmap["lt"] = "lt" # left top curly X# ditmap["ob"] = "ob" # outline bullet X# ditmap["rb"] = "rb" # right bot curly X# ditmap["rc"] = "rc" # right ceil X# ditmap["rf"] = "rf" # right floor X# ditmap["rk"] = "rk" # right center curly X# ditmap["rn"] = "rn" # root extender X# ditmap["rt"] = "rt" # rith top curly X# ditmap["ru"] = "ru" # rule X ditmap["leftmidcurly"] = "lk" X ditmap["rightmidcurly"] = "rk" X ditmap["leftfloor"] = "lf" X ditmap["rightfloor"] = "rf" X ditmap["leftceiling"] = "lc" X ditmap["rightceiling"] = "rc" X ditmap["outlinebullet"] = "ob" X ditmap["perpendicular"] = "bt" X ditmap["perthousand"] = "pm" X X# Characters in the ISO Latan 1 set X# Assignment of troff characters made by D. A. Cahlander 89/01/09. X# Disabled since the DESC.out file can only describe 256-character fonts. X X# ditmap["Aacute"] = "A'" X# ditmap["Acircumflex"] = "A^" X ditmap["Adieresis"] = "A:" X# ditmap["Agrave"] = "A`" X# ditmap["Aring"] = "Ao" X# ditmap["Atilde"] = "A~" X# ditmap["Ccedilla"] = "Cc" X# ditmap["Eacute"] = "E'" X# ditmap["Ecircumflex"] = "E^" X# ditmap["Edieresis"] = "E." X# ditmap["Egrave"] = "E`" X# ditmap["Iacute"] = "I'" X# ditmap["Icircumflex"] = "I^" X# ditmap["Idieresis"] = "I." X# ditmap["Igrave"] = "I`" X# ditmap["Ntilde"] = "N~" X# ditmap["Oacute"] = "O'" X# ditmap["Ocircumflex"] = "O^" X ditmap["Odieresis"] = "O:" X# ditmap["Ograve"] = "O`" X# ditmap["Otilde"] = "O~" X# ditmap["Scaron"] = "Sc" X# ditmap["Uacute"] = "U'" X# ditmap["Ucircumflex"] = "U^" X ditmap["Udieresis"] = "U:" X# ditmap["Ugrave"] = "U`" X# ditmap["Ydieresis"] = "Y." X# ditmap["Zcaron"] = "Zc" X# ditmap["aacute"] = "a'" X# ditmap["acircumflex"] = "a^" X ditmap["adieresis"] = "a:" X# ditmap["agrave"] = "a`" X# ditmap["aring"] = "ao" X# ditmap["atilde"] = "a~" X# ditmap["ccedilla"] = "cc" X# ditmap["eacute"] = "e'" X# ditmap["ecircumflex"] = "e^" X# ditmap["edieresis"] = "e." X# ditmap["egrave"] = "e`" X# ditmap["iacute"] = "i'" X# ditmap["icircumflex"] = "i^" X# ditmap["idieresis"] = "i." X# ditmap["igrave"] = "i`" X# ditmap["ntilde"] = "n~" X# ditmap["oacute"] = "o'" X# ditmap["ocircumflex"] = "o^" X ditmap["odieresis"] = "o:" X# ditmap["ograve"] = "o`" X# ditmap["otilde"] = "o~" X# ditmap["scaron"] = "sc" X# ditmap["uacute"] = "u'" X# ditmap["ucircumflex"] = "u^" X ditmap["udieresis"] = "u:" X# ditmap["ugrave"] = "u`" X# ditmap["ydieresis"] = "y." X# ditmap["zcaron"] = "zc" X X# Characters that have subroutine proceedures that are used X# to draw them with psdit. X X psdit["onequarter"] = "14" X psdit["onehalf"] = "12" X psdit["threequarters"] = "34" X X psdit["square"] = 1 X psdit["box"] = 1 X psdit["circle"] = 1 X psdit["boxrule"] = 1 X psdit["boldvertical"] = 1 X psdit["rule"] = 1 X X psdit["lefttopcurly"] = 1 X psdit["leftbotcurly"] = 1 X psdit["righttopcurly"] = 1 X psdit["rightbotcurly"] = 1 X psdit["leftmidcurly"] = 1 X psdit["rightmidcurly"] = 1 X psdit["leftfloor"] = 1 X psdit["rightfloor"] = 1 X psdit["leftceiling"] = 1 X psdit["rightceiling"] = 1 X X# No mapping exists for these characters. X X ditmap[".noPS1"] = "ma fe" # male female X ditmap[".noPS2"] = "~~" # almost exactly equals X ditmap[".noPS3"] = ">< <> !> !<" # funny relations X ditmap[".noPS4"] = "uj" # dotless (undotted) j X ditmap[".noPS5"] = "cp" # cap (upside down breve) X ditmap[".noPS6"] = "-+" # - over + ? X ditmap[".noPS7"] = "vr" # vertical rule X X# ditmap[".noPS90"] = "wi tp sg sa rd ra os =p =. 4d" X# ditmap[".noPS91"] = "le ld hi gp ge el eg dc" X# ditmap[".noPS92"] = "cy bc b9 b0 as an ai \\` \\_ \\'" X# ditmap[".noPS93"] = "UT Sl SQ RC RB LE GE EL EG DT CB *V" X X# L. and l. are used for line drawing on systems without graphics X X# ascii is a mapping which contains the troff character names X# for the printable ascii characters. The values are the ascii X# character codes but are not used in this program. A test is X# made to see if a specific name is in the table. X X ascii["space"] = 32 X ascii["exclam"] = 33 X ascii["quotedbl"] = 34 X ascii["numbersign"] = 35 X ascii["dollar"] = 36 X ascii["percent"] = 37 X ascii["ampersand"] = 38 X ascii["quoteright"] = 39 X ascii["parenleft"] = 40 X ascii["parenright"] = 41 X ascii["asterisk"] = 42 X ascii["plus"] = 43 X ascii["comma"] = 44 X ascii["hyphen"] = 45 X# ascii["minus"] = 45 X ascii["period"] = 46 X ascii["slash"] = 47 X ascii["zero"] = 48 X ascii["one"] = 49 X ascii["two"] = 50 X ascii["three"] = 51 X ascii["four"] = 52 X ascii["five"] = 53 X ascii["six"] = 54 X ascii["seven"] = 55 X ascii["eight"] = 56 X ascii["nine"] = 57 X ascii["colon"] = 58 X ascii["semicolon"] = 59 X ascii["less"] = 60 X ascii["equal"] = 61 X ascii["greater"] = 62 X ascii["question"] = 63 X ascii["at"] = 64 X ascii["A"] = 65 X ascii["B"] = 66 X ascii["C"] = 67 X ascii["D"] = 68 X ascii["E"] = 69 X ascii["F"] = 70 X ascii["G"] = 71 X ascii["H"] = 72 X ascii["I"] = 73 X ascii["J"] = 74 X ascii["K"] = 75 X ascii["L"] = 76 X ascii["M"] = 77 X ascii["N"] = 78 X ascii["O"] = 79 X ascii["P"] = 80 X ascii["Q"] = 81 X ascii["R"] = 82 X ascii["S"] = 83 X ascii["T"] = 84 X ascii["U"] = 85 X ascii["V"] = 86 X ascii["W"] = 87 X ascii["X"] = 88 X ascii["Y"] = 89 X ascii["Z"] = 90 X ascii["bracketleft"] = 91 X ascii["backslash"] = 92 X ascii["bracketright"] = 93 X# ascii["asciicircum"] = 94 # 195 see ditmap, should be ascii! X ascii["underscore"] = 95 X ascii["quoteleft"] = 96 X ascii["a"] = 97 X ascii["b"] = 98 X ascii["c"] = 99 X ascii["d"] = 100 X ascii["e"] = 101 X ascii["f"] = 102 X ascii["g"] = 103 X ascii["h"] = 104 X ascii["i"] = 105 X ascii["j"] = 106 X ascii["k"] = 107 X ascii["l"] = 108 X ascii["m"] = 109 X ascii["n"] = 110 X ascii["o"] = 111 X ascii["p"] = 112 X ascii["q"] = 113 X ascii["r"] = 114 X ascii["s"] = 115 X ascii["t"] = 116 X ascii["u"] = 117 X ascii["v"] = 118 X ascii["w"] = 119 X ascii["x"] = 120 X ascii["y"] = 121 X ascii["z"] = 122 X ascii["braceleft"] = 123 X ascii["bar"] = 124 X ascii["braceright"] = 125 X# ascii["asciitilde"] = 126 # 196 see ditmap, should be ascii ! X X ditmap[".proctext"] = "18 38 58 78 13 23" X X # character-code and width info for synthetic characters X X cc = 132 # manufacture unique character codes X proc["18"] = cc++ " 0 833" # 1/8 X proc["38"] = cc++ " 0 833" # 3/8 X proc["58"] = cc++ " 0 833" # 5/8 X proc["78"] = cc++ " 0 833" # 7/8 X proc["13"] = cc++ " 0 833" # 1/3 X proc["23"] = cc++ " 0 833" # 2/3 X} # BEGIN X X# The following dumps the character set defined above to standard X# output. It is triggared if the input file is named "DESC". X# This info is used in the device description DESC to describe the X# global (over all fonts) character set of the device. X# Note that this dumps the information in random order (awk's X# enumeration of ditmap), but troff (makedev) shouldn't care. This X# is the only place the resolution, font sizes, unitwidth, etc. are X# wired. If they get too large, troff will explode, so change them X# at your own risk. X XFILENAME == "DESC" { X SIZES = "6 8 10 12 14 18 24" X RES = 72 * 8 X print "sizes", SIZES, 0 X print "res", RES X print "hor 1" X print "vert 1" X print "unitwidth", int((1000.0 / SCALE) * (72.0 / RES)) X print "charset" X outstr = "" X for (i in ditmap) { X n = ditmap[i] X if ((length(outstr)+length(n)) > 60) { X print outstr X outstr = n " " X } else { X outstr = outstr n " " X } X } X if (length(outstr) != 0) print outstr X exit X} X X# Define the actions on the fields in the BDF format. X# Note that 3 files are generated which are cat'ed together X# outside this program. X X# handle header information X X/^STARTFONT/ { X print "#", $0 > header X next X} X X/^COMMENT Begin LogicalFontDescription/ {next} X/^COMMENT END LogicalFontDescription/ {next} X/^COMMENT .* end of inserted font properties/ {next} X X/^COMMENT/ { X $1 = "# " X print > header X next X} X X/^FONT / { X print "# " $2 > header X split($0, arg, ".") X print "name", arg[2] > header X if (arg[2] == "S") { X print "special" > header X isspecial = 1 X istext = 0 X } X next X} X X/^X_HEIGHT / { X ascender = $2 X next X} X X/^ENDPROPERTIES/ { next } X X# set character name X X/^STARTCHAR .*/ { X charname = $2 X next X} X X# set encoding X X/^ENCODING .*/ { X charcode = $2 X next X} X X/^SWIDTH [0-9]* [0-9]*/ { X width = $2 X next X} X X/^DWIDTH [0-9]* [0-9]*/ { X dwidth = $2 X next X} X X# 1 2 3 4 5 X/^BBX [-0-9]* [-0-9]* [-0-9]* [-0-9]*/ { X if (charcode == -1) # unused character X next X X bblly = $5 X bbury = $3 + $5 X X# ignore out of range characters X if (charcode >= 256) X next X X# compute width X scaledwidth = int(0.5 + (width / SCALE)) X if ((scaledwidth < 0) || (scaledwidth > 256)) { X print "ERROR! Width out of range!" X exit 2 X } X X# handle space X if (charname == "space") { # special char widths X spacewidth = scaledwidth X printf "ligatures " > header X printf "spacewidth %d\n", spacewidth > spaces X print "charset" > spaces X printf "\\|\t%d 0 000\t1/6 em space\n", int (0.5 + (1000.0/6.0) / SCALE) > trailer X printf "\\^\t%d 0 000\t1/12 em space\n", int (0.5 + (1000.0/12.0) / SCALE) > trailer X printf "\\&\t00 0 000\tno space\n" > trailer X next X } X X# parse ligatures X if (length(ligature[charname])) X printf "%s ", charname > header X X# ascender/descender flags X ad = 0 X if (bblly < 0) ad += 1 X if (bbury > ascender) ad += 2 X X# dump the description line X if (length(ascii[charname]) > 0) { X printf "%c\t%d %d 0%2o\t%s\n", charcode, scaledwidth, ad, charcode, charname > trailer X # look for ditmap synonyms X if (length(ditmap[charname]) > 0) { X n = split(ditmap[charname],others," ") X for (i = 1; i <= n; i++) { X oth = others[i]; X if ((length(mathonly[oth]) > 0) && (isspecial != 1)) continue; X printf "%s\t\"\n", others[i] > trailer X } X } X } else if (length(ditmap[charname]) > 0) { X # not a printable ascii character X n = split(ditmap[charname],others," ") X printf "%s\t%d %d 0%o\t%s\n", others[1], scaledwidth, ad, charcode, charname > trailer X for (i = 2; i <= n; i++) { X printf "%s\t\"\n", others[i] > trailer X } X } X X# dump a line for PS specific actual width/hack table X X specialcode = 0 X if (length(psdit[charname]) != 0) X specialcode = 1 X printf "%d %d %d\n", charcode, width, specialcode > aux X next X} X XEND { X printf "0\n" > header X X # dump the "fudged" characters. X for (i in proc) { X p = proc[i] X split(p,vals," ") X scaledwidth = int(0.5 + (vals[3] / SCALE)) X if (((istext == 1) && (index(ditmap[".proctext"],i) != 0)) || ((isspecial == 1) && (index(ditmap[".procspecial"],i) != 0))) { X printf "%s\t%d %d 0%o\tfudgedproc!\n", i, scaledwidth, vals[2], vals[1] > trailer X X printf "%d %d %d\n", vals[1], vals[3], 1 > aux X } X } X exit X X} END_OF_FILE if test 17215 -ne `wc -c <'xtroff/devpsc/bdfdit.awk'`; then echo shar: \"'xtroff/devpsc/bdfdit.awk'\" unpacked with wrong size! fi # end of 'xtroff/devpsc/bdfdit.awk' fi echo shar: End of archive 12 \(of 18\). cp /dev/null ark12isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 18 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0