This is search.c in view mode; [Download] [Up]
#include "structures.h" /* The copyright notice in that file is included too! */
#include <stdio.h> /* for FILE and fopen */
#include <sgtty.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <fcntl.h>
#include <mach/cthreads.h>
#include <kpathsea/c-ctype.h>
#include <kpathsea/c-fopen.h>
#include <kpathsea/c-pathch.h>
#include <kpathsea/proginit.h>
#include <kpathsea/progname.h>
#include <kpathsea/tex-file.h>
#include <kpathsea/tex-glyph.h>
#include <dpsclient/dpsNeXT.h>
/*
#include <kpathsea/debug.h>
*/
void kpse_init() {
FILE *tmp;
char tmpbuf[1000];
int i=0;
int c;
objc_setMultithreaded(TRUE);
mgetenv("PATH"); /* to get enviroment up before kpse*/
tmp = popen("which tex","r");
while( (c = fgetc(tmp)) != EOF ) tmpbuf[i++] = c;
pclose(tmp);
/* if(tmpbuf[0] == '/')
sprintf(& tmpbuf[i-1], "view");
*/
tmpbuf[i-1]=0;
kpse_set_progname (tmpbuf);
/*
if (debug & DBG_OPEN) KPSE_DEBUG_SET (KPSE_DEBUG_FOPEN);
if (debug & DBG_STAT) KPSE_DEBUG_SET (KPSE_DEBUG_STAT);
if (debug & DBG_HASH) KPSE_DEBUG_SET (KPSE_DEBUG_HASH);
if (debug & DBG_PATHS) KPSE_DEBUG_SET (KPSE_DEBUG_PATHS);
if (debug & DBG_EXPAND) KPSE_DEBUG_SET (KPSE_DEBUG_EXPAND);
if (debug & DBG_SEARCH) KPSE_DEBUG_SET (KPSE_DEBUG_SEARCH);
KPSE_DEBUG_SET (KPSE_DEBUG_FOPEN);
KPSE_DEBUG_SET (KPSE_DEBUG_STAT);
KPSE_DEBUG_SET (KPSE_DEBUG_HASH);
KPSE_DEBUG_SET (KPSE_DEBUG_PATHS);
KPSE_DEBUG_SET (KPSE_DEBUG_EXPAND);
KPSE_DEBUG_SET (KPSE_DEBUG_SEARCH);
*/
kpse_init_prog ("tex", 100, "nextscrn", true, "cmr10");
start_up();
};
static int my_fildes[2];
int my_log_file;
cthread_t my_kpse_thread;
static void exit_thread() {
putchar(4);
// fflush(stdout);
// fflush(stderr);
};
static void start_up() {
FILE *stream1, *stream2, *stream3;
my_log_file=dup(2);
if(my_log_file < 3) {
perror("search.c");
printf("Trying to open my_log_file(%d)\n",my_log_file);
exit(5);
};
stream2 = fdopen(my_log_file,"w");
fclose(stdin);
fclose(stdout);
fclose(stderr);
if (pipe( my_fildes )==0) {
if(my_fildes[0] != 0 || my_fildes[1] != 1) exit(1);
dup2(my_fildes[1],2);
stream1 = fdopen(0,"r");
stream2 = fdopen(1,"w");
stream3 = fdopen(2,"w");
if(stream1 != stdin || stream2 != stdout || stream3 != stderr) exit(2);
setbuf(stdin ,NULL);
setbuf(stdout,NULL);
setbuf(stderr,NULL);
}
else { perror("! error grabbing pipe") ; exit(3);
}
}
void run_in_thread (any_t proc, volatile any_t args ) {
my_kpse_thread = cthread_fork( (any_t) proc,(any_t) args);
ModalConsoleOutput();
cthread_join(my_kpse_thread);
};
/******************************************/
/*
* The search routine takes a directory list, separated by PATHSEP, and
* tries to open a file. Null directory components indicate current
* directory. if the file SUBDIR exists and the file is a font file,
* it checks for the file in a subdirectory named the same as the font name.
* Returns the open file descriptor if ok, else NULL.
*/
/*
*
* We hope MAXPATHLEN is enough -- only rudimentary checking is done!
*/
extern void error() ;
#ifdef DEBUG
extern integer debug_flag;
#endif /* DEBUG */
struct threaded_kpse_find_file_args { char filename[1000] ; kpse_file_format_type format; char found_name[1000];};
void threaded_kpse_find_file(struct threaded_kpse_find_file_args *args) {
char *tmp;
tmp = kpse_find_file (args->filename, args->format, args->format != kpse_vf_format);
if(tmp) { strcpy((args->found_name),tmp); free(tmp);}
else *(args->found_name) = 0;
exit_thread();
};
FILE *search(format, filename, mode)
kpse_file_format_type format;
char *filename, *mode ;
{
FILE *ret;
static struct threaded_kpse_find_file_args args;
/* Most file looked for through here must exist -- the exception is
VF's. Bitmap fonts go through pksearch. */
strcpy(args.filename,filename);
args.format = format;
args.found_name[0]=0;
run_in_thread ( &threaded_kpse_find_file, &args);
if (args.found_name[0])
ret = fopen ( args.found_name, mode);
else
ret = NULL;
return ret;
} /* end search */
struct threaded_kpse_find_pk_args
{ char font_name[1000] ; unsigned dpi; kpse_glyph_file_type font_file; char found_name[1000];};
void threaded_kpse_find_pk(struct threaded_kpse_find_pk_args *args) {
char *tmp;
tmp = kpse_find_pk (args->font_name, args->dpi, &(args->font_file) );
if(tmp)
{ strcpy((args->found_name),tmp); free(tmp); }
else *(args->found_name) = 0;
exit_thread();
};
FILE *pksearch( font_name, dpi, name_ret, dpi_ret)
char *font_name;
char *name_ret ;
halfword dpi;
halfword *dpi_ret ;
{
FILE *ret;
static struct threaded_kpse_find_pk_args args;
strcpy(args.font_name,font_name);
args.dpi = dpi;
args.found_name[0] = 0;
run_in_thread ( &threaded_kpse_find_pk, &args);
if (args.found_name[0])
{
ret = fopen (args.found_name, "r");
if (!ret) return ret;
strcpy (name_ret, args.font_file.name);
*dpi_ret = (halfword) args.font_file.dpi;
}
else
ret = NULL;
return(ret);
} /* end search */
struct threaded_kpse_expand_args
{ char *file_name_in ; char *file_name_out; };
void threaded_kpse_expand(struct threaded_kpse_expand_args *args) {
args->file_name_out = kpse_expand(args->file_name_in);
exit_thread();
};
char *file_name_expand( char *original)
{
static struct threaded_kpse_expand_args args;
args.file_name_in = original;
run_in_thread ( &threaded_kpse_expand, &args);
return(args.file_name_out); /* should be freed by reciever */
} These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.