xdiary 2/5 (X based calendar and diary)

Jason Baietto jason at gcx1.ssd.csd.harris.com
Thu Dec 13 10:27:08 AEST 1990


#! /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 2 (of 5)."
# Contents:  Calendar.doc CalendarP.h Date.c Makefile StrInRect.c
#   main.h
# Wrapped by jason at hcx2 on Thu Dec  6 12:49:21 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Calendar.doc' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Calendar.doc'\"
else
echo shar: Extracting \"'Calendar.doc'\" \(14281 characters\)
sed "s/^X//" >'Calendar.doc' <<'END_OF_FILE'
X.NH 1
XCalendar Widget
X.XS
X	Calendar Widget
X.XE
X.Ds 0
X.TA 2.0i
X.ta 2.0i
X.sp
XApplication Header file	"Calendar.h"
XClass Header file	"CalendarP.h"
XClass		CalendarWidgetClass
XClass Name	Calendar
XSuperclass	Core
X.sp
X.De
X.LP
XThe Calendar Widget is a widget that displays a one month calendar for a
Xspecified date.  It is designed to be used in applications that need to be
Xdriven by calendar input, as well as applications that simply want to display
Xcalendars.
X.NH 2
XResources
X.LP
XWhen creating a Calendar widget instance, the following resources are
Xretrieved from the argument list or from the resource database:
X.LP
X.ps 9
X.nr PS 9
X.vs 11
X.nr VS 11
X.TS H
Xlw(1i) lw(1i) lw(1i) lw(.5i) lw(2i).
X_
X.sp 3p
X.TB
XName	Class	Type	Notes	Default Value
X.sp 3p
X_
X.TH
X.R
X.sp 3p
Xbackground	Background	Pixel		XtDefaultBackground
XbackgroundPixmap	Pixmap	Pixmap		XtUnspecifiedPixmap
XborderWidth	BorderWidth	Dimension		1
Xcallback	CallbackList	XtCallbackList		NULL
XdigitFont	CalendarFont	XFontStruct		fixed
XdigitGravity	DigitGravity	Gravity		Center
XdigitNames	DigitNames	StringTable		XtDefaultDigitNames
Xforeground	Foreground	Pixel		XtDefaultForegrond
Xheight	Height	Dimension		Minimum height needed
Xhighlight	Highlight	Boolean		True
XlineWidth	LineWidth	int		1
XmappedWhenManaged	MappedWhenManaged	Boolean		True
XmonthNames	MonthNames	StringTable		XtDefaultMonthNames
XshowYear	ShowYear	Boolean		True
XstartingWeekday	StartingWeekday	DayName		Sunday
XtitleFont	CalendarFont	XFontStruct		fixed
Xtranslations	Translations	TranslationTable		See below
XweekdayFont	CalendarFont	XFontStruct		fixed
XweekdayNames	WeekdayNames	StringTable		XtDefaultWeekdayNames
Xwidth	Width	Dimension		Minimum width needed
Xx	X	Position		0
Xy	Y	Position		0
X.sp 3p
X_
X.TE
X.ps 11
X.nr PS 11
X.vs 13
X.nr VS 13
X.Bg
X.Gp
X.Bw
X.Cb
X.IP \fBdigitFont\fP 1.5i
XThe font to be used for drawing the digit text in the calendar.
X.IP \fBdigitGravity\fP 1.5i
XSpecifies the gravity used to determine where the digits that are drawn in
Xthe calendar cells will be located within the cells.  
X.Rs "NorthWest, North, NorthEast, West, Center, East, SouthWest, South, \
X\fPand\fP SouthEast".
X.IP \fBdigitNames\fP 1.5i
XThe text to be used for the digits in the calendar cells, specified as a
XStringTable.
X.Fg
X.Hw
X.IP \fBhighlight\fP 1.5i
XIf this is \fBFalse\fP then the calendar will never highlight any dates.
X.IP \fBlineWidth\fP 1.5i
XDetermines the number of pixels wide the lines composing the grid in the
Xcalendar should be.  Acceptable values are 1 through 10 inclusive.
X.Mm
X.IP \fBmonthNames\fP 1.5i
XThe text to be used for the month names that appear in the title above the
Xcalendar, specified as a StringTable.
X.IP \fBshowYear\fP 1.5i
XIf this is \fBFalse\fP then the year number will not appear in the title of
Xthe calendar.
X.IP \fBstartingWeekday\fP 1.5i
XThe day of the week that will correspond to the days in the left-most column
Xof the calendar.
X.Rs "Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, \fPand\fP Saturday".
X.IP \fBtitleFont\fP 1.5i
XThe font to be used for drawing the month and year text above the calendar
Xgrid.
X.IP \fBweekdayFont\fP 1.5i
XThe font to be used for drawing the weekday names above each column of
Xcalendar cells in the calendar grid.
X.IP \fBweekdayNames\fP 1.5i
XThe text to be used for the weekday names, specified as a StringTable.
X.Tr
X.Xy
X.NH 2
XResource Defaults
X.LP
XFollowing are the default string tables used by the calendar widget when
Xdrawing all of its text:
X.IP \fBXtDefaultDayNames\fP  0.5i
X"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
X.IP \fBXtDefaultMonthNames\fP 0.5i
X"January", "February", "March", "April", "May", "June"
X"July", "August", "September", "October", "November",
X"December"
X.IP \fBXtDefaultDigitNames\fP 0.5i
X"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", 
X"11", "12", "13", "14", "15", "16", "17", "18", "19", "20", 
X"21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"
X.NH 2
XDefined Types and Converters
X.IP \fBDate\fP 1.0i
XTypedef of a structure with a numeric month, day, and year field.  The
X\fBDateConverter\fP public function is included with this widget.  This is not
Xa normal resource converter and is described below under Convenience Routines.
X.IP \fBGravity\fP 1.0i
XTypedef of an enumerated type.  This may have one of the following values:
X\fBNorthWest, North, NorthEast, West, Center, East, SouthWest, South, \fPand
X\fBSouthEast\fP.  The \fBGravityConverter\fP resource converter is
Xautomatically included with this widget:
X.FD 0
Xvoid GravityConverter(\fIargs\fP, \fInum_args\fP, \fIfromVal\fP, \fItoVal\fP)
X.br
X      XrmValuePtr \fIargs\fP;
X      Cardinal * \fInum_args\fP;
X      XrmValuePtr \fIfromVal\fP;
X      XrmValuePtr \fItoVal\fP;
X.FN
X.IP \fIargs\fP 1i
XThis argument is ignored, but should be specified as NULL.
X.IP \fInum_args\fP 1i
XThis argument is ignored, but should be specified as NULL.
X.IP \fIfromVal\fP 1i
XA pointer to the XrmValue structure that has been filled with a pointer to
Xthe string to be converted.
X.IP \fItoVal\fP 1i
XA pointer to the XrmValue structure that will be filled with a pointer to
Xthe corresponding Gravity.
X.LP
X.IP \fBStringTable\fP 1.0i
XA NULL terminated array of string pointers.  \fBThe StringTableConverter\fP
Xresource converter is automatically included with this widget:
X.FD 0
Xvoid StringTableConverter(\fIargs\fP, \fInum_args\fP, \fIfromVal\fP, \fItoVal\fP)
X.br
X      XrmValuePtr \fIargs\fP;
X      Cardinal * \fInum_args\fP;
X      XrmValuePtr \fIfromVal\fP;
X      XrmValuePtr \fItoVal\fP;
X.FN
X.IP \fIargs\fP 1i
XThis argument is ignored, but should be specified as NULL.
X.IP \fInum_args\fP 1i
XThis argument is ignored, but should be specified as NULL.
X.IP \fIfromVal\fP 1i
XA pointer to the XrmValue structure that has been filled with a pointer to
Xthe string to be converted.
X.IP \fItoVal\fP 1i
XA pointer to the XrmValue structure that will be filled with a pointer to
Xthe resulting StringTable.
X.LP
XThe string to be converted must be specified as a comma separated list of 
Xdouble quoted sub-strings.
X.LP
X.IP \fBDayName\fP 1i
XTypedef of an enumerated type.  This may have one of the following values:
X\fBSunday, Monday, Tuesday, Wednesday, Thursday, Friday, \fPand
X\fBSaturday\fP.  The \fBDayNameConverter\fP resource converter is
Xautomatically included with this widget:
X.FD 0
Xvoid DayNameConverter (\fIargs\fP, \fInum_args\fP, \fIfromVal\fP, \fItoVal\fP)
X.br
X      XrmValuePtr \fIargs\fP;
X      Cardinal * \fInum_args\fP;
X      XrmValuePtr \fIfromVal\fP;
X      XrmValuePtr \fItoVal\fP;
X.FN
X.IP \fIargs\fP 1i
XThis argument is ignored, but should be specified as NULL.
X.IP \fInum_args\fP 1i
XThis argument is ignored, but should be specified as NULL.
X.IP \fIfromVal\fP 1i
XA pointer to the XrmValue structure that has been filled with a pointer to
Xthe string to be converted.
X.IP \fItoVal\fP 1i
XA pointer to the XrmValue structure that will be filled with a pointer to
Xthe corresponding DayName.
X.NH 2
XCalendar Actions
X.LP
XThe Calendar widget supports the following actions:
X.IP \(bu 5
XUnhighlight the previously highlighted calendar cell and highlight the
Xcalendar cell currently beneath the pointer with \fBselect\fP.
X.IP \(bu 5
XProcess calendar selection callbacks with \fBnotify\fP.
X.sp
X.LP
XThe following are the default translation bindings used by the Calendar
Xwidget:
X.LP
X.sp
X.Ds 0
X.TA .5i 2.25i
X.ta .5i 2.25i
X	<Btn1Down>:	select()
X	<Btn1Motion>:	select()
X	<Btn1Up>:	notify()
X.De
X.sp
X.LP
X.NH 2
XConvenience Routines
X.LP
XFor convenience and speed reasons, all of the date related resources of the
Xcalendar widget are only accesible via public functions.
X.LP
XIn order to use the convenience routines effectively, it is important to
Xunderstand that a calendar widget has two \fIunrelated\fP resources of type
X\fBDate\fP:
X.IP \fBmonth\fP 1i
XThe date specified for this resource determines what month the calendar widget
Xis to display.  A month and year are required to specify a unique \fBmonth\fP.
X.IP \fBdate\fP 1i
XThe date specified for this resource determines what specific day the calendar
Xwidget is to highlight.  A month, day, and year are required to specify a
Xunique \fBdate\fP.
X.NH 3
XSetting the Calendar Widget's month
X.LP
XThe \fBmonth\fP for the calendar widget to display can be set by calling:
X.FD 0
Xvoid CalendarShowMonth(\fIwidget\fP, \fIdate\fP)
X.br
X      CalendarWidget \fIwidget\fP;
X      Date \fIdigit\fP;
X.FN
X.IP \fIwidget\fP 1i
XSpecifies the calendar widget.
X.IP \fIdate\fP 1i
XSpecifies the new date whose month and year fields will determine the new
X\fBmonth\fP for the calendar to display.
X.LP
XCalling this function will change the \fBmonth\fP that is currently being
Xdisplayed on the specified calendar widget, if it differs from the \fBmonth\fP
Xthat the calendar widget is currently displaying.  The day field is ignored
Xand may be zero.  If the specified \fBmonth\fP corresponds to the \fBdate\fP
Xspecified by the last call to \fBCalendarSetDate\fP, and the \fBhighlight\fP
Xresource is \fBTrue\fP, then that specified \fBdate\fP will appear
Xhighlighted.
X.NH 3
XSetting the Calendar Widget's date
X.LP
XTo set the \fBdate\fP for the calendar widget to highlight use the following
Xfunction:
X.FD 0
Xvoid CalendarSetDate(\fIwidget\fP, \fIdate\fP)
X.br
X      CalendarWidget \fIwidget\fP;
X      Date \fIdate\fP;
X.FN
X.IP \fIwidget\fP 1i
XSpecifies the calendar widget.
X.IP \fIdate\fP 1i
XSpecifies the new date for the calendar to highlight.
X.LP
XThe specified \fBdate\fP will appear highlighted on the specified calendar
Xwidget whenever the widget has been told to display the corresponding
X\fBmonth\fP, if the \fBhighlight\fP resource is \fBTrue\fP.
X.NH 3
XGetting the Calendar Widget's Current date
X.LP
XTo get the current \fBdate\fP of a calendar widget use the following function:
X.FD 0
Xvoid CalendarGetDate(\fIwidget\fP, \fIdate_ptr\fP)
X.br
X      CalendarWidget \fIwidget\fP;
X      Date * \fIdate_ptr\fP;
X.FN
X.IP \fIwidget\fP 1i
XSpecifies the calendar widget.
X.IP \fIdate_ptr\fP 1i
XSpecifies a pointer to the date structure to be filled in with the specified
Xcalendar widget's current \fBdate\fP.
X.NH 3
XOther Ways to Change the Calendar Widget's date
X.LP
XTo increment or decrement the \fBdate\fP for the calendar widget to highlight
Xby one day use the following functions:
X.FD 0
Xvoid CalendarIncDay(\fIwidget\fP, \fIshow\fP)
Xvoid CalendarDecDay(\fIwidget\fP, \fIshow\fP)
X.br
X      CalendarWidget \fIwidget\fP;
X      Boolean \fIshow\fP;
X.FN
X.IP \fIwidget\fP 1i
XSpecifies the Calendar widget.
X.IP \fIshow\fP 1i
XFlag to control behavior on month rollover.
X.LP
XIf \fIshow\fP is \fBTrue\fP, then these routines will automatically call
X\fBCalendarShowMonth\fP with the resultant \fBmonth\fP.  Thus, the calendar
Xwidget will always display the resultant \fBdate\fP, and if the
X\fBhighlight\fP resource is \fBTrue\fP, it will be highlighted.
X.LP
XIf \fIshow\fP is \fBFalse\fP, the \fBmonth\fP the calendar is currently
Xdisplaying will be unaffected.  However, because the \fBdate\fP has changed,
Xthe highlighted day could visibly move, disappear into another month, or
Xappear in the current month, depending on what \fBmonth\fP the calendar widget
Xis currently displaying.
X.NH 3
XOther Ways to Change the Calendar Widget's Month
X.LP
XTo increment or decrement the \fBmonth\fP of a calendar widget by a month or a
Xyear use the following functions:
X.FD 0
Xvoid CalendarIncMonth(\fIwidget\fP)
Xvoid CalendarDecMonth(\fIwidget\fP)
Xvoid CalendarIncYear(\fIwidget\fP)
Xvoid CalendarDecYear(\fIwidget\fP)
X.br
X      CalendarWidget \fIwidget\fP;
X.FN
X.IP \fIwidget\fP 1i
XSpecifies the calendar widget.
X.LP
XThe calendar widget's \fBdate\fP is unaffected by these functions.
X.NH 3
XGetting Today's Date
X.LP
X.FD 0
XDate GetTodaysDate()
X.br
X.FN
XMost applications are going to need this, so it has been provided.
X.NH 3
XGetting the Calendar Widget's date in a Pretty Format
X.LP
X.FD 0
Xchar * CalendarPrettyDate(\fIwidget\fP)
X.br
X      CalendarWidget \fIwidget\fP;
X.FN
X.IP \fIwidget\fP 1i
XSpecifies the calendar widget.
X.LP
XThis function returns a string like "Sat September 17, 1966" based on the
Xcurrent \fBdate\fP of the specified calendar widget.  The weekday and month
Xtext will be gotten from the string tables specified for the
X\fBweekdayNames\fP and \fBmonthNames\fP resources.
X.LP
X.NH 3
XTo convert a string to a Date structure
X.FD 0
XDate DateConverter(\fIwidget\fP, \fIstring\fP)
X.br
X      CalendarWidget \fIwidget\fP;
X      char * \fIstring\fP;
X.FN
X.IP \fIwidget\fP 1i
XSpecifies the calendar widget whose \fBmonthNames\fP resource will be used to
Xconvert any month name in the specified \fIstring\fP into an integer in the
Xmonth field of the returned Date structure.
X.IP \fIstring\fP 1i
XSpecifies the string to be converted.
X.LP
XSeveral date formats are accepted.  If the \fIstring\fP specified does not
Xcorrespond to a valid date, then the Date structure returned will have zero
Xfor the month, day, and year fields.  Remember that only a month and a year
Xare required to specify a unique month.  As an extension, if only a year is
Xspecified, a Date will be returned corresponding to January of that year.
X.NH 2
XCopyright
X.LP
XCopyright 1990 Harris Corporation
X.LP
XPermission to use, copy, modify, and distribute, this software and its
Xdocumentation for any purpose is hereby granted without fee, provided that
Xthe above copyright notice appear in all copies and that both that
Xcopyright notice and this permission notice appear in supporting
Xdocumentation, and that the name of the copyright holder be used in
Xadvertising or publicity pertaining to distribution of the software with
Xspecific, written prior permission, and that no fee is charged for further
Xdistribution of this software, or any modifications thereof.  The copyright
Xholder makes no representations about the suitability of this software for
Xany purpose.  It is provided "as is" without express or implied warranty.
X.LP
XTHE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
XINCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND IN NO
XEVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
XCONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ITS USE,
XLOSS OF DATA, PROFITS, QPA OR GPA, WHETHER IN AN ACTION OF CONTRACT,
XNEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
XTHE USE OR PERFORMANCE OF THIS SOFTWARE.
X.NH 2
XAuthor
X.LP
X.nf
XJason Baietto
Xjason at ssd.csd.harris.com
END_OF_FILE
if test 14281 -ne `wc -c <'Calendar.doc'`; then
    echo shar: \"'Calendar.doc'\" unpacked with wrong size!
fi
# end of 'Calendar.doc'
fi
if test -f 'CalendarP.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'CalendarP.h'\"
else
echo shar: Extracting \"'CalendarP.h'\" \(10227 characters\)
sed "s/^X//" >'CalendarP.h' <<'END_OF_FILE'
X/*
X * Author: Jason Baietto, jason at ssd.csd.harris.com
X * xdiary Copyright 1990 Harris Corporation
X *
X * Permission to use, copy, modify, and distribute, this software and its
X * documentation for any purpose is hereby granted without fee, provided that
X * the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of the copyright holder be used in
X * advertising or publicity pertaining to distribution of the software with
X * specific, written prior permission, and that no fee is charged for further
X * distribution of this software, or any modifications thereof.  The copyright
X * holder makes no representations about the suitability of this software for
X * any purpose.  It is provided "as is" without express or implied warranty.
X *
X * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
X * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND IN NO
X * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
X * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ITS USE,
X * LOSS OF DATA, PROFITS, QPA OR GPA, WHETHER IN AN ACTION OF CONTRACT,
X * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
X * THE USE OR PERFORMANCE OF THIS SOFTWARE.
X */
X
X#ifndef _CalendarWidgetP_h
X#define _CalendarWidgetP_h
X
X/* CalendarP.h -- Private Include File. */
X
X#include <X11/CoreP.h>
X#include <values.h>
X#include "Calendar.h"
X#include "Gravity.h"
X#include "DayName.h"
X#include "StrTable.h"
X#include "Date.h"
X
X/* Widget's Class Part: */
Xtypedef struct {
X   int make_compiler_happy;
X} CalendarClassPart;
X
X/* Widget's Full Class Record: */
Xtypedef struct _CalendarClassRec {
X   CoreClassPart core_class;
X   CalendarClassPart calendar_class;
X} CalendarClassRec;
X
X/* State info to avoid scrogging the calendar. */
Xtypedef enum {
X   plasma,       /* Before init -- i.e. uninitialized.       */
X   foggy,        /* Just after initialize or resize method.  */
X   solid         /* Just after expose until next resize.     */
X} CalendarState;
X
X#define DAYS_IN_WEEK (7)
X#define MAX_DAYS_IN_MONTH (31)
X#define MONTHS_IN_YEAR (12)
X#define MAX_YEAR_LEN (10)
X
X#define ROWS (8)
X#define COLS (DAYS_IN_WEEK)
X
X#define HORIZ_SEGMENTS (ROWS-2)
X#define VERTI_SEGMENTS (COLS-1)
X#define BORDER_SEGMENTS (4)
X#define TOTAL_SEGMENTS (HORIZ_SEGMENTS+VERTI_SEGMENTS+BORDER_SEGMENTS)
X
X/* Calendar Widget's Instance Part: */
Xtypedef struct {
X
X/* Public Resources */
X
X   /* Callback list for all buttons */
X   XtCallbackList callback;
X
X   /* Line width of calendar lines */
X   int            line_width;
X
X   Pixel          foreground;
X   Pixel          background;
X
X   Font           digit_font;
X   Font           weekday_font;
X   Font           title_font;
X   Font           info_font;
X   
X   /* Gravity of the digits in their boxes */
X   XtGravity      digit_gravity;
X
X   /* String table for names of digits. */
X   StringTable    digit_names;
X
X   /* String table for names of days of the week. */
X   StringTable    weekday_names;
X
X   /* String table for names of months. */
X   StringTable    month_names;
X
X   /* True means highlight specified day (if any) */
X   Boolean        highlight;
X
X   /* True means show year along with month in title. */
X   Boolean        show_year;
X
X   /* Weekday for leftmost column in calendar. 0=Sunday, 6=Saturday. */
X   int            starting_weekday;
X
X/* Private */
X   
X   /* Date for calendar to display month for.  Initially current. */
X   Date          date;
X
X   /* The current highlighted date.  Initially current. */
X   Date          highlight_date;
X
X   /* Current cell dimensions */
X   float         real_cell_width;
X   float         real_cell_height;
X
X   /* Minimum cell dimensions based on current font extents */
X   float         min_cell_width;
X   float         min_cell_height;
X   
X   /* Cell matrix of XRectangles */
X   XRectangle    cell_geometry[ROWS][COLS];
X
X   /* Currently selected cell coordinate */
X   int           current_x_cell;
X   int           current_y_cell;
X
X   /* Previous core width (updated after resize) */
X   int           old_window_width;
X   int           old_window_height;
X
X   /* Month data for the showing date's year. */
X   int           month_starting_weekdays[MONTHS_IN_YEAR];
X   int           days_in_february;
X
X   /* Month data for the highlight_date's year. */
X   int           highlight_days_in_february;
X
X   /* Simplicity variables to avoid recomputing. */
X   int           month_start_cellnum;
X   int           month_end_cellnum;
X
X   /* lengths of strings frequently drawn in calendar */
X   int           digit_name_lengths[MAX_DAYS_IN_MONTH];
X   int           weekday_name_lengths[DAYS_IN_WEEK];
X   int           month_name_lengths[MONTHS_IN_YEAR];
X
X   /* Year information for the current calendar */
X   char          year_string[MAX_YEAR_LEN];
X   int           year_string_length;
X   int           current_year;
X
X   /* Title information for the current calendar */
X   char *        title_string;
X   int           title_string_length;
X   XRectangle    title_geometry;
X
X   /* Widget state info.  Used to avoid changing the date between the */
X   /* resize or initialization method and the expose method.          */
X
X   /* True if a valid cell has been selected with the pointer. */
X   Boolean        cell_selected;
X
X   /* Last method that has been run. */
X   CalendarState  state;
X
X   /* Segments for drawing the grid. */
X   XSegment       segments[TOTAL_SEGMENTS];
X
X   /* The number of segments currently in the segments array. */
X   int            number_segments;
X
X   /* GCs for line/box drawing */
X   GC            draw_gc;
X   GC            undraw_gc;
X   GC            invert_gc;
X
X   /* GCs and font structs for text drawing */
X   GC            digit_draw_gc;
X   GC            digit_undraw_gc;
X   XFontStruct * digit_fsp;
X
X   GC            weekday_draw_gc;
X   GC            weekday_undraw_gc;
X   XFontStruct * weekday_fsp;
X
X   GC            title_draw_gc;
X   GC            title_undraw_gc;
X   XFontStruct * title_fsp;
X
X   GC            info_draw_gc;
X   GC            info_undraw_gc;
X   XFontStruct * info_fsp;
X
X} CalendarPart;
X
X/* Widget's Full Instance Record: */
Xtypedef struct _CalendarRec {
X   CorePart     core;
X   CalendarPart calendar;
X} CalendarRec;
X
Xextern CalendarClassRec calendarClassRec;
X
X#define SUNDAY    0
X#define MONDAY    1
X#define TUESDAY   2
X#define WEDNESDAY 3
X#define THURSDAY  4
X#define FRIDAY    5
X#define SATURDAY  6
X
X#define XtNDefaultWeekdayNames \
X    "\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\""
X
X#define XtNDefaultMonthNames \
X    "\"January\",\"February\",\"March\",\"April\", \
X     \"May\",\"June\",\"July\",\"August\",\"September\", \
X     \"October\",\"November\",\"December\""
X
X#define XtNDefaultDigitNames \
X   "\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\", \
X   \"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\", \
X   \"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"30\", \
X   \"31\""
X
X#define OFF (0)
X#define ON (1)
X
X#define WINDOW_HEIGHT(cell_height) ((int)((cell_height)*ROWS))
X#define WINDOW_WIDTH(cell_width)   ((int)((cell_width )*COLS))
X
X#define MIN_LINE_WIDTH (1)
X#define MAX_LINE_WIDTH (10)
X#define DEFAULT_LINE_WIDTH (1)
X
X#define INVERT_BORDER (1)
X
X#define MIN(a,b) ((a) < (b) ? (a) : (b))
X#define MAX(a,b) ((a) > (b) ? (a) : (b))
X#define MAX3(a,b,c) (MAX(MAX((a),(b)),(c)))
X
X#define MAX_TITLE_LEN (100)
X
X/* This assumes integer data types */
X#define range_check(name, val, min, max) \
X{ \
X   if ((int)(val) < (int)(min)) { \
X      fprintf(stderr, "Warning: %s=%d too small (using %d)\n", name, val, min); \
X      (val) = (min); \
X   } else if ((int)(val) > (int)(max)) { \
X      fprintf(stderr, "Warning: %s=%d too large (using %d)\n", name, val, max); \
X      (val) = (max); \
X   } \
X}
X
X#define bound(val, min, max) \
X   ((val) < (min) ? (min) : ((val) > (max) ? (max) : (val)))
X
X#define low_bound(val, min) \
X   ((val) < (min) ? (min) : (val))
X
X#define high_bound(val, max) \
X   ((val) > (max) ? (max) : (val))
X
X
X#define CELLXYtoCELLNUM(x,y) (((y)-2)*COLS+(x))
X
X#define CELLNUMtoCELLXY(n,x,y) \
X   ( \
X     (x) = (n)%7, \
X     (y) = ((n)/7)+2 \
X   )
X
X#define CELLNUMtoDAYNUM(cn) \
X   ( \
X      ( (cn) < widget->calendar.month_start_cellnum || \
X        (cn) > widget->calendar.month_end_cellnum ) \
X      ? 0 \
X      : (cn) - widget->calendar.month_start_cellnum + 1 \
X   )
X
X#define CELLXYtoDAYNUM(x,y) (CELLNUMtoDAYNUM(CELLXYtoCELLNUM((x),(y))))
X   
X#define JANUARY 0
X#define FEBRUARY 1
X#define MARCH 2
X#define APRIL 3
X#define MAY 4
X#define JUNE 5
X#define JULY 6
X#define AUGUST 7
X#define SEPTEMBER 8
X#define OCTOBER 9 
X#define NOVEMBER 10
X#define DECEMBER 11
X
X#define A_LEAP_YEAR(year) (year%4 == 0 && !(year%100 == 0 && year%400 != 0))
X
X/* 0=Sunday, 6=Saturday */
X#define DAYStoWEEKDAY(days) ((((days)%7)+6)%7)
X
X#define ROTATE(widget, weekday) \
X   ( ((weekday) + (7 - (widget)->calendar.starting_weekday)) % 7 )
X
X#define DAYS_IN_MONTH(widget) \
X   ( (widget)->calendar.date.month == FEBRUARY+1 \
X     ? (widget)->calendar.days_in_february \
X     : days_in_month[(widget)->calendar.date.month - 1] \
X   )
X
X#define DAYS_IN_HIGHLIGHT_MONTH(widget) \
X   ( (widget)->calendar.highlight_date.month == FEBRUARY+1 \
X     ? (widget)->calendar.highlight_days_in_february \
X     : days_in_month[(widget)->calendar.highlight_date.month - 1] \
X   )
X
X#define WIDGETtoCELLXY(widget,x,y) \
X   ( (widget)->calendar.highlight_date.day \
X     ? ( \
X         (x) = ( (widget)->calendar.month_start_cellnum   \
X                 + (widget)->calendar.highlight_date.day - 1 ) % 7, \
X         (y) = ( ( (widget)->calendar.month_start_cellnum   \
X                   + (widget)->calendar.highlight_date.day - 1 ) / 7 ) + 2 \
X       ) \
X     : ( \
X         (x) = 0 , \
X         (y) = 0   \
X       ) \
X   )
X
X#define GEOMETRY(widget,x,y) \
X   ((widget)->calendar.cell_geometry[(y)][(x)])
X
X#define SYNC(widget) \
X   ((widget)->calendar.date.month == (widget)->calendar.highlight_date.month \
X    && (widget)->calendar.date.year == (widget)->calendar.highlight_date.year)
X 
X#define MAX_PRETTY_DATE_STRING_LENGTH 256
X
X#define CALENDAR_DEFAULT_FONT "fixed"
X 
X#endif /* _CalendarWidgetP_h */
END_OF_FILE
if test 10227 -ne `wc -c <'CalendarP.h'`; then
    echo shar: \"'CalendarP.h'\" unpacked with wrong size!
fi
# end of 'CalendarP.h'
fi
if test -f 'Date.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Date.c'\"
else
echo shar: Extracting \"'Date.c'\" \(8940 characters\)
sed "s/^X//" >'Date.c' <<'END_OF_FILE'
X/*
X * Author: Jason Baietto, jason at ssd.csd.harris.com
X * xdiary Copyright 1990 Harris Corporation
X *
X * Permission to use, copy, modify, and distribute, this software and its
X * documentation for any purpose is hereby granted without fee, provided that
X * the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of the copyright holder be used in
X * advertising or publicity pertaining to distribution of the software with
X * specific, written prior permission, and that no fee is charged for further
X * distribution of this software, or any modifications thereof.  The copyright
X * holder makes no representations about the suitability of this software for
X * any purpose.  It is provided "as is" without express or implied warranty.
X *
X * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
X * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND IN NO
X * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
X * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ITS USE,
X * LOSS OF DATA, PROFITS, QPA OR GPA, WHETHER IN AN ACTION OF CONTRACT,
X * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
X * THE USE OR PERFORMANCE OF THIS SOFTWARE.
X */
X
X#include <stdio.h>
X#include <ctype.h>
X#include <values.h>
X#include <X11/StringDefs.h>
X#include <X11/IntrinsicP.h>
X#include "DateP.h"
X#include "StrTable.h"
X#include "common.h"
X
Xstatic void process_digit_token();
Xstatic void process_alpha_token();
Xstatic int convert_month_string_to_number();
Xstatic int compare_string();
Xstatic void construct_date();
X
Xchar * default_month_names[] = {
X   "january", "february", "march", "april", "may", "june", "july",
X   "august", "september", "october", "november", "december" };
X
Xstatic int days_in_month[] = 
X   /* jan feb mar apr may jun jul aug sep oct nov dec */
X   {  0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31  };
X
X
Xstatic StringTable month_names = default_month_names;
X
Xstatic int token[3];
Xstatic int state[3];
Xstatic int count;
X
X#define STRING (0)
X#define NUMBER (1)
X
Xstatic char * beg_ptr;
Xstatic char * cur_ptr;
Xstatic Date date;
X
Xstatic int european;
X
XDate convert_string_to_date(table, string)
XStringTable table;
Xchar * string;
X{
X   int in_alpha_token = FALSE;
X   int in_digit_token = FALSE;
X   date.month = date.day = date.year = 0;
X   beg_ptr = cur_ptr = string;
X   count = 0;
X   european = FALSE;
X
X   /* Was a string table specified? */
X   if (table) {
X      month_names = table;
X   }
X
X   while (*cur_ptr) {
X      if (isalpha(*cur_ptr)) {
X         if (in_digit_token) {
X            /* Finished processing a digit token. */
X            process_digit_token();
X            in_digit_token = FALSE;
X         } else if (in_alpha_token) {
X            /* Still scanning an alpha token. */
X         } else {
X            /* Start processing an alpha token. */
X            in_alpha_token = TRUE;
X            beg_ptr = cur_ptr;
X         }
X      } else if (isdigit(*cur_ptr)) {
X         if (in_alpha_token) {
X            /* Finished processing a digit token. */
X            process_digit_token();
X            in_digit_token = FALSE;
X         } else if (in_digit_token) {
X            /* Still scannin a digit token. */
X         } else {
X            /* Start processing a digit token. */
X            in_digit_token = TRUE;
X            beg_ptr = cur_ptr;
X         }
X      } else {
X         if (in_alpha_token) {
X            /* Finished processing an alpha token. */
X            process_alpha_token();
X            in_alpha_token = FALSE;
X         } else if (in_digit_token) {
X            /* Finished processing a digit token. */
X            process_digit_token();
X            in_digit_token = FALSE;
X         }
X
X         /* Ignore garbage between tokens, but look for periods. */
X         if (*cur_ptr == '.') {
X            european = TRUE;
X         }
X      }
X      cur_ptr++;
X   }/*while*/
X
X   if (in_alpha_token) {
X      process_alpha_token();
X   } else if (in_digit_token) {
X      process_digit_token();
X   }
X
X   construct_date();
X
X   if (!is_valid_date(&date)) {
X      date.month = 0;
X      date.day   = 0;
X      date.year  = 0;
X   }
X
X   return date;
X}
X
X
X
Xstatic void process_alpha_token()
X{
X   if (count < 3) {
X      token[count] = convert_month_string_to_number();
X      state[count] = STRING;
X   }
X   count++;
X}
X
X
X
Xstatic void process_digit_token()
X{
X   if (count < 3) {
X      token[count] = atoi(beg_ptr);
X      if (token[count] > MAXSHORT) {
X         token[count] = 0;
X      }
X      state[count] = NUMBER;
X   }
X   count++;
X}
X
X
X
Xstatic int convert_month_string_to_number()
X{
X   int month;
X   for (month = 0; month < 12; month ++) {
X      if (compare_string(month_names[month])) {
X         return month+1;
X      }
X   }
X
X   /* Nothing matched. */
X   return 0;
X}
X
X
X
Xstatic int compare_string(string)
Xchar * string;
X{
X   char * token_ptr = beg_ptr;
X   char * string_ptr = string;
X
X   while (token_ptr < cur_ptr) {
X      if (DOWNCASE(*string_ptr) == DOWNCASE(*token_ptr)) {
X         /* Letters match (case ignored) */
X         token_ptr++;
X         string_ptr++;
X      } else {
X         /* Doesn't match. */
X         break;
X      }
X   }
X
X   if (token_ptr == cur_ptr) {
X      /* We got to the end without a mismatch. */
X      return TRUE;
X   } else {
X      /* String and token didn't match. */
X      return FALSE;
X   }
X   
X}
X
X
X
X
Xstatic void construct_date()
X{
X   date.day   = 0;
X   date.month = 0;
X   date.year  = 0;
X
X
X   if (count == 1) {
X
X      if (state[0] == NUMBER) {
X         /* number, done */
X      } else {
X         /* string, error */
X         return;
X      }
X
X      date.day   = 0;
X      date.month = 1;
X      date.year  = token[0];
X
X   } else if (count == 2) {
X
X      if (state[0] == STRING) {
X         /* string */
X         if (state[1] == NUMBER) {
X            /* string number, done */
X         } else {
X            /* string string, error */
X            return;
X         }
X      } else {
X         /* number */
X         if (state[1] == NUMBER) {
X            /* number number, done */
X         } else {
X            /* number string, error */
X            return;
X         }
X      }
X
X      /* Month Year */
X      date.day   = 0;
X      date.month = token[0];
X      date.year  = token[1];
X
X   } else if (count == 3) {
X
X      if (state[0] == STRING) {
X         /* string */
X         if (state[1] == NUMBER) {
X            /* string number */
X            if (state[2] == NUMBER) {
X               /* string number number, done */
X            } else {
X               /* string number string, error */
X               return;
X            }
X         } else {
X            /* string string, error */
X            return;
X         }
X
X         /* Month Day Year */
X         date.month = token[0];
X         date.day   = token[1];
X         date.year  = token[2];
X
X      } else {
X
X         /* number */
X         if (state[1] == STRING) {
X            /* number string */
X            if (state[2] == NUMBER) {
X               /* number string number, done */
X               /* Day Month Year */
X               date.day   = token[0];
X               date.month = token[1];
X               date.year  = token[2];
X            } else {
X               /* number string string, error */
X               return;
X            }
X         } else {
X            /* number number */
X            if (state[2] == NUMBER) {
X               /* number number number, done */
X               if (european) {
X                  /* Day Month Year */
X                  date.day   = token[0];
X                  date.month = token[1];
X                  date.year  = token[2];
X               } else {
X                  /* Month Day Year */
X                  date.month = token[0];
X                  date.day   = token[1];
X                  date.year  = token[2];
X               }
X            } else {
X               /* number number string, error */
X               return;
X            }
X         }
X      }
X   }
X}
X
X
X
Xint is_valid_date(date_ptr)
XDate * date_ptr;
X{
X   if (date_ptr->month < 1 || date_ptr->month > 12) {
X      /* None or an invalid month was specified. */
X      return FALSE;
X   }
X
X   if (date_ptr->year <= 0) {
X      /* No year was specified. */
X      return FALSE;
X   }
X
X   if (date_ptr->year < 100) {
X      /* Bump a two digit year into the 20th century. */
X      date_ptr->year += 1900;
X   }
X
X   if (!date_ptr->day) {
X      /* It's okay if no day is specified. */
X      return TRUE;
X   } else {
X      if (date_ptr->day < 0 || date_ptr->day > days_in_month[date_ptr->month]) {
X         /* An invalid day was specified. */
X         return FALSE;
X      } else {
X         /* One last error check. */
X         if (date_ptr->month == FEBRUARY 
X             && date_ptr->day == 29 
X             && !A_LEAP_YEAR(date_ptr->year)) {
X            return FALSE;
X         } else {
X            /* A valid day was specified. */
X            return TRUE;
X         }
X      }
X   }
X}
END_OF_FILE
if test 8940 -ne `wc -c <'Date.c'`; then
    echo shar: \"'Date.c'\" unpacked with wrong size!
fi
# end of 'Date.c'
fi
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(11304 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X# Makefile generated by imake - do not edit!
X# $XConsortium: imake.c,v 1.51 89/12/12 12:37:30 jim Exp $
X#
X# The cpp used on this machine replaces all newlines and multiple tabs and
X# spaces in a macro expansion with a single space.  Imake tries to compensate
X# for this, but is not always successful.
X#
X
X###########################################################################
X# Makefile generated from "Imake.tmpl" and </tmp/IIf.a09041>
X# $XConsortium: Imake.tmpl,v 1.77 89/12/18 17:01:37 jim Exp $
X#
X# Platform-specific parameters may be set in the appropriate .cf
X# configuration files.  Site-wide parameters may be set in the file
X# site.def.  Full rebuilds are recommended if any parameters are changed.
X#
X# If your C preprocessor doesn't define any unique symbols, you'll need
X# to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing
X# "make Makefile", "make Makefiles", or "make World").
X#
X# If you absolutely can't get imake to work, you'll need to set the
X# variables at the top of each Makefile as well as the dependencies at the
X# bottom (makedepend will do this automatically).
X#
X
X###########################################################################
X# platform-specific configuration parameters - edit sun.cf to change
X
X# platform:  $XConsortium: sun.cf,v 1.38 89/12/23 16:10:10 jim Exp $
X# operating system:  SunOS 4.0.3
X
X###########################################################################
X# site-specific configuration parameters - edit site.def to change
X
X# site:  $XConsortium: site.def,v 1.21 89/12/06 11:46:50 jim Exp $
X
X            SHELL = /bin/sh
X
X              TOP = .
X      CURRENT_DIR = .
X
X               AR = ar cq
X  BOOTSTRAPCFLAGS =
X               CC = cc
X
X         COMPRESS = compress
X              CPP = /lib/cpp $(STD_CPP_DEFINES)
X    PREPROCESSCMD = cc -E $(STD_CPP_DEFINES)
X          INSTALL = install
X               LD = ld
X             LINT = lint
X      LINTLIBFLAG = -C
X         LINTOPTS = -axz
X               LN = ln -s
X             MAKE = make
X               MV = mv
X               CP = cp
X           RANLIB = ranlib
X  RANLIBINSTFLAGS =
X               RM = rm -f
X     STD_INCLUDES =
X  STD_CPP_DEFINES =
X      STD_DEFINES =
X EXTRA_LOAD_FLAGS =
X  EXTRA_LIBRARIES =
X             TAGS = ctags
X
X    SHAREDCODEDEF = -DSHAREDCODE
X         SHLIBDEF = -DSUNSHLIB
X
X    PROTO_DEFINES =
X
X     INSTPGMFLAGS =
X
X     INSTBINFLAGS = -m 0755
X     INSTUIDFLAGS = -m 4755
X     INSTLIBFLAGS = -m 0664
X     INSTINCFLAGS = -m 0444
X     INSTMANFLAGS = -m 0444
X     INSTDATFLAGS = -m 0444
X    INSTKMEMFLAGS = -m 4755
X
X          DESTDIR =
X
X     TOP_INCLUDES = -I$(INCROOT)
X
X      CDEBUGFLAGS = -O
X        CCOPTIONS =
X      COMPATFLAGS =
X
X      ALLINCLUDES = $(STD_INCLUDES) $(TOP_INCLUDES) $(INCLUDES) $(EXTRA_INCLUDES)
X       ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(PROTO_DEFINES) $(DEFINES) $(COMPATFLAGS)
X           CFLAGS = $(CDEBUGFLAGS) $(CCOPTIONS) $(ALLDEFINES)
X        LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES)
X           LDLIBS = $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
X        LDOPTIONS = $(CDEBUGFLAGS) $(CCOPTIONS)
X   LDCOMBINEFLAGS = -X -r
X
X        MACROFILE = sun.cf
X           RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut
X
X    IMAKE_DEFINES =
X
X         IRULESRC = $(CONFIGDIR)
X        IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES)
X
X     ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/Imake.rules \
X			$(IRULESRC)/Project.tmpl $(IRULESRC)/site.def \
X			$(IRULESRC)/$(MACROFILE) $(EXTRA_ICONFIGFILES)
X
X###########################################################################
X# X Window System Build Parameters
X# $XConsortium: Project.tmpl,v 1.63 89/12/18 16:46:44 jim Exp $
X
X###########################################################################
X# X Window System make variables; this need to be coordinated with rules
X# $XConsortium: Project.tmpl,v 1.63 89/12/18 16:46:44 jim Exp $
X
X          PATHSEP = /
X        USRLIBDIR = $(DESTDIR)/usr/lib
X           BINDIR = $(DESTDIR)/usr/bin/X11
X          INCROOT = $(DESTDIR)/usr/include
X     BUILDINCROOT = $(TOP)
X      BUILDINCDIR = $(BUILDINCROOT)/X11
X      BUILDINCTOP = ..
X           INCDIR = $(INCROOT)/X11
X           ADMDIR = $(DESTDIR)/usr/adm
X           LIBDIR = $(USRLIBDIR)/X11
X        CONFIGDIR = $(LIBDIR)/config
X       LINTLIBDIR = $(USRLIBDIR)/lint
X
X          FONTDIR = $(LIBDIR)/fonts
X         XINITDIR = $(LIBDIR)/xinit
X           XDMDIR = $(LIBDIR)/xdm
X           AWMDIR = $(LIBDIR)/awm
X           TWMDIR = $(LIBDIR)/twm
X           GWMDIR = $(LIBDIR)/gwm
X          MANPATH = $(DESTDIR)/usr/man
X       LIBMANPATH = $(DESTDIR)/usr/man/p_man
X       CATMANPATH = $(DESTDIR)/usr/catman/u_man
X    LIBCATMANPATH = $(DESTDIR)/usr/catman/p_man
X    MANSOURCEPATH = $(MANPATH)/man
X  LIBMANSOURCEPATH= $(LIBMANPATH)/man
X  CATMANSOURCEPATH= $(CATMANPATH)/man
X  LIBCATMANSOURCEPATH=$(LIBCATMANPATH)/man
X           MANDIR = $(MANSOURCEPATH)n
X        LIBMANDIR = $(LIBMANSOURCEPATH)3
X        CATMANDIR = $(CATMANSOURCEPATH)n
X     LIBCATMANDIR = $(LIBCATMANSOURCEPATH)3
X      XAPPLOADDIR = $(LIBDIR)/app-defaults
X
X        SOXLIBREV = 4.2
X          SOXTREV = 4.0
X         SOXAWREV = 4.0
X        SOOLDXREV = 4.0
X         SOXMUREV = 4.0
X        SOXEXTREV = 4.0
X
X       FONTCFLAGS = -t
X
X     INSTAPPFLAGS = $(INSTDATFLAGS)
X
X            IMAKE = imake
X           DEPEND = makedepend
X              RGB = rgb
X            FONTC = bdftosnf
X        MKFONTDIR = mkfontdir
X        MKDIRHIER = /bin/sh $(BINDIR)/mkdirhier.sh
X
X        CONFIGSRC = $(TOP)/config
X        CLIENTSRC = $(TOP)/clients
X          DEMOSRC = $(TOP)/demos
X           LIBSRC = $(TOP)/lib
X          FONTSRC = $(TOP)/fonts
X       INCLUDESRC = $(TOP)/X11
X        SERVERSRC = $(TOP)/server
X          UTILSRC = $(TOP)/util
X        SCRIPTSRC = $(UTILSRC)/scripts
X       EXAMPLESRC = $(TOP)/examples
X       CONTRIBSRC = $(TOP)/../contrib
X           DOCSRC = $(TOP)/doc
X           RGBSRC = $(TOP)/rgb
X        DEPENDSRC = $(UTILSRC)/makedepend
X         IMAKESRC = $(CONFIGSRC)
X         XAUTHSRC = $(LIBSRC)/Xau
X          XLIBSRC = $(LIBSRC)/X
X           XMUSRC = $(LIBSRC)/Xmu
X       TOOLKITSRC = $(LIBSRC)/Xt
X       AWIDGETSRC = $(LIBSRC)/Xaw
X       OLDXLIBSRC = $(LIBSRC)/oldX
X      XDMCPLIBSRC = $(LIBSRC)/Xdmcp
X      BDFTOSNFSRC = $(FONTSRC)/bdftosnf
X     MKFONTDIRSRC = $(FONTSRC)/mkfontdir
X     EXTENSIONSRC = $(TOP)/extensions
X
X  DEPEXTENSIONLIB = $(USRLIBDIR)/libXext.a
X     EXTENSIONLIB =  -lXext
X
X          DEPXLIB = $(DEPEXTENSIONLIB)
X             XLIB = $(EXTENSIONLIB) -lX11
X
X      DEPXAUTHLIB = $(USRLIBDIR)/libXau.a
X         XAUTHLIB =  -lXau
X
X        DEPXMULIB =
X           XMULIB = -lXmu
X
X       DEPOLDXLIB =
X          OLDXLIB = -loldX
X
X      DEPXTOOLLIB =
X         XTOOLLIB = -lXt
X
X        DEPXAWLIB =
X           XAWLIB = -lXaw
X
X LINTEXTENSIONLIB = $(USRLIBDIR)/llib-lXext.ln
X         LINTXLIB = $(USRLIBDIR)/llib-lX11.ln
X          LINTXMU = $(USRLIBDIR)/llib-lXmu.ln
X        LINTXTOOL = $(USRLIBDIR)/llib-lXt.ln
X          LINTXAW = $(USRLIBDIR)/llib-lXaw.ln
X
X          DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB)
X
X         DEPLIBS1 = $(DEPLIBS)
X         DEPLIBS2 = $(DEPLIBS)
X         DEPLIBS3 = $(DEPLIBS)
X
X###########################################################################
X# Imake rules for building libraries, programs, scripts, and data files
X# rules:  $XConsortium: Imake.rules,v 1.67 89/12/18 17:14:15 jim Exp $
X
X###########################################################################
X# start of Imakefile
X
X#
X# Author: Jason Baietto, jason at ssd.csd.harris.com
X# xdiary Copyright 1990 Harris Corporation
X#
X# Permission to use, copy, modify, and distribute, this software and its
X# documentation for any purpose is hereby granted without fee, provided that
X# the above copyright notice appear in all copies and that both that
X# copyright notice and this permission notice appear in supporting
X# documentation, and that the name of the copyright holder be used in
X# advertising or publicity pertaining to distribution of the software with
X# specific, written prior permission, and that no fee is charged for further
X# distribution of this software, or any modifications thereof.  The copyright
X# holder makes no representations about the suitability of this software for
X# any purpose.  It is provided "as is" without express or implied warranty.
X#
X# THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
X# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND IN 0
X# EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
X# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ITS USE,
X# LOSS OF DATA, PROFITS, QPA OR GPA, WHETHER IN AN ACTION OF CONTRACT,
X# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
X# THE USE OR PERFORMANCE OF THIS SOFTWARE.
X#
X
X#
X# Imakefile for xdiary
X# Use xmkmf at your site to generate a site specific Makefile
X#
X
X        DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB) $(DEPXEXTLIB)
XLOCAL_LIBRARIES = $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB) $(XEXTLIB)
X           SRCS = Calendar.c \
X                  StrInRect.c \
X                  StrTable.c \
X                  Gravity.c \
X                  Date.c \
X                  DayName.c \
X                  template.c \
X                  diary.c \
X                  main.c
X
X           OBJS = Calendar.o \
X                  StrInRect.o \
X                  StrTable.o \
X                  Gravity.o \
X                  Date.o \
X                  DayName.o \
X                  diary.o \
X                  template.o \
X                  main.o
X
X PROGRAM = xdiary
X
Xall:: xdiary
X
Xxdiary: $(OBJS) $(DEPLIBS)
X	$(RM) $@
X	$(CC) -o $@ $(OBJS) $(LDOPTIONS) $(LOCAL_LIBRARIES) $(LDLIBS) $(EXTRA_LOAD_FLAGS)
X
Xsaber_xdiary:
X	#load $(ALLDEFINES) $(SRCS) $(LOCAL_LIBRARIES) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
X
Xosaber_xdiary:
X	#load $(ALLDEFINES) $(OBJS) $(LOCAL_LIBRARIES) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
X
Xinstall:: xdiary
X	$(INSTALL) -c $(INSTPGMFLAGS)   xdiary $(BINDIR)
X
Xinstall.man:: xdiary.man
X	$(INSTALL) -c $(INSTMANFLAGS) xdiary.man $(MANDIR)/xdiary.n
X
Xdepend::
X	$(DEPEND) -s "# DO NOT DELETE" -- $(ALLDEFINES) -- $(SRCS)
X
Xlint:
X	$(LINT) $(LINTFLAGS) $(SRCS) $(LINTLIBS)
Xlint1:
X	$(LINT) $(LINTFLAGS) $(FILE) $(LINTLIBS)
X
Xclean::
X	$(RM) $(PROGRAM)
X
Xinstall:: Xdiary.ad
X	$(INSTALL) -c $(INSTAPPFLAGS) Xdiary.ad $(XAPPLOADDIR)/Xdiary
X
X###########################################################################
X# common rules for all Makefiles - do not edit
X
Xemptyrule::
X
Xclean::
X	$(RM_CMD) \#*
X
XMakefile::
X	- at if [ -f Makefile ]; then \
X	echo "	$(RM) Makefile.bak; $(MV) Makefile Makefile.bak"; \
X	$(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \
X	else exit 0; fi
X	$(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR)
X
Xtags::
X	$(TAGS) -w *.[ch]
X	$(TAGS) -xw *.[ch] > TAGS
X
Xsaber:
X	#load $(ALLDEFINES) $(SRCS)
X
Xosaber:
X	#load $(ALLDEFINES) $(OBJS)
X
X###########################################################################
X# empty rules for directories that do not have SUBDIRS - do not edit
X
Xinstall::
X	@echo "install in $(CURRENT_DIR) done"
X
Xinstall.man::
X	@echo "install.man in $(CURRENT_DIR) done"
X
XMakefiles::
X
Xincludes::
X
X###########################################################################
X# dependencies generated by makedepend
X
END_OF_FILE
if test 11304 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'StrInRect.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'StrInRect.c'\"
else
echo shar: Extracting \"'StrInRect.c'\" \(6826 characters\)
sed "s/^X//" >'StrInRect.c' <<'END_OF_FILE'
X/*
X * Author: Jason Baietto, jason at ssd.csd.harris.com
X * xdiary Copyright 1990 Harris Corporation
X *
X * Permission to use, copy, modify, and distribute, this software and its
X * documentation for any purpose is hereby granted without fee, provided that
X * the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of the copyright holder be used in
X * advertising or publicity pertaining to distribution of the software with
X * specific, written prior permission, and that no fee is charged for further
X * distribution of this software, or any modifications thereof.  The copyright
X * holder makes no representations about the suitability of this software for
X * any purpose.  It is provided "as is" without express or implied warranty.
X *
X * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
X * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND IN NO
X * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
X * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ITS USE,
X * LOSS OF DATA, PROFITS, QPA OR GPA, WHETHER IN AN ACTION OF CONTRACT,
X * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
X * THE USE OR PERFORMANCE OF THIS SOFTWARE.
X */
X
X#include <stdio.h>
X#include <X11/StringDefs.h>
X#include <X11/IntrinsicP.h>
X#include "StrInRectP.h"
X
X/*==========================================================================*/
X/*                        DrawStringInRect Routines:                        */
X/*==========================================================================*/
Xvoid DrawStringInRect(display,
X                      drawable,
X                      gc,
X                      font,
X                      string,
X                      length,
X                      rectangle,
X                      gravity,
X                      xpad,
X                      ypad)
XDisplay      * display;
XDrawable       drawable;
XGC             gc;
XXFontStruct  * font;
Xchar         * string;
Xint            length;       
XXRectangle   * rectangle;
XXtGravity      gravity;
Xint            xpad;
Xint            ypad;
X{
X
X   int ascent        = font->ascent;
X   int descent       = font->descent;
X   int string_width  = XTextWidth(font, string, length);
X   int string_height = ascent + descent;
X   int x,y;
X
X   switch (gravity) {
X      case NorthWest:
X         x = rectangle->x + xpad;
X         y = rectangle->y + ascent + ypad;
X         break;
X      case North:
X         x = rectangle->x + (rectangle->width - string_width)/2;
X         y = rectangle->y + ascent + ypad;
X         break;
X      case NorthEast:
X         x = (rectangle->x + rectangle->width - 1) - string_width - xpad;
X         y = rectangle->y + ascent + ypad;
X         break;
X      case West:
X         x = rectangle->x + xpad;
X         y = rectangle->y + (rectangle->height - string_height)/2 + ascent;
X         break;
X      case Center:
X         x = rectangle->x + (rectangle->width - string_width)/2;
X         y = rectangle->y + (rectangle->height - string_height)/2 + ascent;
X         break;
X      case East:
X         x = (rectangle->x + rectangle->width - 1) - string_width - xpad;
X         y = rectangle->y + (rectangle->height - string_height)/2 + ascent;
X         break;
X      case SouthWest:
X         x = rectangle->x + xpad;
X         y = (rectangle->y + rectangle->height - 1) - descent - 1 - ypad;
X         break;
X      case South:
X         x = rectangle->x + (rectangle->width - string_width)/2;
X         y = (rectangle->y + rectangle->height - 1) - descent - 1 - ypad;
X         break;
X      case SouthEast:
X         x = (rectangle->x + rectangle->width - 1) - string_width - xpad;
X         y = (rectangle->y + rectangle->height - 1) - descent - 1 - ypad;
X         break;
X      default:
X         fprintf(stderr, "DrawStringInRect: unknown gravity\n");
X         break;
X   }
X
X   XDrawString(
X      display,
X      drawable,
X      gc,
X      x,y,
X      string,
X      length
X   );
X}
X
X
X
X
Xvoid DrawStringsInRects(display,
X                        drawable,
X                        gc,
X                        font,
X                        strings,
X                        lengths,
X                        rectangles,
X                        count,
X                        gravity,
X                        xpad,
X                        ypad)
XDisplay      * display;
XDrawable       drawable;
XGC             gc;
XXFontStruct  * font;
XStringTable    strings;
Xint          * lengths;
XXRectangle   * rectangles;
Xint            count;
XXtGravity      gravity;
Xint            xpad;
Xint            ypad;
X{
X
X   int ascent        = font->ascent;
X   int descent       = font->descent;
X   int string_height = ascent + descent;
X   int string_width;
X   int x,y;
X   int i;
X
X   for (i=0; i < count; i++) {
X
X      string_width  = XTextWidth(font, strings[i], lengths[i]);
X
X      switch (gravity) {
X         case NorthWest:
X            x = rectangles[i].x + xpad;
X            y = rectangles[i].y + ascent + ypad;
X            break;
X         case North:
X            x = rectangles[i].x + (rectangles[i].width - string_width)/2;
X            y = rectangles[i].y + ascent + ypad;
X            break;
X         case NorthEast:
X            x = (rectangles[i].x + rectangles[i].width - 1) - string_width - xpad;
X            y = rectangles[i].y + ascent + ypad;
X            break;
X         case West:
X            x = rectangles[i].x + xpad;
X            y = rectangles[i].y + (rectangles[i].height - string_height)/2 + ascent;
X            break;
X         case Center:
X            x = rectangles[i].x + (rectangles[i].width - string_width)/2;
X            y = rectangles[i].y + (rectangles[i].height - string_height)/2 + ascent;
X            break;
X         case East:
X            x = (rectangles[i].x + rectangles[i].width - 1) - string_width - xpad;
X            y = rectangles[i].y + (rectangles[i].height - string_height)/2 + ascent;
X            break;
X         case SouthWest:
X            x = rectangles[i].x + xpad;
X            y = (rectangles[i].y + rectangles[i].height - 1) - descent - 1 - ypad;
X            break;
X         case South:
X            x = rectangles[i].x + (rectangles[i].width - string_width)/2;
X            y = (rectangles[i].y + rectangles[i].height - 1) - descent - 1 - ypad;
X            break;
X         case SouthEast:
X            x = (rectangles[i].x + rectangles[i].width - 1) - string_width - xpad;
X            y = (rectangles[i].y + rectangles[i].height - 1) - descent - 1 - ypad;
X            break;
X         default:
X            fprintf(stderr, "DrawStringsInRects: unknown gravity\n");
X            break;
X      }
X
X      XDrawString(
X         display,
X         drawable,
X         gc,
X         x,y,
X         strings[i],
X         lengths[i]
X      );
X   }
X}
END_OF_FILE
if test 6826 -ne `wc -c <'StrInRect.c'`; then
    echo shar: \"'StrInRect.c'\" unpacked with wrong size!
fi
# end of 'StrInRect.c'
fi
if test -f 'main.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'main.h'\"
else
echo shar: Extracting \"'main.h'\" \(5584 characters\)
sed "s/^X//" >'main.h' <<'END_OF_FILE'
X/*
X * Author: Jason Baietto, jason at ssd.csd.harris.com
X * xdiary Copyright 1990 Harris Corporation
X *
X * Permission to use, copy, modify, and distribute, this software and its
X * documentation for any purpose is hereby granted without fee, provided that
X * the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of the copyright holder be used in
X * advertising or publicity pertaining to distribution of the software with
X * specific, written prior permission, and that no fee is charged for further
X * distribution of this software, or any modifications thereof.  The copyright
X * holder makes no representations about the suitability of this software for
X * any purpose.  It is provided "as is" without express or implied warranty.
X *
X * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
X * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND IN NO
X * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
X * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ITS USE,
X * LOSS OF DATA, PROFITS, QPA OR GPA, WHETHER IN AN ACTION OF CONTRACT,
X * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
X * THE USE OR PERFORMANCE OF THIS SOFTWARE.
X */
X
X#define SUNDAY    0
X#define MONDAY    1
X#define TUESDAY   2
X#define WEDNESDAY 3
X#define THURSDAY  4
X#define FRIDAY    5
X#define SATURDAY  6
X
X#define JANUARY     1
X#define FEBRUARY    2
X#define MARCH       3
X#define APRIL       4
X#define MAY         5
X#define JUNE        6
X#define JULY        7
X#define AUGUST      8
X#define SEPTEMBER   9
X#define OCTOBER     10
X#define NOVEMBER    11
X#define DECEMBER    12
X
X#define ENGLISH 0
X#define GERMAN  1
X#define SPANISH 2
X#define FRENCH  3
X#define ITALIAN 4
X
X
Xstatic char * month_names[][13] = {
X   {
X      /* ENGLISH */
X      "January", "February", "March", "April", "May", "June", "July",
X      "August", "September", "October", "November", "December", NULL
X   },
X   {
X      /* GERMAN */
X      "Januar", "Februar", "M\344rz", "April", "Mai", "Juni", "Juli",
X      "August", "September", "Oktober", "November", "Dezember", NULL
X   },
X   {
X      /* SPANISH */
X      "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio",
X      "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre", NULL
X   },
X   {
X      /* FRENCH */
X      "Janvier", "F\351vrier", "Mars", "Avril", "Mai", "Juin", "Juillet",
X      "Auguste", "Septembre", "Octobre", "Novembre", "D\351cembre", NULL
X   }
X};
X
X
Xstatic char * weekday_names[][8] = {
X   {
X      /* ENGLISH */
X      "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
X      "Friday", "Saturday", NULL
X   },
X   {
X      /* GERMAN */
X      "Sontag", "Montag", "Dienstag", "Mittwoch", "Donnerstag",
X      "Freitag", "Samstag", NULL
X   },
X   {
X      /* SPANISH */
X      "Domingo", "Lunes", "Martes", "Mi\351rcoles", "Jueves", "Viernes",
X      "S\341bado",  NULL
X   },
X   {
X      /* FRENCH */
X      "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi",
X      "Samedi", NULL
X   }
X};
X
Xstatic char * quit_label[] = {
X   /* ENGLISH */ "Quit",
X   /* GERMAN  */ "Aufgeben",
X   /* SPANISH */ "Descargar",
X   /* FRENCH  */ "Quitte"
X};
X
Xstatic char * day_label[] = {
X   /* ENGLISH */ "Day",
X   /* GERMAN  */ "Tag",
X   /* SPANISH */ "Dia",
X   /* FRENCH  */ "Jour"
X};
X
Xstatic char * entry_label[] = {
X   /* ENGLISH */ "Entry",
X   /* GERMAN  */ "Eintritt",
X   /* SPANISH */ "Entrada",
X   /* FRENCH  */ "Entre\351"  /* e' */
X};
X
Xstatic char * month_label[] = {
X   /* ENGLISH */ "Month",
X   /* GERMAN  */ "Monat",
X   /* SPANISH */ "Mes",
X   /* FRENCH  */ "Mois"
X};
X
Xstatic char * year_label[] = {
X   /* ENGLISH */ "Year",
X   /* GERMAN  */ "Jahr",
X   /* SPANISH */ "A\361o",    /* n~ */
X   /* FRENCH  */ "Ann\351e"   /* e' */
X};
X
Xstatic char * warp_label[] = {
X   /* ENGLISH */ "Warp",
X   /* GERMAN  */ "Reisen",
X   /* SPANISH */ "Viajar",
X   /* FRENCH  */ "Voyage"
X};
X
Xstatic char * today_label[] = {
X   /* ENGLISH */ "Today",
X   /* GERMAN  */ "Heute",
X   /* SPANISH */ "Hoy",
X   /* FRENCH  */ "Aujourd'hui"
X};
X
Xstatic char * dialog_label[] = {
X   /* ENGLISH */ "Destination:",
X   /* GERMAN  */ "Bestimmung:",
X   /* SPANISH */ "Destino:",
X   /* FRENCH  */ "Destination:"  /* Same as English */
X};
X
Xstatic char * diary_label[] = {
X   /* ENGLISH */ "Diary",
X   /* GERMAN  */ "Tagebuch",
X   /* SPANISH */ "Diario",
X   /* FRENCH  */ "Agenda"
X};
X
Xstatic char * option_label[] = {
X   /* ENGLISH */ "Option",
X   /* GERMAN  */ "Option",    /* Same as English */
X   /* SPANISH */ "Opci\363n", /* o' */
X   /* FRENCH  */ "Option"     /* Same as English */
X};
X
Xstatic char * single_label[] = {
X   /* ENGLISH */ "Single",
X   /* GERMAN  */ "Einzig",
X   /* SPANISH */ "Solo",
X   /* FRENCH  */ "Unique"
X};
X
Xstatic char * full_label[] = {
X   /* ENGLISH */ "Full",
X   /* GERMAN  */ "Voll",
X   /* SPANISH */ "Completo",
X   /* FRENCH  */ "Complet"
X};
X
Xstatic char * save_label[] = {
X   /* ENGLISH */ "Save",
X   /* GERMAN  */ "Speichern",
X   /* SPANISH */ "Salve",
X   /* FRENCH  */ "Sauver"
X};
X
X#define MAX_WIDGETS 25
X
X/* in milliseconds */
X#define ONE_SECOND          (1000) 
X#define ONE_MINUTE          (60 * ONE_SECOND)
X#define FIVE_MINUTES        (5  * ONE_MINUTE)
X#define ONE_HOUR            (60 * ONE_MINUTE)
X#define TWENTY_FOUR_HOURS   (24 * ONE_HOUR)
X
X#define DIARY_FILE "/.xdiary"
X#define TEMPLATE_FILE "/.xdiary-template"
X
X#define DAY   (1L<<1)
X#define MONTH (1L<<2)
X#define YEAR  (1L<<3)
X#define ENTRY (1L<<4)
X
X#ifndef MAXPATHLEN
X#define MAXPATHLEN 1024
X#endif
END_OF_FILE
if test 5584 -ne `wc -c <'main.h'`; then
    echo shar: \"'main.h'\" unpacked with wrong size!
fi
# end of 'main.h'
fi
echo shar: End of archive 2 \(of 5\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 5 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 5 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0

-- 
|===================================|===================================|
|      Jason "Jasper" Baietto       |       otteiaB "repsaJ" nosaJ      |
| Harris Computer Systems Division  |  noisiviD smetsyS retupmoC sirraH |
|     Fort Lauderdale, Florida      |      adirolF ,eladreduaL troF     |
|   jason at hcx2.ssd.csd.harris.com   |   moc.sirrah.dsc.dss.2xch at nosaj   |
|===================================|===================================|



More information about the Alt.sources mailing list