util.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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 <string.h>
  15. #include <ctype.h>
  16. #include "ack.h"
  17. #ifndef NORCSID
  18. static char rcs_id[] = "$Id$" ;
  19. #endif
  20. extern char *progname ;
  21. extern int w_flag ;
  22. extern int n_error;
  23. #ifdef DEBUG
  24. # define STDOUT stdout
  25. #else
  26. # define STDOUT stderr
  27. #endif
  28. char *basename(string) char *string ; {
  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. clr_noscan(str) char *str ; {
  57. register char *ptr ;
  58. for ( ptr=str ; *ptr ; ptr++ ) {
  59. *ptr&= ~NO_SCAN ;
  60. }
  61. }
  62. char *skipblank(str) char *str ; {
  63. register char *ptr ;
  64. for ( ptr=str ; *ptr==SPACE || *ptr==TAB ; ptr++ ) ;
  65. return ptr ;
  66. }
  67. char *firstblank(str) char *str ; {
  68. register char *ptr ;
  69. for ( ptr=str ; *ptr && *ptr!=SPACE && *ptr!=TAB ; ptr++ ) ;
  70. return ptr ;
  71. }
  72. /* VARARGS1 */
  73. fatal(fmt,p1,p2,p3,p4,p5,p6,p7) char *fmt ; {
  74. /* Fatal internal error */
  75. fprintf(STDOUT,"%s: fatal internal error, ",progname) ;
  76. fprintf(STDOUT,fmt,p1,p2,p3,p4,p5,p6,p7);
  77. fprintf(STDOUT,"\n") ;
  78. quit(-2) ;
  79. }
  80. /* VARARGS1 */
  81. vprint(fmt,p1,p2,p3,p4,p5,p6,p7) char *fmt ; {
  82. /* Diagnostic print, no auto NL */
  83. fprintf(STDOUT,fmt,p1,p2,p3,p4,p5,p6,p7);
  84. }
  85. #ifdef DEBUG
  86. prns(s) register char *s ; {
  87. for ( ; *s ; s++ ) {
  88. putc((*s&0377)&~NO_SCAN,STDOUT) ;
  89. }
  90. putc('\n',STDOUT) ;
  91. }
  92. #endif
  93. /* VARARGS1 */
  94. fuerror(fmt,p1,p2,p3,p4,p5,p6,p7) char *fmt ; {
  95. /* Fatal user error */
  96. fprintf(STDOUT,"%s: ",progname) ;
  97. fprintf(STDOUT,fmt,p1,p2,p3,p4,p5,p6,p7);
  98. fprintf(STDOUT,"\n") ;
  99. quit(-1) ;
  100. }
  101. /* VARARGS1 */
  102. werror(fmt,p1,p2,p3,p4,p5,p6,p7) char *fmt ; {
  103. /* Warning user error, w_flag */
  104. if ( w_flag ) return ;
  105. fprintf(STDOUT,"%s: warning, ",progname) ;
  106. fprintf(STDOUT,fmt,p1,p2,p3,p4,p5,p6,p7);
  107. fprintf(STDOUT,"\n") ;
  108. }
  109. /* VARARGS1 */
  110. error(fmt,p1,p2,p3,p4,p5,p6,p7) char *fmt ; {
  111. /* User error, it is the callers responsibility to quit */
  112. fprintf(STDOUT,"%s: ",progname) ;
  113. fprintf(STDOUT,fmt,p1,p2,p3,p4,p5,p6,p7);
  114. fprintf(STDOUT,"\n") ;
  115. n_error++ ;
  116. }
  117. do_flush() {
  118. fflush(stdout) ;
  119. fflush(stderr) ;
  120. }
  121. void
  122. noodstop() {
  123. quit(-3) ;
  124. }
  125. quit(code) {
  126. rmtemps();
  127. exit(code);
  128. }
  129. /******
  130. char *keeps(string)
  131. Keep the string in stable storage.
  132. throws(string)
  133. Remove the string stored by keep from stable storage.
  134. ***********/
  135. char *keeps(str) char *str ; {
  136. register char *result ;
  137. result= getcore( (unsigned)(strlen(str)+1) ) ;
  138. if ( !result ) fatal("Out of core") ;
  139. return strcpy(result,str) ;
  140. }
  141. throws(str) char *str ; {
  142. freecore(str) ;
  143. }
  144. char *getcore(size) unsigned size ; {
  145. register char *retptr ;
  146. retptr= calloc(1,size) ;
  147. if ( !retptr ) fatal("Out of memory") ;
  148. return retptr ;
  149. }
  150. char *changecore(ptr,size) char *ptr ; unsigned size ; {
  151. register char *retptr ;
  152. retptr= realloc(ptr,size) ;
  153. if ( !retptr ) fatal("Out of memory") ;
  154. return retptr ;
  155. }