📄 textpro.c
字号:
else
l_flag = 0;
while (l_flag > 0)
{
plptr = clptr;
clptr = clptr->next;
if (clptr != NULL)
if (strcmp(clptr->file,file) != 0)
l_flag = 1;
else
l_flag = 0;
else
l_flag = 0;
}
if (clptr == NULL)
return(FALSE);
TossFunction(theEnv,clptr->topics);
if (plptr == clptr)
TextProcessingData(theEnv)->headings = clptr->next;
else
plptr->next = clptr->next;
rm(theEnv,(void *) clptr,(int) sizeof(struct lists));
return(TRUE);
}
/******************************************************************************/
/*FUNCTION GET_ENTRIES : */
/* Input : 1) name of file to be accessed for lookup of entry */
/* 2) caller allocated buffer for main topic name */
/* 3) name of the entry to be accessed in the file */
/* 4) caller allocated buffer for a status code (see LOOKUP). */
/* Output : 1) returns a pointer into the stream of the lookup file which */
/* indicates the starting position of the lookup information */
/* (NULL if the topic was not found) */
/* This function passes its input directly to LOOKUP. See its description */
/* for further detail. */
/* */
/******************************************************************************/
static FILE *GetEntries(
void *theEnv,
char *file,
char **menu,
char *name,
int *code)
{
FILE *fp; /*Lookup file stream*/
long int offset; /*Offset from beginning of file to beginning of topic*/
offset = LookupEntry(theEnv,file,menu,name,code);
if (offset < 0)
return(NULL);
fp = GenOpen(theEnv,file,OPEN_READ);
if (fp == NULL)
{
*code = NO_FILE;
return(NULL);
}
if (fseek(fp,offset,0) < 0)
{
GenClose(theEnv,fp);
*code = NO_FILE;
return(NULL);
}
return(fp);
}
/******************************************************************************/
/*FUNCTION GET_CURR_MENU : */
/* Input : 1) name of file to be accessed */
/* 2) caller allocated buffer for the current menu name */
/* 3) caller allocated buffer for status code : NO_FILE, NO_TOPIC, or */
/* NORMAL. */
/* Output : 1) returns a pointer into the file stream indicating the beginning*/
/* of the description of the current menu for the named file */
/* (returns NULL if there is no current menu) */
/******************************************************************************/
static FILE *GetCurrentMenu(
void *theEnv,
char *file,
int *status)
{
struct lists *lptr; /*Used in searching the file list*/
FILE *fp; /*File stream*/
int l_flag; /*Used in looping through the file list*/
/*=====================================*/
/*Find the named file in the file list */
/*=====================================*/
lptr = TextProcessingData(theEnv)->headings;
if (lptr != NULL)
if (strcmp(lptr->file,file) != 0)
l_flag = 1;
else
l_flag = 0;
else
l_flag = 0;
while (l_flag > 0)
{
lptr = lptr->next;
if (lptr != NULL)
if (strcmp(lptr->file,file) != 0)
l_flag = 1;
else
l_flag = 0;
else
l_flag = 0;
}
if (lptr == NULL)
{
*status = NO_FILE;
return(NULL);
}
/*============================================================*/
/*Position the pointer in the file stream to the current menu */
/*============================================================*/
if (lptr->curr_menu == NULL)
{
*status = NO_TOPIC;
return(NULL);
}
if ((fp = GenOpen(theEnv,file,OPEN_READ)) == NULL)
{
*status = NO_FILE;
return(NULL);
}
if (fseek(fp,lptr->curr_menu->offset,0) < 0)
{
GenClose(theEnv,fp);
*status = NO_FILE;
return(NULL);
}
*status = NORMAL;
return(fp);
}
/******************************************************************************/
/*FUNCTION GRAB_STRING : */
/* Input : 1) file stream pointer */
/* 2) caller allocated buffer for storage of read string */
/* 3) size of caller's buffer */
/* Output : This function grabs a line of text from the currently opened */
/* lookup file at the given file position in the stream. If it */
/* encounters EOF or the closing topic delimeter, it closes the file */
/* and returns NULL. Otherwise, the return value is simply the */
/* address of the caller's buffer. */
/* */
/* Notes : 1) This function expects a file pointer into a stream of a file */
/* already opened!! */
/* 2) The caller must close the file himself if he wishes to */
/* prematurely abort the complete reading of an entry. */
/******************************************************************************/
static char *grab_string(
void *theEnv,
FILE *fp,
char *buf,
int bufsize)
{
if (fgets(buf,bufsize,fp) == NULL)
{
GenClose(theEnv,fp);
return(NULL);
}
if ((buf[0] == LIT_DELIM) && (buf[1] == LIT_DELIM))
{
buf[0] = BLANK;
buf[1] = BLANK;
}
else if (findstr(buf,EDELIM) >= 0)
{
buf = NULL;
GenClose(theEnv,fp);
}
return(buf);
}
/**************************************************************************/
/*FINDSTR FUNCTION : */
/* Input : 1) string to be searched */
/* 2) string to be found */
/* Output : 1) returns index of string-1 where string-2 started, if found */
/* 2) returns -1, if not found */
/**************************************************************************/
static int findstr(
char *s,
char *t)
{
int i,j,k;
for (i = 0; s[i] != '\0'; i++)
{
for (j = i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++) ;
if ((t[k] == '\0') && (k != 0))
return(i);
}
return(-1);
}
/**********************************************************************/
/*UPPER FUNCTION : */
/* Input : 1) alphanumeric string */
/* Output : 1) all alphabetic characters of string are capitalized */
/**********************************************************************/
static void upper(
char *str)
{
int theIndex;
for (theIndex = 0 ; str[theIndex] != NULLCHAR; theIndex++)
if (islower(str[theIndex])) str[theIndex] = (char) toupper(str[theIndex]);
}
/******************************************************************************/
/*FILE_NODE FUNCTION : */
/* Input : 1) name of a file */
/* Output : 1) returns address of an initalized NewFetchFile, if the file was */
/* not already on the lookup table */
/* 2) returns the null address, if the file was already present */
/******************************************************************************/
static struct lists *NewFetchFile(
void *theEnv,
char *file)
{
struct lists *lptr = NULL, *lnode;
if (TextProcessingData(theEnv)->headings != NULL)
{
lptr = TextProcessingData(theEnv)->headings;
while (lptr->next != NULL)
{
if (strcmp(lptr->file,file) == 0)
return(NULL);
lptr = lptr->next;
}
if (strcmp(lptr->file,file) == 0)
return(NULL);
}
lnode = (struct lists *) gm2(theEnv,(int) sizeof(struct lists));
strcpy(lnode->file,file);
lnode->topics = NULL;
lnode->curr_menu = NULL;
lnode->next = NULL;
if (TextProcessingData(theEnv)->headings == NULL)
TextProcessingData(theEnv)->headings = lnode;
else
lptr->next = lnode;
return(lnode);
}
/******************************************************************************/
/*ENTRIES_NODE FUNCTION : */
/* Input : 1) file pointer */
/* 2) file name */
/* 3) input string from the file */
/* 4) buffer for error messages */
/* 5) size of the error message buffer */
/* 6) line count in the file */
/* Output : */
/*This function scans the input string for the appropriate topic entry */
/*delimeter and, if it finds this to be correct, allocates a new entry node, */
/*and initializes it, and returns the address to the calling routine. If an */
/*error is detected, the function writes an appropriate message to the */
/*caller's buffer, deallocates the node, deletes all previous nodes from the */
/*current file from the lookup table, closes the file, and returns the null */
/*address. */
/******************************************************************************/
static struct entries *AllocateEntryNode(
void *theEnv,
FILE *fp,
char *file,
char *str,
int line_ct)
{
struct entries *enode;
char bmarker[BDLEN+1], /*Entry topic delimiting strings */
t_code[2]; /*Type of entry flag : menu or info */
/*================================================================*/
/*Allocate a new node and scan the delimeter string for tree info */
/*================================================================*/
enode = (struct entries *) gm2(theEnv,(int) sizeof(struct entries));
if (sscanf(str,BFORMAT,
&enode->level,t_code,bmarker,enode->name) != 4)
{
rm(theEnv,(void *) enode,(int) sizeof(struct entries));
GenClose(theEnv,fp);
TextLookupToss(theEnv,file);
PrintErrorID(theEnv,"TEXTPRO",5,FALSE);
EnvPrintRouter(theEnv,WERROR,"Line ");
PrintLongInteger(theEnv,WERROR,line_ct);
EnvPrintRouter(theEnv,WERROR," : Invalid delimeter string.\n");
return(NULL);
}
if (t_code[0] == 'M')
enode->type = MENU;
else if (t_code[0] == 'I')
enode->type = INFO;
else
{
rm(theEnv,(void *) enode,(int) sizeof(struct entries));
GenClose(theEnv,fp);
TextLookupToss(theEnv,file);
PrintErrorID(theEnv,"TEXTPRO",6,FALSE);
EnvPrintRouter(theEnv,WERROR,"Line ");
PrintLongInteger(theEnv,WERROR,line_ct);
EnvPrintRouter(theEnv,WERROR," : Invalid entry type.\n");
return(NULL);
}
if (strcmp(bmarker,BDELIM) != 0)
{
rm(theEnv,(void *) enode,(int) sizeof(struct entries));
GenClose(theEnv,fp);
TextLookupToss(theEnv,file);
PrintErrorID(theEnv,"TEXTPRO",5,FALSE);
EnvPrintRouter(theEnv,WERROR,"Line ");
PrintLongInteger(theEnv,WERROR,line_ct);
EnvPrintRouter(theEnv,WERROR," : Invalid delimeter string.\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -