#include #include #include #include #include "MRDateReq.h" #include "minrexx.h" int Dispatch(); void RexxExit(), RexxGetDate(), RexxGetFullDate(), RexxGetDayName(), RexxGetFormat(), RexxGetTime(), RexxRequest(), RexxSetFullDate(), RexxSetFormat(), RexxSetPrompt(); void StrUpper(); int commandError; MRDatePacket *datePacket; char firstCommand[256]; int keepGoing = 1; static char prompt[256] = "Enter the date: "; long rexxBit; /* rexx signal bit */ static char *formatNames[FORMAT_MAX + 1] = { "DOS", "International", "USA", "Canadian" }; struct NewWindow newWindow = { 20,20,320,140,0,1, /* IDCMP Flags */ MENUVERIFY | RMBTRAP | GADGETUP | GADGETDOWN, /* Flags */ WINDOWDRAG, NULL, /* First gadget */ NULL, /* Checkmark */ (UBYTE *)"ARexx Date Requester",/* Window title */ NULL, /* No custom streen */ NULL, /* Not a super bitmap window */ 0,0,640,200, /* Not used, but set up anyway */ WBENCHSCREEN }; struct rexxCommandList rcl[] = { { "exit", (APTR) &RexxExit }, { "getdate", (APTR) &RexxGetDate }, { "getfulldate", (APTR) &RexxGetFullDate }, { "getdayname", (APTR) &RexxGetDayName }, { "getformat", (APTR) &RexxGetFormat }, { "gettime", (APTR) &RexxGetTime }, { "request", (APTR) &RexxRequest }, { "setfulldate", (APTR) &RexxSetFullDate }, { "setformat", (APTR) &RexxSetFormat, }, { "setprompt", (APTR) &RexxSetPrompt }, { NULL, NULL } }; struct ArpBase *ArpBase; struct GfxBase *GfxBase; struct IntuitionBase *IntuitionBase; main(argc, argv) int argc; char **argv; { static char *arpNotOpen = "The ARP library must be installed in the LIBS: directory!"; ULONG class; int i; char *portName; struct IntuiMessage *wMsg; ArpBase = (struct ArpBase *) OpenLibrary(ArpName, ArpVersion); if (ArpBase == NULL) { Write(Output(), arpNotOpen , (long) sizeof(arpNotOpen)); goto done; } GfxBase = (struct GfxBase *) ArpBase->GfxBase; IntuitionBase = (struct IntuitionBase *) ArpBase->IntuiBase; /* Create and initialize date packet. */ datePacket = CreateMRDatePacket(NULL, FORMAT_USA, 1); if (argc == 2) portName = argv[1]; else portName = "mrdatereq"; rexxBit = upRexxPort(portName, rcl, NULL, &Dispatch); while (keepGoing) { Wait(rexxBit); dispRexxPort(); } done: dnRexxPort(); /* Dispose of the rexx port. */ } /* FUNCTION Dispatch - dispatch rexx command. SYNOPSIS int Dispatch(msg, cmd, parameters) struct RexxMsg *msg; struct rexxCommandList *cmd; char *parameters; DESCRIPTION Dispatch() invokes the appropriate function for the command described by , passing it the and . It then replies to the with a result code indicating the success or failure of the command. */ int Dispatch(msg, cmd, params) struct RexxMsg *msg; struct rexxCommandList *cmd; char *params; { commandError = 0; while (*params == ' ') ++params; /* Dispatch to the user's function. */ ( (int (*)() )(cmd->userdata))(msg, params); if (commandError) { /* We got an error. */ replyRexxCmd(msg, (long) commandError, 0L, NULL); } return 0; /* Return value isn't used! */ } /* FUNCTION RexxExit - process an exit command. SYNOPSIS void RexxExit(msg, p) struct RexxMsg *msg; char *p; DESCRIPTION RexxExit() is called when the macro sends an 'exit' command. This function simply clears the keepGoing flag, terminating this program. */ void RexxExit(msg, p) struct RexxMsg *msg; char *p; { keepGoing = 0; } /* FUNCTION RexxGetDate - retrieve the formatted date string. SYNOPSIS void RexxGetDate(msg, p) struct RexxMsg *msg; char *p; DESCRIPTION RexxGetDate is invoked with the macro issues a 'getdate' command. This is normally done after a 'request' command. The text string representing the date component (not time) is returned via the result variable. */ void RexxGetDate(msg, p) { replyRexxCmd(msg, 0L, 0L, datePacket->ARPDatePacket.dat_StrDate); } /* FUNCTION RexxGetFullDate - define a compound symbol with all date components. SYNOPSIS void RexxGetFullDate(msg, p) struct RexxMsg *msg; char *p; DESCRIPTION RexxGetFullDate is invoked when the macro program issues a 'getfulldate' command. The string pointed to by

