util.c 4.3 KB

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