556d7b3e737a7a567385ed5fccb852bac192b38b
[Ack-5.5.git] / util / ack / util.c
1 /*
2  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
3  * See the copyright notice in the ACK home directory, in the file "Copyright".
4  *
5  */
6
7 /**********************************************************************/
8 /*                                                                    */
9 /*               Several utility routines used throughout ack         */
10 /*               error handling, string handling and such.            */
11 /*                                                                    */
12 /**********************************************************************/
13
14 #include "ack.h"
15 #include <ctype.h>
16 #include <stdio.h>
17
18 #ifndef NORCSID
19 static char rcs_id[] = "$Id: util.c,v 2.5 1994/06/24 10:13:21 ceriel Exp $" ;
20 #endif
21
22 extern  char    *progname ;
23 extern  int     w_flag ;
24 extern  int     n_error;
25
26 extern  char    *calloc();
27 extern  char    *realloc();
28
29 #ifdef DEBUG
30 # define STDOUT stdout
31 #else
32 # define STDOUT stderr
33 #endif
34
35 char *basename(string) char *string ; {
36         static char retval[256] ;
37         char *last_dot, *last_start ;
38         register char *store;
39         register char *fetch ;
40         register int ctoken ;
41
42         last_dot= (char *)0 ;
43         last_start= string ;
44         for ( fetch=string ; ; fetch++ ) {
45                 switch ( ctoken= *fetch&0377 ) {
46                 case SUFCHAR : last_dot=fetch ; break ;
47                 case '/'     : last_start=fetch+1 ; break ;
48                 case  0      : goto out ;
49                 }
50                 if ( !isascii(ctoken) || !isprint(ctoken) ) {
51                         werror("non-ascii characters in argument %s",string) ;
52                 }
53         }
54 out:
55         if ( ! *last_start ) fuerror("empty filename \"%s\"",string) ;
56         for ( fetch= last_start, store=retval ;
57                 *fetch && fetch!=last_dot && store< &retval[sizeof retval-1] ;
58                       fetch++, store++ ) {
59                                 *store= *fetch ;
60         }
61         *store= 0 ;
62         return retval ;
63 }
64
65 clr_noscan(str) char *str ; {
66         register char *ptr ;
67         for ( ptr=str ; *ptr ; ptr++ ) {
68                 *ptr&= ~NO_SCAN ;
69         }
70 }
71
72 char *skipblank(str) char *str ; {
73         register char *ptr ;
74
75         for ( ptr=str ; *ptr==SPACE || *ptr==TAB ; ptr++ ) ;
76         return ptr ;
77 }
78
79 char *firstblank(str) char *str ; {
80         register char *ptr ;
81
82         for ( ptr=str ; *ptr && *ptr!=SPACE && *ptr!=TAB ; ptr++ ) ;
83         return ptr ;
84 }
85
86 /* VARARGS1 */
87 fatal(fmt,p1,p2,p3,p4,p5,p6,p7) char *fmt ; {
88         /* Fatal internal error */
89         fprintf(STDOUT,"%s: fatal internal error, ",progname) ;
90         fprintf(STDOUT,fmt,p1,p2,p3,p4,p5,p6,p7);
91         fprintf(STDOUT,"\n") ;
92         quit(-2) ;
93 }
94
95
96 /* VARARGS1 */
97 vprint(fmt,p1,p2,p3,p4,p5,p6,p7) char *fmt ; {
98         /* Diagnostic print, no auto NL */
99         fprintf(STDOUT,fmt,p1,p2,p3,p4,p5,p6,p7);
100 }
101
102 #ifdef DEBUG
103 prns(s) register char *s ; {
104         for ( ; *s ; s++ ) {
105                 putc((*s&0377)&~NO_SCAN,STDOUT) ;
106         }
107         putc('\n',STDOUT) ;
108 }
109 #endif
110
111 /* VARARGS1 */
112 fuerror(fmt,p1,p2,p3,p4,p5,p6,p7) char *fmt ; {
113         /* Fatal user error */
114         fprintf(STDOUT,"%s: ",progname) ;
115         fprintf(STDOUT,fmt,p1,p2,p3,p4,p5,p6,p7);
116         fprintf(STDOUT,"\n") ;
117         quit(-1) ;
118 }
119
120 /* VARARGS1 */
121 werror(fmt,p1,p2,p3,p4,p5,p6,p7) char *fmt ; {
122         /* Warning user error, w_flag */
123         if ( w_flag ) return ;
124         fprintf(STDOUT,"%s: warning, ",progname) ;
125         fprintf(STDOUT,fmt,p1,p2,p3,p4,p5,p6,p7);
126         fprintf(STDOUT,"\n") ;
127 }
128
129 /* VARARGS1 */
130 error(fmt,p1,p2,p3,p4,p5,p6,p7) char *fmt ; {
131         /* User error, it is the callers responsibility to quit */
132         fprintf(STDOUT,"%s: ",progname) ;
133         fprintf(STDOUT,fmt,p1,p2,p3,p4,p5,p6,p7);
134         fprintf(STDOUT,"\n") ;
135         n_error++ ;
136 }
137
138 do_flush() {
139         fflush(stdout) ;
140         fflush(stderr) ;
141 }
142
143 void
144 noodstop() {
145         quit(-3) ;
146 }
147
148 quit(code) {
149         rmtemps();
150         exit(code);
151 }
152 /******
153         char *keeps(string)
154                 Keep the string in stable storage.
155         throws(string)
156                 Remove the string stored by keep from stable storage.
157 ***********/
158
159 char *keeps(str) char *str ; {
160         register char *result ;
161         result= getcore( (unsigned)(strlen(str)+1) ) ;
162         if ( !result ) fatal("Out of core") ;
163         return strcpy(result,str) ;
164 }
165
166 throws(str) char *str ; {
167         freecore(str) ;
168 }
169
170 char *getcore(size) unsigned size ; {
171         register char *retptr ;
172
173         retptr= calloc(1,size) ;
174         if ( !retptr ) fatal("Out of memory") ;
175         return retptr ;
176 }
177
178 char *changecore(ptr,size) char *ptr ; unsigned size ; {
179         register char *retptr ;
180
181         retptr= realloc(ptr,size) ;
182         if ( !retptr ) fatal("Out of memory") ;
183         return retptr ;
184 }