⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 textpro.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/******************************************************************************//*FUNCTION HelpFunction : (H/L function help)                               *//* Input : Multiple or no topic requests may be passed to the help facility   *//*         from the top level via a "stack" accessed by the          *//*         system routines num_args() and rstring().                          *//* Output : This function loads the help file specified in setup.h into a     *//*          a hierarchical tree structure using the routines of LOOKUP.C.     *//*          It then queries the user for topics, and, using the LOOKUP        *//*          routines, branches through the tree, displaying information where *//*          appropriate.  The function returns control once the user          *//*          has indicated an exit from the help tree.                         *//*                                                                            *//* For usage see external documentation.                                      *//******************************************************************************/#if HELP_FUNCTIONSgloble void HelpFunction(  void *theEnv)  {   int status;                     /*Return code from the lookup routines */   FILE *fp;                       /*Pointer in to the help file stream   */   struct topics *main_topic,      /*Pointer to the first requested topic */                 *tptr;            /*Used in deallocating the topic list  */   char buf[256],   /*Buffer for storing input strings from the help file */        *menu[1];   /*Buffer for the name of the current main topic       */#if ! WINDOW_INTERFACE   char termbuf[2]; /*Buffer for storing the terminators of a scroll      */   int line_cnt;    /*Line count used for scrolling purposes              */#endif   if (TextProcessingData(theEnv)->HELP_INIT == FALSE)     {      if (TextProcessingData(theEnv)->help_file == NULL)        {         TextProcessingData(theEnv)->help_file = (char *) gm2(theEnv,strlen(HELP_DEFAULT) + 1);         genstrcpy(TextProcessingData(theEnv)->help_file,HELP_DEFAULT);        }      EnvPrintRouter(theEnv,WDIALOG,"Loading help file entries from ");      EnvPrintRouter(theEnv,WDIALOG,TextProcessingData(theEnv)->help_file);      EnvPrintRouter(theEnv,WDIALOG,".\nPlease wait...\n");      status = TextLookupFetch(theEnv,TextProcessingData(theEnv)->help_file);      if (status <= 0)        {         return;        }      else        {         /* ================================================================            Enables logical name "whelp" as the destination for all help I/O            ================================================================ */         EnvAddRouter(theEnv,"whelp",10,RecognizeHelpRouters,HelpPrint,                    HelpGetc,HelpUngetc,NULL);         TextProcessingData(theEnv)->HELP_INIT = TRUE;        }     }   EnvActivateRouter(theEnv,"whelp");   /* ====================================================================      The root node of the help-tree is MAIN (see external documentation.)      Add this node to the front of the initial topic request list given      by the user on the top level command line.      ==================================================================== */   main_topic = (struct topics *) gm2(theEnv,(int) sizeof(struct topics));   genstrcpy(main_topic->name,"MAIN");   main_topic->next = GetCommandLineTopics(theEnv);   main_topic->end_list = NULL;   EnvPrintRouter(theEnv,"whelp","\n");   /*============================*/   /*Process user topic requests */   /*============================*/   do     {      fp = FindTopicInEntries(theEnv,TextProcessingData(theEnv)->help_file,main_topic,menu,&status);      if (status == NO_FILE)        {         PrintErrorID(theEnv,"TEXTPRO",1,FALSE);         EnvPrintRouter(theEnv,WERROR,"Unable to access help file.\n");         break;        }      if (status == EXIT)        break;      if (status == NO_TOPIC)        {         if (fp == NULL)           {            /*===================================================*/            /*The lookup routines return the file location of the*/            /*current main topic if the requested topic is not   */            /*found.  The help-tree has one root: MAIN (see      */            /*external docs).  This topic should always be       */            /*available.  Thus, if the topic was not found and   */            /*there is no current menu, the help-file has been   */            /*tampered with and should be corrected.             */            /*===================================================*/            EnvPrintRouter(theEnv,"whelp","Root entry \"MAIN\" not found in ");            EnvPrintRouter(theEnv,"whelp",TextProcessingData(theEnv)->help_file);            EnvPrintRouter(theEnv,"whelp",".\nSee external documentation.\n");            break;           }         EnvPrintRouter(theEnv,"whelp","\nSorry, no information available.\n\n");        }      if (status != BRANCH_UP)        {#if ! WINDOW_INTERFACE         line_cnt = 0;#endif         /*======================================================*/         /*Print lines from the information entry stopping after */         /*every screenful of lines.  The user at that point has */         /*the option to continue or abort the entry to continue */         /*at the current menu level.                            */         /*======================================================*/         while (grab_string(theEnv,fp,buf,256) != NULL)           {#if ! WINDOW_INTERFACE            if (line_cnt >= (SCREEN_LN + 1))              {               EnvPrintRouter(theEnv,"whelp","PRESS <RETURN> FOR MORE. ");               EnvPrintRouter(theEnv,"whelp","PRESS <A>,<RETURN> TO ABORT.");               RouterData(theEnv)->CommandBufferInputCount = 0;               do                 {                  termbuf[0] = (char) EnvGetcRouter(theEnv,"whelp");                  if (termbuf[0] != LNFEED)                    {                     if (termbuf[0] == 'a')                       termbuf[0] = 'A';                     if (termbuf[0] != '\b')                       RouterData(theEnv)->CommandBufferInputCount++;                     else if (RouterData(theEnv)->CommandBufferInputCount != 0)                       RouterData(theEnv)->CommandBufferInputCount--;                     termbuf[1] = (char) EnvGetcRouter(theEnv,"whelp");                    }                 }               while ((termbuf[0] != LNFEED) &&                      (termbuf[0] != 'A'));               RouterData(theEnv)->CommandBufferInputCount = -1;               line_cnt = 0;               if (termbuf[0] == 'A')                 {                  GenClose(theEnv,fp);                  break;                 }              }            line_cnt++;#endif            EnvPrintRouter(theEnv,"whelp",buf);           }        }      else if (fp != NULL)        /*==========================================================*/        /*If the user branched-up the help-tree, don't reprint that */        /*menu.  However, the help file still needs to be closed.   */        /*==========================================================*/        GenClose(theEnv,fp);      main_topic = AskForNewHelpTopic(theEnv,main_topic,menu);      if (EvaluationData(theEnv)->HaltExecution)        {         while (status != EXIT)           if ((fp = GetEntries(theEnv,TextProcessingData(theEnv)->help_file,menu,NULL,&status)) != NULL)             GenClose(theEnv,fp);        }     } while (status != EXIT);   EnvDeactivateRouter(theEnv,"whelp");   /*========================================================*/   /*Release any space used by the user's topic request list */   /*========================================================*/   while (main_topic != NULL)     {      tptr = main_topic;      main_topic = main_topic->next;      rm(theEnv,(void *) tptr,(int) sizeof(struct topics));     }  }/***************************************************************************//*FUNCTION HelpPathFunction : (function help-path)                         *//* Input : Via the argument "stack", the name of the new help entries    *//*         file, or no input.                                             *//* Output : This function redefines the lookup file for the help facility. *//*          If no argument is given, it displays the current file name.    *//***************************************************************************/globle void HelpPathFunction(  void *theEnv)  {   char *help_name;   DATA_OBJECT arg_ptr;   if (EnvRtnArgCount(theEnv) == 0)     {      EnvPrintRouter(theEnv,WDIALOG,"The current help entries file is ");      if (TextProcessingData(theEnv)->help_file != NULL)        EnvPrintRouter(theEnv,WDIALOG,TextProcessingData(theEnv)->help_file);      else        EnvPrintRouter(theEnv,WDIALOG,HELP_DEFAULT);      EnvPrintRouter(theEnv,WDIALOG,"\n");     }   else     {      if (TextProcessingData(theEnv)->help_file != NULL)        {         if (TextProcessingData(theEnv)->HELP_INIT == TRUE)           {            EnvPrintRouter(theEnv,WDIALOG,"Releasing help entries from file ");            EnvPrintRouter(theEnv,WDIALOG,TextProcessingData(theEnv)->help_file);            EnvPrintRouter(theEnv,WDIALOG,"...\n");            TextLookupToss(theEnv,TextProcessingData(theEnv)->help_file);            EnvDeleteRouter(theEnv,"whelp");            TextProcessingData(theEnv)->HELP_INIT = FALSE;           }         rm(theEnv,(void *) TextProcessingData(theEnv)->help_file,strlen(TextProcessingData(theEnv)->help_file) + 1);        }      if (EnvArgTypeCheck(theEnv,"help-path",1,SYMBOL_OR_STRING,&arg_ptr) == FALSE) return;      help_name = DOToString(arg_ptr);      TextProcessingData(theEnv)->help_file = (char *) gm2(theEnv,strlen(help_name) + 1);      genstrcpy(TextProcessingData(theEnv)->help_file,help_name);      EnvPrintRouter(theEnv,WDIALOG,"Help entries file reset to ");      EnvPrintRouter(theEnv,WDIALOG,help_name);      EnvPrintRouter(theEnv,WDIALOG,"\n");     }  }#endif#if TEXTPRO_FUNCTIONS/***************************************************************************//*FUNCTION FetchCommand : (H/L function fetch)                             *//* Input : Name of the file to be stored in the lookup table - passed via  *//*         the argument "stack" and result buffer                          *//* Output : This function loads a file into the internal lookup table and  *//*          returns a (float) boolean flag indicating failure or success.  *//***************************************************************************/globle void FetchCommand(  void *theEnv,  DATA_OBJECT *result)  {   int load_ct;          /*Number of entries loaded */   DATA_OBJECT arg_ptr;   result->type = SYMBOL;   result->value = EnvFalseSymbol(theEnv);   if (EnvArgTypeCheck(theEnv,"fetch",1,SYMBOL_OR_STRING,&arg_ptr) == FALSE)      return;   load_ct = TextLookupFetch(theEnv,DOToString(arg_ptr));   if (load_ct <= 0)     {      if (load_ct == 0)        {         PrintErrorID(theEnv,"TEXTPRO",3,FALSE);         EnvPrintRouter(theEnv,WERROR,"No entries found.\n");        }      return;     }   result->type = INTEGER;   result->value = (void *) EnvAddLong(theEnv,(long long) load_ct);  }/******************************************************************************//*FUNCTION PrintRegionCommand : (H/L function print-region)                 *//* Input : Via the argument "stack", logical name for the output, the name of the *//*         file to be accessed, and the name of the topic(s) to be looked up. *//* Output : This function accesses a previously loaded file and prints the    *//*          information of the topic entry requested to the screen.  The tree *//*          structure must currently be at the correct level in order for the *//*          topic to be accessed.  To branch down the tree, each topic in the *//*          path to the one desired must be named.  Multiple arguments are    *//*          allowed as in the help facility (see the external documentation.) *//*          To branch up the tree, the special topic character `^' must be    *//*          specified for each upwards branch.  Giving no topic name will     *//*          cause a single branch-up in the tree.  The `?' character given at *//*          the end of a path will return the current main topic menu.        *//*                                                                            *//* For usage, see the external documentation.                                 *//******************************************************************************/globle int PrintRegionCommand(  void *theEnv)  {   struct topics *params,    /*Lookup file and list of topic requests  */                 *tptr;      /*Used in deallocating the parameter list */   char buf[256];            /*Buffer for the topic entry strings      */   FILE *fp;                 /*Stream for the input file               */   char *menu[1];            /*Buffer for the current menu name        */   int status,               /*Lookup status return code               */       com_code;             /*Completion flag                         */   params = GetCommandLineTopics(theEnv);   fp = FindTopicInEntries(theEnv,params->next->name,params->next->next,menu,&status);   if ((status != NO_FILE) && (status != NO_TOPIC) && (status != EXIT))     {      if (strcmp(params->name,"t") == 0)        genstrcpy(params->name,"stdout");      EnvPrintRouter(theEnv,params->name,"\n");      while (grab_string(theEnv,fp,buf,256) != NULL)        EnvPrintRouter(theEnv,params->name,buf);      com_code = TRUE;     }   else     {      /* ==================================================================         On NO_TOPIC results, the file is left open to point to the current         menu.  This used as a check by the Help System.  In the case of         print-region, however, we need to always make sure the file is         closed.         ================================================================== */      if (fp != NULL)        GenClose(theEnv,fp);      com_code = FALSE;     }   /* =======================================================      Release any space used by the user's topic request list      ======================================================= */   while (params != NULL)     {      tptr = params;      params = params->next;      rm(theEnv,(void *) tptr,(int) sizeof(struct topics));     }   return(com_code);  }/******************************************************************************//*FUNCTION GetRegionCommand : (H/L functionget-region)                 *//******************************************************************************/globle void *GetRegionCommand(  void *theEnv)  {   struct topics *params,    /*Lookup file and list of topic requests  */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -