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

📄 textpro.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
                 *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               */   char *theString = NULL;   void *theResult;   size_t oldPos = 0;   size_t oldMax = 0;   size_t sLength;   params = GetCommandLineTopics(theEnv);   fp = FindTopicInEntries(theEnv,params->name,params->next,menu,&status);   if ((status != NO_FILE) && (status != NO_TOPIC) && (status != EXIT))     {      while (grab_string(theEnv,fp,buf,256) != NULL)        theString = AppendToString(theEnv,buf,theString,&oldPos,&oldMax);     }   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);     }   /* =======================================================      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));     }   if (theString == NULL)     { theResult = EnvAddSymbol(theEnv,""); }   else     {      sLength = strlen(theString);      if ((sLength > 0) &&          (((theString[sLength-1] == '\r') && (theString[sLength-2] == '\n'))		   ||           ((theString[sLength-1] == '\n') && (theString[sLength-2] == '\r'))))        { theString[sLength-2] = 0; }      theResult = EnvAddSymbol(theEnv,theString);     }   if (theString != NULL)     { genfree(theEnv,theString,oldMax); }   return(theResult);  }/***************************************************************************//*FUNCTION TossCommand : (H/L function toss)                             *//* Input : Name of the file to be deleted from the lookup table (passed via*//*         the argument "stack")                                           *//* Output : This function deletes the named file from the lookup table and *//*          returns a (float) boolean flag indicating failure or success.  *//***************************************************************************/globle int TossCommand(  void *theEnv)  {   char *file;   /*Name of the file */   DATA_OBJECT arg_ptr;   if (EnvArgTypeCheck(theEnv,"toss",1,SYMBOL_OR_STRING,&arg_ptr) == FALSE)     return (FALSE);   file = DOToString(arg_ptr);#if HELP_FUNCTIONS    if (TextProcessingData(theEnv)->help_file != NULL)      if ((strcmp(file,TextProcessingData(theEnv)->help_file) == 0) && (TextProcessingData(theEnv)->HELP_INIT == TRUE))        {         rm(theEnv,(void *) TextProcessingData(theEnv)->help_file,strlen(TextProcessingData(theEnv)->help_file) + 1);         TextProcessingData(theEnv)->help_file = NULL;         TextProcessingData(theEnv)->HELP_INIT = FALSE;         EnvDeleteRouter(theEnv,"whelp");        }#endif   return(TextLookupToss(theEnv,file));  }#endif/******************************************************************************//* The following four functions are the router routines for the logical name  *//* "whelp".  Currently, all they do is direct all accesses to standard I/O.   *//******************************************************************************/#if HELP_FUNCTIONS#if IBM_TBC#pragma argsused#endifstatic int RecognizeHelpRouters(  void *theEnv,  char *log_name)  {#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(theEnv)#endif   if (strcmp(log_name,"whelp") == 0)     return(TRUE);   return(FALSE);  }#if IBM_TBC#pragma argsused#endifstatic int HelpPrint(  void *theEnv,  char *log_name,  char *str)  {#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(log_name)#endif   EnvPrintRouter(theEnv,"stdout",str);   return(1);  }#if IBM_TBC#pragma argsused#endifstatic int HelpGetc(  void *theEnv,  char *log_name)  {#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(log_name)#endif   return(EnvGetcRouter(theEnv,"stdin"));  }#if IBM_TBC#pragma argsused#endifstatic int HelpUngetc(  void *theEnv,  int ch,  char *log_name)  {#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(log_name)#endif   return(EnvUngetcRouter(theEnv,ch,"stdin"));  }#endif/******************************************************************************//*============================================================================*//*                            INTERNAL ROUTINES                               *//*============================================================================*//******************************************************************************//******************************************************************************//*FUNCTION CMD_LINE_TOPICS :                                                  *//* Input : None                                                               *//* Output : This function builds a linked list of topics requested by the     *//*          user at the H/L level using the argument "stack" routines,        *//*          num_args() and rstring().  It returns the address of the top of   *//*          the list or NULL if there were no command line topics.            *//******************************************************************************/static struct topics *GetCommandLineTopics(  void *theEnv)  {   int topic_num,         /*Number of topics specified by the user */       theIndex;             /*Used to loop through the topic list    */   struct topics *head,   /*Address of the top of the topic list   */                 *tnode,  /*Address of new topic node              */                 *tptr;   /*Used to attach new node to the list    */   DATA_OBJECT val;       /*Unknown-type H/L data structure        */   head = NULL;   topic_num = EnvRtnArgCount(theEnv);   for (theIndex = 1; theIndex <= topic_num; theIndex++)     {      tnode = (struct topics *) gm2(theEnv,(int) sizeof(struct topics));      EnvRtnUnknown(theEnv,theIndex,&val);      if ((GetType(val) == SYMBOL) || (GetType(val) == STRING))        genstrncpy(tnode->name,DOToString(val),NAMESIZE-1);      else if (GetType(val) == FLOAT)        genstrncpy(tnode->name,FloatToString(theEnv,DOToDouble(val)),NAMESIZE-1);      else if (GetType(val) == INTEGER)        genstrncpy(tnode->name,LongIntegerToString(theEnv,DOToLong(val)),NAMESIZE-1);      else        genstrncpy(tnode->name,"***ERROR***",NAMESIZE-1);      tnode->next = NULL;      tnode->end_list = NULL;      if (head == NULL)        head = tnode;      else        {         tptr = head;         while (tptr->next != NULL)           tptr = tptr->next;         tptr->next = tnode;        }     }    return(head);  }/******************************************************************************//*FUNCTION QUERY_TOPIC :                                                      *//* Input : 1) The address of the old topic list (this routines writes over    *//*            previously allocated memory, if available)                      *//*         2) A buffer holding the name of the current menu in the tree       *//* Output : This function prompts the user for a new set of topic(s) and      *//*          displays the name of the current menu.  Each new topic is         *//*          delineated by white-space, and this function builds a linked list *//*          of these topics.  It returns the address of the top of this list. *//******************************************************************************/#if HELP_FUNCTIONSstatic struct topics *AskForNewHelpTopic(  void *theEnv,  struct topics *old_list,  char **menu)  {   int theIndex, cnt;       /*Indices of the user input buffer and topic name */   struct topics *tmain,  /*Address of the top of the topic list            */                 *tnode, /*Address of the new topic node                   */                 *tptr;  /*Used to add the new node to the topic list      */   char list[256],       /*User input buffer                               */        name[NAMESIZE];  /*Name of the new topic in the list               */   /*==================================================================*/   /*Read a line of input from the user (substituting blanks for tabs) */   /*==================================================================*/   EnvPrintRouter(theEnv,"whelp",*menu);   EnvPrintRouter(theEnv,"whelp"," Topic? ");   RouterData(theEnv)->CommandBufferInputCount = 0;   for ( theIndex = 0;         ((list[theIndex] = (char) EnvGetcRouter(theEnv,"whelp")) != LNFEED) && (theIndex < 254);         theIndex++ , RouterData(theEnv)->CommandBufferInputCount++)       {        if (EvaluationData(theEnv)->HaltExecution)          break;        if (list[theIndex] == TAB)          list[theIndex] = BLANK;        else if ((list[theIndex] == '\b') && (theIndex != 0))          {           theIndex -= 2;           RouterData(theEnv)->CommandBufferInputCount -= 2;          }       }#if VAX_VMS   EnvPrintRouter(theEnv,"whelp","\n");#endif   RouterData(theEnv)->CommandBufferInputCount = -1;   if (EvaluationData(theEnv)->HaltExecution)     {      EnvPrintRouter(theEnv,"whelp","\n");      old_list->end_list = old_list;      return(old_list);     }   list[theIndex] = BLANK;   list[theIndex+1] = NULLCHAR;   /*=======================================*/   /*Parse user buffer into separate topics */   /*=======================================*/   tmain = old_list;   theIndex = 0; cnt = 0;   while (list[theIndex] != NULLCHAR)     {      if ((list[theIndex] != BLANK) && (cnt < NAMESIZE))        name[cnt++] = list[theIndex++];      else if (cnt > 0)        {         while ((list[theIndex] != BLANK) && (list[theIndex] != NULLCHAR))           theIndex++;         name[cnt] = NULLCHAR;         cnt = 0;         /*==============================================*/         /*Write over previous topic lists, if available */         /*==============================================*/         if (old_list != NULL)           {            genstrcpy(old_list->name,name);            old_list = old_list->next;           }         else           {            tnode = (struct topics *) gm2(theEnv,(int) sizeof(struct topics));            genstrcpy(tnode->name,name);            tnode->next = NULL;            tnode->end_list = NULL;            if (tmain == NULL)              tmain = tnode;            else              {               tptr = tmain;               while (tptr->next != NULL)                 tptr = tptr->next;               tptr->next = tnode;              }           }        }      else        theIndex++;     }  /*========================================================================*/  /*If the new list is shorter than the previous one, we must mark the end. */  /*========================================================================*/  tmain->end_list = old_list;  return(tmain); }#endif/******************************************************************************//*FUNCTION FIND_TOPIC :                                                       *//* Input : 

⌨️ 快捷键说明

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