util.c 4.0 KB

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