util.c 4.1 KB

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