|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T g
Length: 2218 (0x8aa)
Types: TextFile
Names: »getpath.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/euug-87hel/sec8/smail/src/getpath.c«
#ifndef lint
static char *sccsid="@(#)getpath.c 2.2 (smail) 1/26/87";
#endif
# include <stdio.h>
# include <sys/types.h>
# include <ctype.h>
# include "defs.h"
#ifdef BSD
#include <strings.h>
#else
#include <string.h>
#endif
extern enum edebug debug; /* how verbose we are */
extern char *pathfile; /* location of path database */
/*
**
** getpath(): look up key in ascii sorted path database.
**
*/
getpath( key, path , cost)
char *key; /* what we are looking for */
char *path; /* where the path results go */
int *cost; /* where the cost results go */
{
long pos, middle, hi, lo;
static long pathlength = 0;
register char *s;
int c;
static FILE *file;
int flag;
DEBUG("getpath: looking for '%s'\n", key);
if( !pathlength ) /* open file on first use */
{
if( ( file=fopen( pathfile, "r" ) ) == NULL )
{
(void) printf( "can't access %s.\n", pathfile );
pathlength = -1;
} else {
(void) fseek( file, 0L, 2 ); /* find length */
pathlength = ftell( file );
}
}
if( pathlength == -1 )
return( EX_OSFILE );
lo = 0;
hi = pathlength;
(void) strcpy( path, key );
(void) strcat( path, "\t" );
/*
** "Binary search routines are never written right the first time around."
** - Robert G. Sheldon.
*/
for( ;; ) {
pos = middle = ( hi+lo+1 )/2;
(void) fseek( file, pos, 0 ); /* find midpoint */
if (pos != 0) /* to beginning of next line */
while( ( c=getc( file ) ) != EOF && c != '\n' );
for( flag = 0, s = path; flag == 0; s++ ) { /* match??? */
if ( *s == '\0' ) {
goto solved;
}
c = getc( file );
flag = lower( c ) - lower( *s );
}
if ( lo>=middle ) /* failure? */
return( EX_NOHOST );
if ( c != EOF && flag < 0 ) /* close window */
lo = middle;
else
hi = middle - 1;
}
/*
** Now just copy the result.
*/
solved:
while(((c = getc(file)) != EOF) && (c != '\t') && (c != '\n')) {
*path++ = c;
}
*path = '\0';
/*
** See if the next field on the line is numeric.
** If so, use it as the cost for the route.
*/
if(c == '\t') {
int tcost = -1;
while(((c = getc(file)) != EOF) && isdigit(c)) {
if(tcost < 0) tcost = 0;
tcost *= 10;
tcost += c - '0';
}
if(tcost >= 0) *cost = tcost;
}
return ( EX_OK );
}