is used as the stem for a compound variable. The components of this variable are: 1 - Year (19XX) 2 - Month (1 - 12) 3 - Day (1 - 31) 4 - Hour (00 - 59) 5 - Minute (00 - 59) 6 - Second (00 - 59) 7 - Weekday (0 - 6, 0 => Sunday) For example, assuming a stem variable name of "mydate" and a date selection of 5-Oct-1989, mydate.1 == 1989 mydate.2 == 10 mydate.3 == 5 ...and so on. If a failure is detected, the result variable will contain a descriptive message on exit. */ void RexxGetFullDate(msg, p) struct RexxMsg *msg; char *p; { LONG error; int i; int nValue; char fullSym[256]; char value[81]; for (i = 1; i <= 7; ++i) { switch (i) { case 1: nValue = datePacket->newDate.Dyear; break; case 2: nValue = datePacket->newDate.Dmonth; break; case 3: nValue = datePacket->newDate.Dday; break; case 4: nValue = datePacket->newDate.Dhour; break; case 5: nValue = datePacket->newDate.Dminute; break; case 6: nValue = datePacket->newDate.Dsecond; break; case 7: nValue = datePacket->newDate.Dweekday; } sprintf(fullSym, "%s.%d", p, i); StrUpper(fullSym); sprintf(value, "%d", nValue); if (error = SetRexxVar(msg, fullSym, value, strlen(value)) ) { sprintf(value, "Failed to set date component '%s'", fullSym); replyRexxCmd(msg, error, 0L, value); break; } } } /* FUNCTION RexxGetDayName - get the day name for the selected date. SYNOPSIS void RexxGetDayName(msg, p) struct RexxMsg *msg; char *p; DESCRIPTION RexxGetDayName is invoked when the macro program issues a 'getdayname' command. This is normally done after the 'request' command has been issued. The full name of the day (Monday, Tuesday, etc.) is returned via the result variable. */ void RexxGetDayName(msg, p) struct RexxMsg *msg; char *p; { replyRexxCmd(msg, 0L, 0L, datePacket->ARPDatePacket.dat_StrDay); } /* FUNCTION RexxGetFormat - get the date format name string. SYNOPSIS void RexxGetFormat(msg, p) struct RexxMsg *msg; char *p; DESCRIPTION RexxGetFormat is called when the macro program issues a 'getdateformat' command. A name string describing the date format is returned via the result variable. The current format names are: "DOS" - DD-MMM-YYYY "International" - YY/MM/DD "USA" - MM/DD/YY "Canadian" - DD/MM/YY */ void RexxGetFormat(msg, p) struct RexxMsg *msg; char *p; { replyRexxCmd(msg, 0L, 0L, formatNames[datePacket->ARPDatePacket.dat_Format]); } /* FUNCTION RexxGetTime - get the time component of the selected date. SYNOPSIS void RexxGetTime(msg, p) struct RexxMsg *msg; char *p; DESCRIPTION RexxGetTime is invoked when the macro program issues a 'gettime' command, normally after a 'request' command. The time component of the date is returned via the result variable formatted as "HH:MM:DD". */ void RexxGetTime(msg, p) struct RexxMsg *msg; char *p; { replyRexxCmd(msg, 0L, 0L, datePacket->ARPDatePacket.dat_StrTime); } /* FUNCTION RexxRequest - pop up the date requester and wait for user input. SYNOPSIS void RexxDateRequest(msg, p) struct RexxMsg *msg; char *p; DESCRIPTION RexxDateRequest is invoked when the macro program issues a 'request' command. A new window is first opened, then the date requester is displayed in the window. The result code variable, rc, and the result string, result, will contain information if the request fails. */ void RexxRequest(msg, p) struct RexxMsg *msg; char *p; { long result = 0; struct Window *window; window = OpenWindow(&newWindow); if (! window ) result = RC_FATAL; else { datePacket->window = window; datePacket->prompt = prompt; if (MRDateRequest(datePacket) ) result = RC_WARN; CloseWindowSafely(window, FALSE); datePacket->window = NULL; } if (result) replyRexxCmd(msg, result, 0L, "Date request failed!"); } /* FUNCTION RexxSetFullDate - set all date components. SYNOPSIS void RexxSetFullDate(msg, p) struct RexxMsg *msg; DESCRIPTION RexxSetFullDate() is invoked when the macro program issues a 'setfulldate' command. The parameter,

, is expected to point to the base name of a compound variable. The elements of this variable are expected to conform to the layout expected by RexxGetFullDate(). Only elements 1-6 are used, since the day of the week is implicit in the other components. */ void RexxSetFullDate(msg, p) struct RexxMsg *msg; char *p; { LONG error; int i; int nValue; char result[81]; char *symValue; char fullSym[81]; for (i = 1; i <= 6; ++i) { sprintf(fullSym, "%s.%d", p, i); StrUpper(fullSym); if (error = GetRexxVar(msg, fullSym, symValue)) { sprintf(result, "Failed to get date component '%s'", fullSym); replyRexxCmd(msg, error, 0L, result); break; } nValue = Atol(symValue); switch (i) { case 1: datePacket->newDate.Dyear = nValue; break; case 2: datePacket->newDate.Dmonth = nValue; break; case 3: datePacket->newDate.Dday = nValue; break; case 4: datePacket->newDate.Dhour = nValue; break; case 5: datePacket->newDate.Dminute = nValue; break; case 6: datePacket->newDate.Dsecond = nValue; break; } } } /* FUNCTION RexxSetFormat - set the desired date format. SYNOPSIS void RexxSetFormat(msg, p) struct RexxMsg *msg; char *p; DESCRIPTION RexxSetFormat is invoked when the macro program issues a 'setformat' command. The string parameter,

, is expected to point to a format name string (or unique prefix of one), as described under RexxGetFormat. Example: 'setformat' "Int" causes the date format to be set to "International". */ void RexxSetFormat(msg, p) struct RexxMsg *msg; char *p; { long length; int result = RC_ERROR; int i; while (*p == ' ') ++p; /* Throw away leading blanks. */ length = strlen(p); for (i = 0; i <= FORMAT_MAX; ++i) { if (! Strncmp(p, formatNames[i], length)) { result = 0; datePacket->ARPDatePacket.dat_Format = i; break; } } commandError = result; } /* FUNCTION RexxSetPrompt - set date requester prompt string. SYNOPSIS void RexxSetPrompt(msg, p) struct RexxMsg *msg; char *p; DESCRIPTION RexxSetPrompt() copies the text pointed to by

into the package prompt variable. The next time RexxRequestDate is called, the prompt will be displayed in the date requester. */ void RexxSetPrompt(msg, p) struct RexxMsg *msg; char *p; { if (p) strcpy(prompt, p); else *prompt = '\0'; } /* FUNCTION StrUpper - convert string to upper case. SYNOPSIS void StrUpper(string) char *string; DESCRIPTION StrUpper converts all lower case characters in to upper case. The conversion is done in-place. */ void StrUpper(string) char *string; { char *p; for (p = string; *p; ++p) *p = toupper(*p); }