util.c 4.0 KB

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