You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
3.5 KiB
171 lines
3.5 KiB
/**********
|
|
Copyright 1990 Regents of the University of California. All rights reserved.
|
|
Author: 1986 Wayne A. Christopher, U. C. Berkeley CAD Group
|
|
Modified 1999 Emmanuel Rouat
|
|
**********/
|
|
|
|
/*
|
|
* The main entry point for the help system.
|
|
*/
|
|
|
|
#include <config.h>
|
|
#include "ngspice.h"
|
|
#include "cpstd.h"
|
|
#include "hlpdefs.h"
|
|
#include "suffix.h"
|
|
|
|
char *hlp_directory;
|
|
extern char *hlp_filelist[];
|
|
int hlp_ftablesize = 0;
|
|
|
|
void
|
|
hlp_main(char *path, wordlist *wl)
|
|
{
|
|
topic *top;
|
|
fplace *place;
|
|
|
|
hlp_directory = path;
|
|
|
|
if (wl) {
|
|
while (wl) {
|
|
if (!(place = findglobalsubject(wl->wl_word))) {
|
|
fprintf(stderr, "Error: No such topic: %s\n",
|
|
wl->wl_word);
|
|
wl = wl->wl_next;
|
|
continue;
|
|
}
|
|
if (!(top = hlp_read(place))) {
|
|
fprintf(stderr, "Error: can't read topic\n");
|
|
wl = wl->wl_next;
|
|
continue;
|
|
}
|
|
hlp_provide(top);
|
|
wl = wl->wl_next;
|
|
}
|
|
} else {
|
|
if (!(place = findglobalsubject("main"))) {
|
|
fprintf(stderr, "Error: no main topic\n");
|
|
return;
|
|
}
|
|
if (!(top = hlp_read(place))) {
|
|
fprintf(stderr, "Error: can't read topic\n");
|
|
return;
|
|
}
|
|
hlp_provide(top);
|
|
}
|
|
|
|
#ifdef X_DISPLAY_MISSING
|
|
hlp_free();
|
|
#endif
|
|
|
|
return;
|
|
}
|
|
|
|
fplace *
|
|
findglobalsubject(char *subject)
|
|
{
|
|
|
|
fplace *place;
|
|
char **dict;
|
|
long fpos;
|
|
|
|
place = 0;
|
|
for (dict = hlp_filelist; *dict && **dict; dict++) {
|
|
fpos = findsubject(*dict, subject);
|
|
if (fpos != -1) {
|
|
place = (fplace *) tmalloc(sizeof(fplace));
|
|
place->fpos = fpos;
|
|
place->filename = copy(*dict);
|
|
place->fp = hlp_fopen(*dict);
|
|
break;
|
|
}
|
|
}
|
|
return(place);
|
|
}
|
|
|
|
/* see if file is on filelist */
|
|
bool
|
|
hlp_approvedfile(char *filename)
|
|
{
|
|
char **s;
|
|
|
|
for (s = hlp_filelist; *s && **s; s++) {
|
|
if (cieq(*s, filename)) return(TRUE);
|
|
}
|
|
return(FALSE);
|
|
}
|
|
|
|
/* keep file pointers on top level files so we don't always have to do
|
|
fopen's */
|
|
FILE *hlp_fopen(char *filename)
|
|
{
|
|
static struct {
|
|
char filename[BSIZE_SP];
|
|
FILE *fp;
|
|
} hlp_ftable[32];
|
|
int i;
|
|
char buf[BSIZE_SP];
|
|
|
|
for (i=0; i < hlp_ftablesize; i++) {
|
|
if (cieq(filename, hlp_ftable[i].filename)) {
|
|
return(hlp_ftable[i].fp);
|
|
}
|
|
}
|
|
|
|
/* not already in table */
|
|
strcpy(buf, hlp_directory); /* set up pathname */
|
|
strcat(buf, DIR_PATHSEP);
|
|
strcat(buf, filename);
|
|
strcat(buf, ".txt");
|
|
hlp_pathfix(buf);
|
|
if (!(hlp_ftable[hlp_ftablesize].fp = fopen(buf, "r"))) {
|
|
perror(buf);
|
|
return (NULL);
|
|
}
|
|
|
|
strcpy(hlp_ftable[hlp_ftablesize].filename, filename);
|
|
hlp_ftablesize++;
|
|
|
|
return(hlp_ftable[hlp_ftablesize - 1].fp);
|
|
|
|
}
|
|
|
|
/* ARGSUSED */
|
|
void
|
|
hlp_pathfix(char *buf)
|
|
{
|
|
char *s, *t, *u, bufx[1025];
|
|
char *dir_pathsep;
|
|
extern char *cp_tildexpand( );
|
|
|
|
dir_pathsep = DIR_PATHSEP;
|
|
|
|
if (!buf)
|
|
return;
|
|
|
|
s = cp_tildexpand(buf);
|
|
if (sizeof(DIR_PATHSEP) == 2) {
|
|
if (*dir_pathsep != '/') {
|
|
for (t = s; *t; t++) {
|
|
if (*t == '/')
|
|
*t = *dir_pathsep;
|
|
}
|
|
} else
|
|
strcpy(buf, s);
|
|
} else {
|
|
/* For vms; this probably doesn't work, but neither did the old code */
|
|
for (s = bufx, t = buf; *t; t++) {
|
|
if (*t == '/')
|
|
for (u = DIR_PATHSEP; *u; u++) {
|
|
*s++ = *u;
|
|
}
|
|
else
|
|
*s++ = *t;
|
|
}
|
|
*s = 0;
|
|
strcpy(buf, s);
|
|
}
|
|
if (s)
|
|
tfree(s);
|
|
return;
|
|
}
|