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.1 (Berkeley) 06/05/85"; 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 extern int errno; 96 extern char *sys_errlist[]; 97 98 /* 99 * Boom! 100 */ 101 Perror(file, error) 102 char *file, *error; 103 { 104 105 fprintf( stderr , "%s: %s\n" , file , error ); 106 } 107 108 int * 109 pcalloc(num, size) 110 int num, size; 111 { 112 register int *p1, *p2, nbyte; 113 114 nbyte = (num*size+( ( sizeof ( int ) ) - 1 ) ) & ~( ( sizeof ( int ) ) - 1 ); 115 if ((p1 = (int *) malloc((unsigned) nbyte)) == 0) 116 return (0); 117 p2 = p1; 118 nbyte /= sizeof ( int ); 119 do { 120 *p2++ = 0; 121 } while (--nbyte); 122 return (p1); 123 } 124 125 /* 126 * Compare strings: s1>s2: >0 s1==s2: 0 s1<s2: <0 127 */ 128 pstrcmp(s1, s2) 129 register char *s1, *s2; 130 { 131 132 while (*s1 == *s2++) 133 if (*s1++=='\0') 134 return (0); 135 return (*s1 - *--s2); 136 } 137 138 /* 139 * Copy string s2 to s1. 140 * S1 must be large enough. 141 * Return s1. 142 */ 143 char * 144 pstrcpy(s1, s2) 145 register char *s1, *s2; 146 { 147 register char *os1; 148 149 os1 = s1; 150 while (*s1++ = *s2++) 151 continue; 152 return (os1); 153 } 154 155 /* 156 * Strlen is currently a freebie of perror 157 * Take the length of a string. 158 * Note that this does not include the trailing null! 159 strlen(cp) 160 register char *cp; 161 { 162 register int i; 163 164 for (i = 0; *cp != 0; cp++) 165 i++; 166 return (i); 167 } 168 */ 169 copy(to, from, bytes) 170 register char *to, *from; 171 register int bytes; 172 { 173 174 if (bytes != 0) 175 do 176 *to++ = *from++; 177 while (--bytes); 178 } 179 180 /* 181 * Is ch one of the characters in the string cp ? 182 */ 183 any(cp, ch) 184 register char *cp; 185 char ch; 186 { 187 188 while (*cp) 189 if (*cp++ == ch) 190 return (1); 191 return (0); 192 } 193 194 opush(c) 195 register CHAR c; 196 { 197 198 c -= 'A'; 199 optstk[c] <<= 1; 200 optstk[c] |= opts[c]; 201 opts[c] = 1; 202 #ifdef PI0 203 send(ROPUSH, c); 204 #endif 205 } 206 207 opop(c) 208 register CHAR c; 209 { 210 211 c -= 'A'; 212 opts[c] = optstk[c] & 1; 213 optstk[c] >>= 1; 214 #ifdef PI0 215 send(ROPOP, c); 216 #endif 217 } 218