/******************* help.c ******************** * * * * * v1.19 written by Koessi * * * * 05 Oct 94 : added "PRT/K" * * * * Source Copyright RBF Software * * * * use within PD releases encouraged. * * Any alterations may not be released, however, * * you are requested to send your ideas on to us * * * * Shareware/Commercial use requires a licence * * * * this is help showing the usage of * * "hyper" from inside another program * * * * Compile with DICE: * * dcc help.c -ohelp -rr -2.0 * * * *************************************************/ #include #include #include #include #include #include /* Prototypes */ #include #include #include #include #define MSG struct Message #define RMSG struct RexxMsg #define MSGP struct MsgPort #define SIZE 32 extern void SendRxMsg(char *); extern __stkargs void _main(short, char *); extern int main(int, char **); #define NUMARGS 13 #define ANSI_COL_2 "\x9B32m" #define ANSI_RESET "\x9B0m" const char version[] = "$VER: " "Help 1.19 ("__DATE__") © RBF Software"; const char exthelpstr[] = ANSI_COL_2 "\nUsage:\tHelp [FILENAME] [DOC chapter] [SCREEN publicscreen]\n" "\t\t[PRT filename] [X n] [Y n] [WIDTH n] [HEIGHT n]\n" "\t\t[GADS ON|OFF] [FONT name.font] [SLEEP] [QUIT]\n" ANSI_RESET "\n\tcall Hyper's ARexx-port:\n" "\tFILENAME\tshould be a hyper-text-file\n" "\tDOC/K\t\trequest a special chapter\n" "\tSCREEN/K\tmake Hyper appear on that screen\n" "\tPRT/K\t\tsend print output to this (default \"prt:\")\n" "\tX/N, Y/N\n" "\tW=WIDTH/N\n" "\tH=HEIGHT/N\tset position&size for the window\n" "\tG=GADS/T\ttoggle gadgets ON/OFF (default OFF)\n" "\tF=FONT/K\tuse this font to render text\n" "\tonly if Hyper is already running:\n" "\tS=SLEEP/S\tstart Hyper into the background\n" "\tQ=QUIT/S\tend Hyper and free memory\n" "\t\t\t"; const char template[] = "FILENAME,DOC/K,SCREEN/K,PRT/K,X/N,Y/N,W=WIDTH/N,H=HEIGHT/N," "G=GADS/T,F=FONT/K,S=SLEEP/S,Q=QUIT/S"; const char portname[] = "HYPER_RXPORT"; const char command[] = "SYS:Utilities/hyper S"; /* hardcoded path :-| */ const char error[] = "\n\n"ANSI_COL_2"***ERROR"ANSI_RESET; const void *argarray[NUMARGS] = {0}; /* holds argptrs */ char *taskname = &version[6]; /************************************************* * * * * * FUNCTION: _main * * * * * * INPUT: short len * * char *arg * * * * OUTPUT: __stkargs void * * * * NOTE: * * * *************************************************/ __stkargs void _main(short len, char *arg) { PutStr(ANSI_COL_2); PutStr(taskname); PutStr(ANSI_RESET"\n"); int errorcode = ERROR_REQUIRED_ARG_MISSING; if (len > 1) /* args ? */ { struct RDArgs *rdargs; if (rdargs = AllocVec(sizeof(struct RDArgs), MEMF_PUBLIC|MEMF_CLEAR)) { rdargs->RDA_ExtHelp = exthelpstr; /* shown if 2 x ? */ struct RDArgs *rda; if (rda = ReadArgs(template, argarray, rdargs)) { long **argptr = argarray; for (BYTE i = 0; i < NUMARGS; ++i) { if (argptr && *argptr) { errorcode = RETURN_OK; break; } ++argptr; } if (errorcode == RETURN_OK) { MSGP *port; if (!(port = FindPort(portname))) { SystemTags(command, SYS_Asynch, TRUE, SYS_Output, NULL, SYS_Input, NULL, TAG_DONE); for (BYTE i = 10; i; --i) { Delay(20); if (port = FindPort(portname)) break; } } PutStr("\n"); if (port) SendRxMsg(arg); else errorcode = ERROR_OBJECT_NOT_FOUND; } FreeArgs(rda); } else errorcode = IoErr(); FreeVec(rdargs); } else errorcode = ERROR_NO_FREE_STORE; } if (errorcode) PrintFault(errorcode, error); } /************************************************* * * * * * FUNCTION: SendRxMsg * * * * * * INPUT: char *msgtxt * * * * OUTPUT: void * * * * NOTE: like cmdline * * * *************************************************/ void SendRxMsg(char *msgtxt) { MSGP *reply_port; if (reply_port = CreateMsgPort()) { void *rx_msg; /* casted to parts of a RexxMsg struct */ if (rx_msg = AllocVec(sizeof(RMSG), MEMF_PUBLIC|MEMF_CLEAR)) { ((struct Node *)rx_msg)->ln_Type = NT_MESSAGE; ((MSG *)rx_msg)->mn_ReplyPort = reply_port; ((MSG *)rx_msg)->mn_Length = sizeof(RMSG); ((RMSG *)rx_msg)->rm_Args[0] = msgtxt; Forbid(); MSGP *rx_port; if (rx_port = (MSGP *)FindPort(portname)) { PutMsg(rx_port, (MSG *)rx_msg); Permit(); WaitPort(reply_port); ReplyMsg(GetMsg(reply_port)); } else Permit(); FreeVec(rx_msg); } DeleteMsgPort(reply_port); } }