Pcal: postscript/c calendar printer (VMS version)
Andrew Rogers
rogers at sud509.ed.ray.com
Wed Jun 6 02:08:46 AEST 1990
In article <1340 at sud509.ed.ray.com> rogers at sud509.RAY.COM I wrote:
>(PS: send Email if you'd like a VMS version of this...)
Well, I guess I underestimated how many requests I'd get for this... so I'm
posting the VMS version (actually the changes required to adapt the version
I posted earlier to VMS) below. The changes visible to the user are:
1) Default calendar file is SYS$LOGIN:CALENDAR.DAT
2) Automatically writes to an output file, CALENDAR.PS; added -o
option to override the default file name
The changes visible only to the programmer are:
3) Eliminated use of getopt() to parse command line. There may be
some minor variations in functionality introduced by this.
The following code replaces main() in the Unix version previously posted:
Andrew W. Rogers
--------------------------- cut here ----------------------------
/*
* VMS version of pcal.c main module
*
* Adapted by Andrew W. Rogers
*/
main(argc, argv)
int argc;
char **argv;
{
#define EXIT_SUCCESS 1
#define EXIT_FAILURE 3
#define GETARG(arg) if ((parg = *++opt ? opt : \
(*(argv+1) && **(argv+1) != '-' ? *++argv : NULL) ) \
!= NULL) arg = parg; else
#define DOHEADER(phdr) for(ap = phdr; *ap; ap++) PRT("%s\n", *ap);
register struct tm *lt;
register char **ap;
register char *cp;
char *cfile = NULL;
char *opt, *pnum, *parg;
char cbuf[80];
long t;
int errflg = 0;
int nocal = 0;
int sat = 0;
char *titlefont = "Times-Bold";
char *dayfont = "Times-Bold";
char *outfile = "CALENDAR.PS";
int rotate = 90;
int month = 0;
char doyear = 0;
char *trnlog();
while (!errflg && *++argv) {
if (**argv != '-') {
errflg = 1;
break;
}
opt = (*argv) + 1;
switch (*opt) {
case 'd': /* Alternate day name/number font */
GETARG(dayfont);
break;
case 'e': /* Empty calendar */
nocal++;
cfile = NULL;
break;
case 'f': /* Alternate calendar file name */
GETARG(cfile);
nocal = 0;
break;
case 'm': /* Month */
pnum = NULL;
GETARG(pnum);
month = pnum ? atoi(pnum) : 0;
if (!month) doyear = 1;
break;
case 'o': /* Alternate output file name */
GETARG(outfile);
break;
case 'r': /* Portrait */
rotate = 0;
break;
case 's': /* Saturdays in black */
sat++;
break;
case 't': /* Alternate title font */
GETARG(titlefont);
break;
case 'y': /* Year */
pnum = NULL;
GETARG(pnum);
year = pnum ? atoi(pnum) : 0;
if (year != 0 && year < 1900) year = year % 100 + 1900;
break;
default:
errflg = 1;
break;
}
}
if (errflg) {
FPR(stderr,
"Usage: pcal [ -r ] [ -s ] [ -e | -f <cal> ] [ -m month] [ -y <year> ]\n");
FPR(stderr,
"\t\t[ -t <title font> ] [ -d <day font> ] [-o <output file>]\n");
exit(EXIT_FAILURE);
}
t = time((long *)0);
lt = localtime(&t);
if (!month && !doyear)
month = lt->tm_mon + 1;
if (!year)
year = lt->tm_year + 1900;
if (outfile && freopen(outfile, "w", stdout) == (FILE *) NULL) {
FPR(stderr, "pcal: can't open file: %s\n", outfile);
exit(EXIT_FAILURE);
}
/*
* In case we don't encounter any year data in the
* calendar file, assume the current year.
*/
cyear = year;
/*
* Open a supplied calendar file (if any)
*/
if (cfile != NULL) {
if ((cfp = fopen(cfile, "r")) == NULL) {
FPR(stderr, "pcal: can't open file: %s\n", cfile);
exit(EXIT_FAILURE);
}
}
/*
* Else see if a calendar file exists in the home directory
*/
else if (nocal == 0 && (cp = trnlog("SYS$LOGIN")) != NULL) {
(void)strcpy(cbuf, cp);
(void)strcat(cbuf, "CALENDAR.DAT");
cfp = fopen(cbuf, "r");
}
/*
* Write out PostScript prolog
*/
PRT("%%!\n");
PRT("/titlefont /%s def\n/dayfont /%s def\n", titlefont, dayfont);
DOHEADER(header_1);
if (!sat)
DOHEADER(header_2);
DOHEADER(header_3);
PRT("\t%d rotate\n", rotate);
if (rotate)
PRT("\t50 -120 translate\n");
else
PRT("\t0.75 0.75 scale\n\t50 460 translate\n");
DOHEADER(header_4);
if (month)
pmonth(month);
else
for (month = 1; month <= 12; month++)
pmonth(month);
FPR(stderr, "Output is in file %s\n", outfile);
exit(EXIT_SUCCESS);
}
#include <ssdef.h>
#include <descrip.h>
char *trnlog(logname) /* look up logical name */
char *logname;
{
static char trnbuf[81];
$DESCRIPTOR(src, logname);
$DESCRIPTOR(dst, trnbuf);
short len;
int ret;
src.dsc$w_length = strlen(logname);
ret = LIB$SYS_TRNLOG(&src, &len, &dst);
if (ret != SS$_NORMAL)
len = 0;
trnbuf[len] = '\0';
return trnbuf;
}
More information about the Alt.sources
mailing list