1 /* 2 * Copyright (c) 1980 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 */ 6 7 #ifndef lint 8 static char sccsid[] = "@(#)subr.c 5.2 (Berkeley) 05/28/90"; 9 #endif not lint 10 11 #include "whoami.h" 12 #include "0.h" 13 14 #ifndef PI1 15 /* 16 * Does the string fp end in '.' and the character c ? 17 */ 18 dotted(fp, c) 19 register char *fp; 20 char c; 21 { 22 register int i; 23 24 i = strlen(fp); 25 return (i > 1 && fp[i - 2] == '.' && fp[i - 1] == c); 26 } 27 28 /* 29 * Toggle the option c. 30 */ 31 togopt(c) 32 char c; 33 { 34 register char *tp; 35 36 tp = &opt( c ); 37 *tp = 1 - *tp; 38 } 39 40 /* 41 * Set the time vector "tvec" to the 42 * modification time stamp of a file. 43 */ 44 gettime( filename ) 45 char *filename; 46 { 47 #include <sys/stat.h> 48 struct stat stb; 49 50 stat(filename, &stb); 51 tvec = stb.st_mtime; 52 } 53 54 /* 55 * Convert a "ctime" into a Pascal styple time line 56 */ 57 char * 58 myctime(tv) 59 int *tv; 60 { 61 register char *cp, *dp; 62 extern char *ctime(); 63 char *cpp; 64 static char mycbuf[26]; 65 66 cpp = ctime(tv); 67 dp = mycbuf; 68 cp = cpp; 69 cpp[16] = 0; 70 while (*dp++ = *cp++); 71 dp--; 72 cp = cpp+19; 73 cpp[24] = 0; 74 while (*dp++ = *cp++); 75 return (mycbuf); 76 } 77 78 /* 79 * Is "fp" in the command line list of names ? 80 */ 81 inpflist(fp) 82 char *fp; 83 { 84 register i; 85 register char **pfp; 86 87 pfp = pflist; 88 for (i = pflstc; i > 0; i--) 89 if (pstrcmp(fp, *pfp++) == 0) 90 return (1); 91 return (0); 92 } 93 #endif 94 95 /* 96 * Boom! 97 */ 98 Perror(file, error) 99 char *file, *error; 100 { 101 102 fprintf( stderr , "%s: %s\n" , file , error ); 103 } 104 105 int * 106 pcalloc(num, size) 107 int num, size; 108 { 109 register int *p1, *p2, nbyte; 110 111 nbyte = (num*size+( ( sizeof ( int ) ) - 1 ) ) & ~( ( sizeof ( int ) ) - 1 ); 112 if ((p1 = (int *) malloc((unsigned) nbyte)) == 0) 113 return (0); 114 p2 = p1; 115 nbyte /= sizeof ( int ); 116 do { 117 *p2++ = 0; 118 } while (--nbyte); 119 return (p1); 120 } 121 122 /* 123 * Compare strings: s1>s2: >0 s1==s2: 0 s1<s2: <0 124 */ 125 pstrcmp(s1, s2) 126 register char *s1, *s2; 127 { 128 129 while (*s1 == *s2++) 130 if (*s1++=='\0') 131 return (0); 132 return (*s1 - *--s2); 133 } 134 135 /* 136 * Copy string s2 to s1. 137 * S1 must be large enough. 138 * Return s1. 139 */ 140 char * 141 pstrcpy(s1, s2) 142 register char *s1, *s2; 143 { 144 register char *os1; 145 146 os1 = s1; 147 while (*s1++ = *s2++) 148 continue; 149 return (os1); 150 } 151 152 /* 153 * Strlen is currently a freebie of perror 154 * Take the length of a string. 155 * Note that this does not include the trailing null! 156 strlen(cp) 157 register char *cp; 158 { 159 register int i; 160 161 for (i = 0; *cp != 0; cp++) 162 i++; 163 return (i); 164 } 165 */ 166 copy(to, from, bytes) 167 register char *to, *from; 168 register int bytes; 169 { 170 171 if (bytes != 0) 172 do 173 *to++ = *from++; 174 while (--bytes); 175 } 176 177 /* 178 * Is ch one of the characters in the string cp ? 179 */ 180 any(cp, ch) 181 register char *cp; 182 char ch; 183 { 184 185 while (*cp) 186 if (*cp++ == ch) 187 return (1); 188 return (0); 189 } 190 191 opush(c) 192 register CHAR c; 193 { 194 195 c -= 'A'; 196 optstk[c] <<= 1; 197 optstk[c] |= opts[c]; 198 opts[c] = 1; 199 #ifdef PI0 200 send(ROPUSH, c); 201 #endif 202 } 203 204 opop(c) 205 register CHAR c; 206 { 207 208 c -= 'A'; 209 opts[c] = optstk[c] & 1; 210 optstk[c] >>= 1; 211 #ifdef PI0 212 send(ROPOP, c); 213 #endif 214 } 215