Relay-Version: version nyu B notes v1.6 9/18/89; site acf4.NYU.EDU
From: lrb@rrivax.rri.uwo.ca (Lance R. Bailey)
Date: 27 Aug 90 06:51 EDT
Date-Received: 27 Aug 90 12:52 EDT
Subject: schedular part 2 of 6
Message-ID: <911@ria.ccs.uwo.ca>
Path: acf4!cmcl2!phri!rutgers!cs.utexas.edu!news-server.csri.toronto.edu!utgpu!watserv1!ria!rrivax.rri.uwo.ca!lrb
Newsgroups: vmsnet.sources
Organization: Robarts Research Institute -- London Canada Earth
Sender: news@ria.ccs.uwo.ca
Reply-To: lrb@rrivax.rri.uwo.ca
Lines: 431
News-Software: VAX/VMS VNEWS 1.3-4


-+-+-+-+-+-+-+-+ START OF PART 2 -+-+-+-+-+-+-+-+
X *          qv `5B-m`5D datafile `5B  `5B-m`5D datafile .... `5D
X */
X
X/*
X * may 29 1990, changed the check day to be day 0 and not the current day.
X * in function addrec() when working out the year.
X * this is because a persion could be looking at tommorow, or next week but
X * book today and accidentally book NEXT YEAR!
X *
X * also, added a recaluation of leap year if we recalculate the year in the
X * same function
X */
X
Xmain (argc, argv)
X    int     argc;
X    char    *argv`5B`5D;
X`7B   char *DataFile`5BMAXDATAFILE`5D; int DataFilePtr=0, DataFileCnt=0;
X    char *NAME;
X    int MasterFlags`5BMAXDATAFILE`5D;
X    unsigned DataDate = 0;
X
X    long now; struct tm *tms;
X
X    char messagebuff`5B78`5D;
X    int NOTDONE=1;
X    char WEEKCOMMANDS`5B82`5D;
X    char DAYCOMMANDS`5B82`5D;
X    char COMMANDLINE`5B82`5D, *clp;
X    int level = 0;
X    int i;
X    int weekshow = 1;
X    long PPID;
X
X
X    ++argv; --argc;  /* vaxen require this */
X    NAME = argv`5B0`5D;
X    ++argv; --argc;  /* skip over argv`5B0`5D */
X
X    if (argc >= 1)
X    `7B   if (!strcmp(*argv,"-s"))  /* hidden flag to note spawned invocatio
Vn */
X        `7B   PPID=getppid();
X            ++argv; --argc;  /* skip over flag */
X        `7D
X        else PPID = 0;
X    `7D
X
X    if (argc <= 0)
X    `7B   fprintf(stderr,"usage %s `5B-m`5D datafile `5B `5B-m`5D datafile .
V..`5D\n",NAME);
X        exit(127);
X    `7D
X
X
X/* build list of datafiles */
X    for (i=0;(argc && DataFileCnt< MAXDATAFILE);)
X    `7B   if (!strcmp(*argv,"-m"))
X            `7B ++argv; --argc; MasterFlags`5BDataFileCnt`5D=1; `7D
X        else
X            `7B MasterFlags`5BDataFileCnt`5D=0; `7D
X        DataFile`5BDataFileCnt++`5D = *argv;
X        ++argv; --argc;
X    `7D
X
X    if (MasterFlags`5BDataFilePtr`5D)
X        `7Bmstrcpy(WEEKCOMMANDS,MWEEKCOMMANDS);mstrcpy(DAYCOMMANDS,MDAYCOMMA
VNDS);`7D
X    else
X        `7Bmstrcpy(WEEKCOMMANDS,SWEEKCOMMANDS);mstrcpy(DAYCOMMANDS,SDAYCOMMA
VNDS);`7D
X
X    if (DataFileCnt > 1)
X       `7Bstrcat(WEEKCOMMANDS," Change_data");strcat(DAYCOMMANDS," Change_da
Vta");`7D
X
X    signal(SIGINT,SIG_IGN);
X    initscr(); crmode(); raw();
X    initmessage();
X    initBlankOW();
X
X    newdata(&DataDate,DataFile`5BDataFilePtr`5D);  /* set the date flag */
X    NDAYS = readdata(daytimer,dates,DataFile`5BDataFilePtr`5D,NDAYS);
X
X    OneDay=newwin(21,80,0,0); `20
X    OneWeek=newwin(21,80,0,0); overwrite(BlankOW,OneWeek);
X    fillOW(DataFile`5BDataFilePtr`5D);
X    strcpy(COMMANDLINE,WEEKCOMMANDS);
X
X    /*  sprintf(messagebuff,"NDAYS is %d",NDAYS); message2(messagebuff); /*
V */
X
X
X    while (NOTDONE)
X    `7B   char X;
X
X        message1(COMMANDLINE);
X        noecho(); X = mvwgetch(Message,0,0); X = toupper(X); echo();
X
X        time (&now); tms = localtime(&now);
X
X        if (newdata(&DataDate,DataFile`5BDataFilePtr`5D) `7C`7C
X                                 (day2julian(dates`5B0`5D) <= tms->tm_yday)
V )
X        `7B   wstandout(Message);
X            message2("  Reading in data .....");
X            wstandend(Message);
X            NDAYS = readdata(daytimer,dates,DataFile`5BDataFilePtr`5D,NDAYS)
V;
X            if (weekshow) fillOW(DataFile`5BDataFilePtr`5D);
X            else fillOD(level,DataFile`5BDataFilePtr`5D);
X        `7D
X
X        message2(" ");
X
X        if (X=='\r' `7C`7CX=='\n' `7C`7CX==' ')
X            X = ' ';
X        else
X        `7B   clp = strrchr(COMMANDLINE,X);
X            if (!clp) X = '0';
X            else if (*(clp-1) != ' ') X = '0';
X        `7D
X
X        switch (X)
X        `7B   case '?':
X                if (weekshow) online_help(0);
X                else online_help(1);
X            break;
X
X            case 'q': case 'Q':
X            `7B   WINDOW *COVERWIN;
X
X                /* if there is a parent then this is spawned */
X                if (PPID)
X                `7B   COVERWIN = newwin(24,80,0,0);  /* hide screen */
X                    /* attach to parent */
X                    lib$attach(&PPID);
X                    delwin(COVERWIN);  /* uncover -- majik redraw!! */
X                `7D
X                else
X                `7B   /* close up curses */
X                    wclear(OneDay); wclear(OneWeek); endwin();
X                    NOTDONE = 0;
X                `7D
X            `7D
X            break;
X
X            case 'U': case 'u':
X                if (fillOD(level-1,DataFile`5BDataFilePtr`5D)) level--;
X            break;
X
X            case 'd': case 'D':
X                if (fillOD(level+1,DataFile`5BDataFilePtr`5D)) level++;
X            break;
X
X            case 't': case 'T':
X                CurrentDay++;
X                if (CurrentDay >= NDAYS)
X                    `7Bif (NDAYS) CurrentDay = NDAYS-1;  message2("End Of Fi
Vle");`7D
X                else
X                    `7Blevel=0;fillOD(level,DataFile`5BDataFilePtr`5D);`7D
X            break;
X
X            case 'Y': case 'y':
X                CurrentDay--;
X                if (CurrentDay<0)
X                    `7B CurrentDay = 0; message2("Start Of File"); `7D
X                else
X                    `7Blevel=0;fillOD(level,DataFile`5BDataFilePtr`5D);`7D
X            break;
X
X            case 'n': case 'N':
X                CurrentDay+=DAYS_ON_SCREEN;
X                if (CurrentDay >= NDAYS)
X                `7B   CurrentDay -= DAYS_ON_SCREEN;
X                    if (CurrentDay<0) CurrentDay = 0;
X
X                    message2("End Of File");
X                `7D
X                fillOW(DataFile`5BDataFilePtr`5D);
X            break;
X
X            case 'l': case 'L':
X                CurrentDay-=DAYS_ON_SCREEN;
X                if (CurrentDay<0) `7B CurrentDay = 0; message2("Start Of Fil
Ve"); `7D
X
X                fillOW(DataFile`5BDataFilePtr`5D);
X            break;
X
X            case '1':
X                strcpy(COMMANDLINE,DAYCOMMANDS);
X                level = 0; fillOD(level,DataFile`5BDataFilePtr`5D); weekshow
V=0;
X            break;
X
X            case '5':
X                strcpy(COMMANDLINE,WEEKCOMMANDS);
X                fillOW(DataFile`5BDataFilePtr`5D); weekshow=1;
X            break;
X
X            case 'e': case 'E':
X                if (changedata())
X                `7B   if (weekshow) fillOW(DataFile`5BDataFilePtr`5D);
X                    else fillOD(level,DataFile`5BDataFilePtr`5D);
X
X                    wstandout(Message);
X                    message2("  Writing new data .....");
X                    wstandend(Message);
X                    writedata(daytimer,dates,NDAYS,&DataDate,
X                                                       DataFile`5BDataFilePt
Vr`5D);
X                    message2("  ");
X                `7D
X            break;
X
X            case 'p': case 'P':
X                print_sched();
X            break;
X
X            case 'c': case 'C':
X            `7B   char savedate`5BDATESIZE+1`5D;
X                int savejulian;
X
X                if (changedatafile(DataFile,&DataFilePtr,DataFileCnt,
X                                   MasterFlags))
X                `7B   DataDate = 0;
X                    newdata(&DataDate,DataFile`5BDataFilePtr`5D);
X
X                    strcpy(savedate,dates`5BCurrentDay`5D);
X                    savejulian = day2julian(savedate);
X
X                    NDAYS=readdata(daytimer,dates,DataFile`5BDataFilePtr`5D,
VNDAYS);
X                    if (NDAYS)
X                    `7B   if (savejulian < day2julian(dates`5B0`5D) )
X                            CurrentDay = 0;
X                        else if (savejulian > day2julian(dates`5BNDAYS-1`5D)
V)
X                            CurrentDay = NDAYS-1;
X                    `7D
X                    else CurrentDay = 0;
X
X                    if (MasterFlags`5BDataFilePtr`5D)
X                    `7B   mstrcpy(WEEKCOMMANDS,MWEEKCOMMANDS);
X                        mstrcpy(DAYCOMMANDS,MDAYCOMMANDS);
X                    `7D
X                    else
X                    `7B   mstrcpy(WEEKCOMMANDS,SWEEKCOMMANDS);
X                        mstrcpy(DAYCOMMANDS,SDAYCOMMANDS);
X                    `7D
X
X                    strcat(WEEKCOMMANDS," Change_data");
X                    strcat(DAYCOMMANDS," Change_data");
X
X                    if (weekshow)
X                    `7B   fillOW(DataFile`5BDataFilePtr`5D);
X                        strcpy(COMMANDLINE,WEEKCOMMANDS);
X                    `7D
X                    else
X                    `7B   fillOD(level,DataFile`5BDataFilePtr`5D);
X                        strcpy(COMMANDLINE,DAYCOMMANDS);
X                    `7D
X
X                `7D
X            `7D break;
X            `20
X/*
X * best way to redraw seem to be a complete shutdown of windows and restart
X */
X            case 'r': case 'R':
X                wclear(OneDay); wclear(OneWeek);
X                delwin(OneDay); delwin(OneWeek); delwin(Message);
X                endwin();
X
X                initscr(); crmode(); raw();
X                initmessage(); initBlankOW();
X                OneDay=newwin(21,80,0,0);`20
X                OneWeek=newwin(21,80,0,0); overwrite(BlankOW,OneWeek);
X
X                if (weekshow) `7Bwclear(OneWeek);fillOW(DataFile`5BDataFileP
Vtr`5D);`7D
X                else `7Bwclear(OneDay);fillOD(level,DataFile`5BDataFilePtr`5
VD);`7D
X            break;
X
X            case 's':case 'S':
X                shotime();
X            break;
X
X            case ' ': break;
X
X            default:
X                message2("BAD CHOICE");
X            break;
X        `7D
X
X    `7D /* while (NOTDONE) */
X
X    exit(1);
X
X`7D
X
X
X
Xinitmessage()
X`7B   Message=newwin(3,80,21,0);
X    mvwaddstr(Message,0,0,":::::::::::::::::::::::::::::::::::::::::::::::::
V:::::::::::::::::::::::::::::::");
X`7D
X
X/* message 1 is the command line
X * and to aid the user we highlight the first letter of each word
X */
Xmessage1(S)
X    char *S;
X`7B   wmove(Message,1,0); wclrtoeol(Message); wmove(Message,1,0);
X
X    while (*S)
X    `7B   waddch(Message,*S);
X        if (*(S++) == ' ') wstandout(Message);
X        else wstandend(Message);
X    `7D
X
X    wstandend(Message);
X    wrefresh(Message);
X`7D
X
Xmessage2(S)
X    char *S;
X`7B   wmove(Message,2,0); wclrtoeol(Message);
X    mvwaddstr(Message,2,0,S);
X    wrefresh(Message);
X`7D
X
X
X
X
XinitBlankOW()
X`7B   BlankOW=newwin(21,80,0,0);
X
X    mvwaddstr(BlankOW,0,0,"                                     - TO -
V                 ");
X    mvwaddstr(BlankOW,1,0,"
V                                                            ");
X
X    mvwaddstr(BlankOW, 2,0,"    --------          --------       -------
V        --------          --------");
X    mvwaddstr(BlankOW, 3,0,"001122334455 `7C  `7C 001122334455 `7C 001122334
V455 `7C 001122334455 `7C  `7C 001122334455");
X    mvwaddstr(BlankOW, 4,0,"050505050505 `7C  `7C 050505050505 `7C 050505050
V505 `7C 050505050505 `7C  `7C 050505050505");
X    mvwaddstr(BlankOW, 5,0,"------------------------------------------------
V------------------------------");
X    mvwaddstr(BlankOW, 6,0,"             `7C 8`7C              `7C
V              `7C              `7C 8`7C             ");
X    mvwaddstr(BlankOW, 7,0,"             `7C 9`7C              `7C
V              `7C              `7C 9`7C             ");
X    mvwaddstr(BlankOW, 8,0,"             `7C10`7C              `7C
V              `7C              `7C10`7C             ");
X    mvwaddstr(BlankOW, 9,0,"             `7C11`7C              `7C
V              `7C              `7C11`7C             ");
X    mvwaddstr(BlankOW,10,0,"             `7C12`7C              `7C
V              `7C              `7C12`7C             ");
X    mvwaddstr(BlankOW,11,0,"             `7C 1`7C              `7C
V              `7C              `7C 1`7C             ");
X    mvwaddstr(BlankOW,12,0,"             `7C 2`7C              `7C
V              `7C              `7C 2`7C             ");
X    mvwaddstr(BlankOW,13,0,"             `7C 3`7C              `7C
V              `7C              `7C 3`7C             ");
X    mvwaddstr(BlankOW,14,0,"             `7C 4`7C              `7C
V              `7C              `7C 4`7C             ");
X    mvwaddstr(BlankOW,15,0,"             `7C 5`7C              `7C
V              `7C              `7C 5`7C             ");
X    mvwaddstr(BlankOW,16,0,"             `7C 6`7C              `7C
V              `7C              `7C 6`7C             ");
X    mvwaddstr(BlankOW,17,0,"             `7C 7`7C              `7C
V              `7C              `7C 7`7C             ");
X    mvwaddstr(BlankOW,18,0,"             `7C 8`7C              `7C
V              `7C              `7C 8`7C             ");
X    mvwaddstr(BlankOW,19,0,"             `7C 9`7C              `7C
V              `7C              `7C 9`7C             ");
X    mvwaddstr(BlankOW,20,0,"             `7C10`7C              `7C
V              `7C              `7C10`7C             ");
X
X    return;
X`7D
X
X
X
X
XfillOW(datafile)
X    char *datafile;
X`7B   int i, j, k;
X    int xpos, ypos, slotnum;
X
X    overwrite(BlankOW,OneWeek);
X
X    if (NDAYS)
X    `7B   mvwaddstr(OneWeek,0,5,weekdays`5Batoi(dates`5BCurrentDay`5D+9)`5D)
V;
X        mvwaddstr(OneWeek,0,15,  monthnames`5Batoi(dates`5BCurrentDay`5D+3)-
V1`5D  );
X        mvwaddch(OneWeek,0,25,  dates`5BCurrentDay`5D`5B6`5D  );
X        mvwaddch(OneWeek,0,26,  dates`5BCurrentDay`5D`5B7`5D  );
X        mvwaddstr(OneWeek,0,28,  "19"  );
X        mvwaddch(OneWeek,0,30,  dates`5BCurrentDay`5D`5B0`5D  );
X        mvwaddch(OneWeek,0,31,  dates`5BCurrentDay`5D`5B1`5D  );
X
X        i = CurrentDay + DAYS_ON_SCREEN-1;
X        if (i >= NDAYS) i = NDAYS-1;
X
X        mvwaddstr(OneWeek,0,48,weekdays`5Batoi(dates`5Bi`5D+9)`5D);
X        mvwaddstr(OneWeek,0,58,  monthnames`5Batoi(dates`5Bi`5D+3)-1`5D  );
X        mvwaddch(OneWeek,0,68,  dates`5Bi`5D`5B6`5D  );
X        mvwaddch(OneWeek,0,69,  dates`5Bi`5D`5B7`5D  );
X        mvwaddstr(OneWeek,0,73,  "19"  );
X        mvwaddch(OneWeek,0,75,  dates`5Bi`5D`5B0`5D  );
X        mvwaddch(OneWeek,0,76,  dates`5Bi`5D`5B1`5D  );
X    `7D
X
X    wstandout(OneWeek);
X    mvwaddstr(OneWeek,1, 40-strlen(datafile)/2 ,datafile);
X    wstandend(OneWeek);
X
X    for (i=CurrentDay; (i<CurrentDay+DAYS_ON_SCREEN)&&(i<NDAYS); i++)
X    `7B   switch (i-CurrentDay)
X        `7B   case 0: xpos =  0; break; case 1: xpos = 18; break;
+-+-+-+-+-+-+-+-  END  OF PART 2 +-+-+-+-+-+-+-+-
