123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- /*
- * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
- * See the copyright notice in the ACK home directory, in the file "Copyright".
- *
- */
- /**********************************************************************/
- /* */
- /* Several utility routines used throughout ack */
- /* error handling, string handling and such. */
- /* */
- /**********************************************************************/
- #include <stdlib.h>
- #include <stdio.h>
- #include <stdarg.h>
- #include <string.h>
- #include <ctype.h>
- #include "ack.h"
- extern char *progname ;
- extern int w_flag ;
- extern int n_error;
- #ifdef DEBUG
- # define STDOUT stdout
- #else
- # define STDOUT stderr
- #endif
- #define IsAscii(_c) (((_c) & ~0x7f) == 0)
- char *basename(char *string)
- {
- static char retval[256] ;
- char *last_dot, *last_start ;
- register char *store;
- register char *fetch ;
- register int ctoken ;
- last_dot= (char *)0 ;
- last_start= string ;
- for ( fetch=string ; ; fetch++ ) {
- switch ( ctoken= *fetch&0377 ) {
- case SUFCHAR : last_dot=fetch ; break ;
- case '/' : last_start=fetch+1 ; break ;
- case 0 : goto out ;
- }
- if ( !IsAscii(ctoken) || !isprint(ctoken) ) {
- werror("non-ascii characters in argument %s",string) ;
- }
- }
- out:
- if ( ! *last_start ) fuerror("empty filename \"%s\"",string) ;
- for ( fetch= last_start, store=retval ;
- *fetch && fetch!=last_dot && store< &retval[sizeof retval-1] ;
- fetch++, store++ ) {
- *store= *fetch ;
- }
- *store= 0 ;
- return retval ;
- }
- void clr_noscan(char *str)
- {
- register char *ptr ;
- for ( ptr=str ; *ptr ; ptr++ ) {
- *ptr&= ~NO_SCAN ;
- }
- }
- char *skipblank(char *str)
- {
- register char *ptr ;
- for ( ptr=str ; *ptr==SPACE || *ptr==TAB ; ptr++ ) ;
- return ptr ;
- }
- char *firstblank(char *str)
- {
- register char *ptr ;
- for ( ptr=str ; *ptr && *ptr!=SPACE && *ptr!=TAB ; ptr++ ) ;
- return ptr ;
- }
- /* VARARGS1 */
- void fatal(const char* fmt, ...)
- {
- /* Fatal internal error */
- va_list ap;
- va_start(ap, fmt);
- fprintf(STDOUT,"%s: fatal internal error, ",progname) ;
- vfprintf(STDOUT, fmt, ap);
- fprintf(STDOUT,"\n") ;
- quit(-2) ;
- }
- /* VARARGS1 */
- void vprint(const char* fmt, ...)
- {
- /* Diagnostic print, no auto NL */
- va_list ap;
- va_start(ap, fmt);
- vfprintf(STDOUT, fmt, ap);
- va_end(ap);
- }
- #ifdef DEBUG
- void prns(char *s)
- {
- for ( ; *s ; s++ ) {
- putc((*s&0377)&~NO_SCAN,STDOUT) ;
- }
- putc('\n',STDOUT) ;
- }
- #endif
- /* VARARGS1 */
- void fuerror(const char *fmt, ...)
- {
- /* Fatal user error */
- va_list ap;
- va_start(ap, fmt);
- fprintf(STDOUT,"%s: ",progname) ;
- vfprintf(STDOUT, fmt, ap);
- fprintf(STDOUT,"\n") ;
- quit(-1) ;
- }
- /* VARARGS1 */
- void werror(const char *fmt, ...)
- {
- /* Warning user error, w_flag */
- va_list ap;
- if ( w_flag ) return ;
- va_start(ap, fmt);
- fprintf(STDOUT,"%s: warning, ",progname) ;
- vfprintf(STDOUT, fmt, ap);
- fprintf(STDOUT,"\n") ;
- va_end(ap);
- }
- /* VARARGS1 */
- void error(const char *fmt, ...)
- {
- /* User error, it is the callers responsibility to quit */
- va_list ap;
- va_start(ap, fmt);
- fprintf(STDOUT,"%s: ",progname) ;
- vfprintf(STDOUT, fmt, ap);
- fprintf(STDOUT,"\n") ;
- n_error++ ;
- va_end(ap);
- }
- void do_flush()
- {
- fflush(stdout) ;
- fflush(stderr) ;
- }
- void noodstop()
- {
- quit(-3) ;
- }
- void quit(int code)
- {
- rmtemps();
- exit(code);
- }
- /******
- char *keeps(string)
- Keep the string in stable storage.
- throws(string)
- Remove the string stored by keep from stable storage.
- ***********/
- char *keeps(str) char *str ; {
- char *result ;
- result= getcore( (unsigned)(strlen(str)+1) ) ;
- if ( !result ) fatal("Out of core") ;
- return strcpy(result,str) ;
- }
- void throws(char *str)
- {
- freecore(str) ;
- }
- char *getcore(unsigned size)
- {
- char *retptr ;
- retptr= calloc(1,size) ;
- if ( !retptr ) fatal("Out of memory") ;
- return retptr ;
- }
- char *changecore(char *ptr, unsigned int size)
- {
- char *retptr;
- retptr = realloc(ptr,size) ;
- if ( !retptr ) fatal("Out of memory") ;
- return retptr ;
- }
|