33 #define MAX_HE_ENTRY_LENGTH 160 63 static int heReKey2Entry (
char* filename,
char* key, heEntry hentry);
101 BOOLEAN key_is_regexp = (strchr(str,
'*') !=
NULL);
105 memset(&hentry,0,
sizeof(hentry));
109 if (!key_is_regexp && (idxfile !=
NULL) &&
heKey2Entry(idxfile, str, &hentry))
139 strcpy(mkey + 1, str);
147 Warn(
"No help for topic '%s' (not even for '*%s*')", str, str);
148 WarnS(
"Try '?;' for general help");
149 WarnS(
"or '?Index;' for all available help topics.");
162 Warn(
"No unique help for '%s'", str);
164 Warn(
"No help for topic '%s'", str);
174 strcpy(hentry.
key, str);
187 while (fgets( buf,
sizeof(buf), f))
189 if ((buf[0]!=
'#') && (buf[0]>
' ')) br++;
195 while (fgets( buf,
sizeof(buf),
f))
197 if ((buf[0]!=
'#') && (buf[0]>
' '))
199 char *
name=strtok(buf,
"!");
200 char *req=strtok(
NULL,
"!");
201 char *cmd=strtok(
NULL,
"!");
204 while ((cmd[0]!=
'\0') && (cmd[strlen(cmd)-1]<=
' '))
205 cmd[strlen(cmd)-1]=
'\0';
216 Print(
"syntax error in help.cnf, at line starting with %s\n",buf);
227 heHelpBrowsers[br].
browser=
"builtin";
233 heHelpBrowsers[br].
browser=
"dummy";
239 heHelpBrowsers[br].
browser=
"emacs";
258 if (which ==
NULL || *which ==
'\0')
261 if (heCurrentHelpBrowser !=
NULL)
262 return heCurrentHelpBrowser->
browser;
267 while (heHelpBrowsers[i].browser !=
NULL)
269 if (strcmp(heHelpBrowsers[i].browser,
"emacs") == 0 &&
270 (heHelpBrowsers[i].init_proc(0,i)))
272 heCurrentHelpBrowser = &(heHelpBrowsers[
i]);
280 while (heHelpBrowsers[i].browser !=
NULL)
282 if (heHelpBrowsers[i].init_proc(0,i))
284 heCurrentHelpBrowser = &(heHelpBrowsers[
i]);
295 while (heHelpBrowsers[i].browser !=
NULL &&
296 strcmp(heHelpBrowsers[i].browser, which) != 0)
299 if (heHelpBrowsers[i].browser ==
NULL)
301 if (warn)
Warn(
"No help browser '%s' available.", which);
306 if (heHelpBrowsers[i].init_proc(warn,i))
308 heCurrentHelpBrowser = &(heHelpBrowsers[
i]);
315 if (heCurrentHelpBrowser ==
NULL)
320 Warn(
"Setting help browser to '%s'.", heCurrentHelpBrowser->
browser);
321 return heCurrentHelpBrowser->
browser;
327 Warn(
"Help browser stays at '%s'.", heCurrentHelpBrowser->
browser);
328 return heCurrentHelpBrowser->
browser;
334 strcmp((
char*)
feOptSpec[FE_OPT_BROWSER].value,
335 heCurrentHelpBrowser->
browser) != 0)
341 return heCurrentHelpBrowser->
browser;
351 while (heHelpBrowsers[i].browser !=
NULL)
353 if (heHelpBrowsers[i].init_proc(warn,i))
371 while ((*s <=
' ') && (*s !=
'\0')) s++;
372 if (*s ==
'\0')
return NULL;
374 while (*ss!=
'\0') ss++;
376 while ((*ss <=
' ') && (*ss !=
'\0'))
381 if (*ss ==
'\0')
return NULL;
396 *(hentry->
key) =
'\0';
397 *(hentry->
url) =
'\0';
398 *(hentry->
node) =
'\0';
401 fd = fopen(filename,
"r");
407 while ((c = getc(fd)) != EOF)
412 while (getc(fd) !=
'\n') {};
425 if (getc(fd) !=
'\t')
goto Failure;
428 if (hentry->
key != key) strcpy(hentry->
key, key);
431 while ((c = getc(fd)) !=
'\t' && c != EOF)
436 if (c == EOF)
goto Failure;
437 if (hentry->
node[0]==
'\0')
438 strcpy(hentry->
node,hentry->
key);
443 while ((c = getc(fd)) !=
'\t' && c != EOF)
448 if (c == EOF)
goto Failure;
451 hentry->
url[
i] =
'\0';
453 if (si_fscanf(fd,
"%ld\n", &(hentry->
chksum)) != 1)
485 if (s ==
NULL || *s ==
'\0')
486 return (re ==
NULL || *re ==
'\0' || strcmp(re,
"*") == 0);
487 if (re ==
NULL || *re ==
'\0')
return FALSE;
492 char *
l, *r, *ll, *rr;
499 if (*s >=
'A' && *s <=
'Z') ls[
i] = *s + (
'a' -
'A');
503 }
while (*s !=
'\0');
511 if (*re >=
'A' && *re <=
'Z') rs[
i]= *re + (
'a' -
'A');
515 }
while (*re !=
'\0');
520 while (*r !=
'*' && *r !=
'\0' && *l !=
'\0')
522 if (*r != *l)
return FALSE;
528 if (*r ==
'\0')
return (*l ==
'\0');
529 if (*r ==
'*' && r[1] ==
'\0')
return TRUE;
530 if (*l ==
'\0')
return FALSE;
532 rr = &r[strlen(r) - 1];
533 ll = &l[strlen(l) - 1];
534 while (*rr !=
'*' && *rr !=
'\0' && *ll !=
'\0')
536 if (*rr != *ll)
return FALSE;
542 if (*rr ==
'\0')
return (*ll ==
'\0');
543 if (*rr ==
'*' && rr[-1] ==
'\0')
return TRUE;
544 if (*ll ==
'\0')
return FALSE;
552 while (*rr !=
'*' && *rr !=
'\0') rr++;
577 if (filename ==
NULL || key ==
NULL)
return 0;
578 fd = fopen(filename,
"r");
579 if (fd ==
NULL)
return 0;
581 while (si_fscanf(fd,
"%[^\t]\t%*[^\n]\n", index_key) == 1)
586 Werror(
"index file corrupt at line >>%s<<",index_key);
619 Print(
"`%s` not found in package %s\n",
id,pa);
629 if ((ss=strstr(s,
"::"))!=
NULL)
636 Print(
"help for %s from package %s\n",ss,s);
639 strcat(s_help,
"_help");
644 else Print(
"package %s not found\n",s);
654 if((lib!=
NULL)&&(*lib!=
'\0'))
656 Print(
"// proc %s from lib %s\n",s,lib);
683 if (strlen(s) >=4 && strcmp(&s[ls-3],
"lib") == 0)
685 if (s[ls - 4] ==
'.') str =
s;
700 if ((str[1]!=
'\0') &&
715 Warn(
"library %s has an old format. Please fix it for the next time",
717 if (str != s)
omFree(str);
719 while (fgets( buf,
sizeof(buf), fp))
721 if (strncmp(buf,
"//",2)==0)
723 if (found)
return TRUE;
725 else if ((strncmp(buf,
"proc ",5)==0)||(strncmp(buf,
"LIB ",4)==0))
727 if (!found)
WarnS(
"no help part in library found");
739 if (str != s)
omFree(str);
748 if (str != s)
omFree(str);
754 if (key ==
NULL || *key ==
'\0')
return 0;
759 if (pi !=
NULL)
return pi->
data.s.help_chksum;
775 int kchksum = (hentry !=
NULL && hentry->
chksum > 0 ?
784 Warn(
"Displaying help in browser '%s'.", heCurrentHelpBrowser->
browser);
790 WarnS(
"Use 'system(\"--browser\", <browser>);' to change browser,");
794 while (heHelpBrowsers[i].browser !=
NULL)
796 if (heHelpBrowsers[i].init_proc(0,i))
801 if (browsers[strlen(browsers)-2] ==
',')
803 browsers[strlen(browsers)-2] =
'.';
804 browsers[strlen(browsers)-1] =
'\0';
814 #define MAX_SYSCMD_LEN MAXPATHLEN*2 817 if (heHelpBrowsers[br].required==
NULL)
return TRUE;
818 const char *
p=heHelpBrowsers[br].
required;
830 if (warn)
Warn(
"resource `%c` not found",*p);
837 if (warn)
WarnS(
"resource `D` not found");
850 while (((*p==
':')||(*p<=
' ')) && (*p!=
'\0')) p++;
851 while((i<127) && (*p>
' ') && (*p!=
':'))
853 name[
i]=*
p; p++; i++;
855 if (i==0)
return FALSE;
857 if ((op==
'O') && (strcmp(name,S_UNAME)!=0))
861 if (warn)
Warn(
"executable `%s` not found",name);
866 default:
Warn(
"unknown char %c",*p);
877 const char *
p=heHelpBrowsers[br].
action;
878 if (p==
NULL) {
PrintS(
"no action ?\n");
return;}
894 if ((*p==
'h')&&(htmldir!=
NULL))
895 strcat(sys,
"file://localhost");
896 else if ((*p==
'H')||(htmldir==
NULL))
899 if (hentry !=
NULL && *(hentry->
url) !=
'\0')
900 #ifdef HAVE_VSNPRINTF 904 snprintf(temp,256,
"%s/%d-%d/%s", htmldir,
908 snprintf(temp,256,
"%s/%d-%d-%d/%s", htmldir,
915 snprintf(temp,256,
"%s/%s", htmldir, hentry->
url);
920 snprintf(temp,256,
"%s/%d-%d-%d/index.htm", htmldir,
926 snprintf(temp,256,
"%s/index.htm", htmldir);
931 sprintf(temp,
"%s/%d-%d-%d/%s", htmldir,
937 sprintf(temp,
"%s/%d-%d-%d/%s", htmldir, hentry->
url);
941 sprintf(temp,
"%s/%d-%d-%d/index.htm", htmldir,
947 sprintf(temp,
"%s/index.htm", htmldir);
953 char *
pp=(
char *)strchr(sys,
'#');
967 if (i_res!=
NULL) strcat(sys,i_res);
970 WarnS(
"singular.hlp not found");
979 if ((hentry!=
NULL) && (*(hentry->
node) !=
'\0'))
980 sprintf(temp,
"%s",hentry->
node);
1009 Print(
"running `%s`\n",sys);
1019 WerrorS(
"No functioning help browser available.");
1028 WarnS(
"Your help command could not be executed. Use");
1030 (hentry !=
NULL && *(hentry->
node) !=
'\0' ? hentry->
node :
"Top"));
1031 WarnS(
"to enter the Singular online help. For general");
1032 WarnS(
"information on Singular running under Emacs, type C-h m.");
1038 hentry->
key :
"Top");
1049 #define FIN_INDEX '\037' 1050 #define HELP_NOT_OPEN 1 1051 #define HELP_NOT_FOUND 2 1057 if ((
'A'<=p)&&(p<=
'Z'))
return p | 040;
1070 fseek(help, (
long)(offset+1), (
int)0);
1071 while( (!feof(help))
1072 && (*fgets(buffer,
BUF_LEN, help) != EOF)
1075 printf(
"%s", buffer);
1078 printf(
"\n Press <RETURN> to continue or x to exit help.\n");
1080 *close = (char)getchar();
1091 printf(
"\nEnd of part. Press <RETURN> to continue or x to exit help.\n");
1093 *close = (char)getchar();
1110 Print(
"HELP >>%s>>\n",str);
1119 for(p=str; *
p; p++) *p =
tolow(*p);
1124 while ((p != str) && (*p<=
' '));
1127 (void)sprintf(String,
" %s ", str);
1131 (void)sprintf(String,
" %s", str);
1135 && (fgets(buffer,
BUF_LEN, index) != (
char *)0)
1141 if (si_sscanf(buffer,
"Node:%[^\177]\177%ld\n", Index, &offset)!=2)
1145 for(p=Index; *
p; p++) *p =
tolow(*p);
1146 (void)strcat(Index,
" ");
1147 if( strstr(Index, String)!=
NULL)
1149 done++; (void)
show(offset, &close);
1152 else if( strcmp(Index, String)==0)
1154 done++; (void)
show(offset, &close);
1161 if (index !=
NULL) (void)fclose(index);
1164 Warn(
"`%s` not found",String);
const char * feHelpBrowser(char *which, int warn)
char url[MAX_HE_ENTRY_LENGTH]
const CanonicalForm int s
idhdl ggetid(const char *n)
static char * iiGetLibName(const procinfov pi)
find the library of an proc
static void * feOptValue(feOptIndex opt)
int yylplex(const char *libname, const char *libfile, lib_style_types *lib_style, idhdl pl, BOOLEAN autoexport=FALSE, lp_modes=LOAD_LIB)
static int singular_manual(char *str, BOOLEAN isIndexEntry)
static BOOLEAN heOnlineHelp(char *s)
#define MAX_HE_ENTRY_LENGTH
static char * feResource(feResourceConfig config, int warn)
static BOOLEAN heEmacsInit(int, int)
static int show(unsigned long offset, char *close)
static void feBrowserFile()
static BOOLEAN feHelpCalled
heBrowserInitProc init_proc
char key[MAX_HE_ENTRY_LENGTH]
static int heReKey2Entry(char *filename, char *key, heEntry hentry)
void WerrorS(const char *s)
static void heBrowserHelp(heEntry hentry)
static void heBuiltinHelp(heEntry hentry, int)
static int heCurrentHelpBrowserIndex
void feStringAppendBrowsers(int warn)
static BOOLEAN heDummyInit(int, int)
char node[MAX_HE_ENTRY_LENGTH]
Print("running `%s`\, sys)
void StringSetS(const char *st)
int status int void * buf
void StringAppendS(const char *st)
static void heEmacsHelp(heEntry hentry, int)
struct fe_option feOptSpec[]
static BOOLEAN heKey2Entry(char *filename, char *key, heEntry hentry)
static void heDummyHelp(heEntry hentry, int)
FILE * feFopen(const char *path, const char *mode, char *where, short useWerror, short path_only)
static heBrowser heCurrentHelpBrowser
void PrintS(const char *s)
static void heGenHelp(heEntry hentry, int)
static void hePrintHelpStr(const idhdl hh, const char *id, const char *pa)
char name(const Variable &v)
BOOLEAN iiLocateLib(const char *lib, char *where)
static int index(p_Length length, p_Ord ord)
static long heKeyChksum(char *key)
BOOLEAN(* heBrowserInitProc)(int warn, int br)
void(* heBrowserHelpProc)(heEntry hentry, int br)
static heBrowser_s * heHelpBrowsers
static BOOLEAN heGenInit(int, int)
heBrowserHelpProc help_proc
static char * strclean(char *str)
char * omFindExec(const char *name, char *exec)
static char tolow(char p)
static BOOLEAN strmatch(char *s, char *re)
char * iiGetLibProcBuffer(procinfo *pi, int part)
void Werror(const char *fmt,...)