Changeset 3192 for trunk/src/kmk/kmkbuiltin/cat.c
- Timestamp:
- Mar 26, 2018, 10:25:56 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/kmkbuiltin/cat.c
r3117 r3192 93 93 94 94 95 static int usage( FILE *);96 static int scanfiles( char *argv[], int cooked);97 static int cook_cat( FILE *);98 static int raw_cat( int);95 static int usage(PKMKBUILTINCTX pCtx, int fIsErr); 96 static int scanfiles(PKMKBUILTINCTX pCtx, char *argv[], int cooked); 97 static int cook_cat(PKMKBUILTINCTX pCtx, FILE *); 98 static int raw_cat(PKMKBUILTINCTX pCtx, int); 99 99 100 100 #ifndef NO_UDOM_SUPPORT 101 static int udom_open( const char *path, int flags);101 static int udom_open(PKMKBUILTINCTX pCtx, const char *path, int flags); 102 102 #endif 103 103 104 104 int 105 kmk_builtin_cat(int argc, char * argv[], char **envp)105 kmk_builtin_cat(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx) 106 106 { 107 107 int ch, rc; … … 112 112 113 113 /* kmk: reset getopt and set progname */ 114 g_progname = argv[0];115 114 opterr = 1; 116 115 optarg = NULL; … … 118 117 optind = 0; /* init */ 119 118 120 #ifdef kmk_builtin_cat/* kmk did this already. */119 #ifdef KMK_BUILTIN_STANDALONE /* kmk did this already. */ 121 120 setlocale(LC_CTYPE, ""); 122 #else123 fflush(stdout);124 121 #endif 125 122 … … 142 139 break; 143 140 case 'u': 141 #ifdef KMK_BUILTIN_STANDALONE /* don't allow messing with stdout */ 144 142 setbuf(stdout, NULL); 143 #endif 145 144 break; 146 145 case 'v': … … 148 147 break; 149 148 case 261: 150 usage( stdout);149 usage(pCtx, 0); 151 150 return 0; 152 151 case 262: 153 152 return kbuild_version(argv[0]); 154 153 default: 155 return usage( stderr);154 return usage(pCtx, 1); 156 155 } 157 156 argv += optind; 158 157 159 158 if (bflag || eflag || nflag || sflag || tflag || vflag) 160 rc = scanfiles( argv, 1);159 rc = scanfiles(pCtx, argv, 1); 161 160 else 162 rc = scanfiles( argv, 0);163 #ifdef kmk_builtin_cat /* only in the external program.*/161 rc = scanfiles(pCtx, argv, 0); 162 #ifdef KMK_BUILTIN_STANDALONE /* don't allow messing with stdout */ 164 163 if (fclose(stdout)) 165 return err( 1, "stdout");164 return err(pCtx, 1, "stdout"); 166 165 #endif 167 166 return rc; 168 167 } 169 168 170 static int 171 usage(FILE *fp) 172 { 173 fprintf(fp, "usage: %s [-benstuv] [file ...]\n" 174 " or: %s --help\n" 175 " or: %s --version\n", 176 g_progname, g_progname, g_progname); 169 #ifdef KMK_BUILTIN_STANDALONE 170 int main(int argc, char **argv, char **envp) 171 { 172 KMKBUILTINCTX Ctx = { "kmk_cat", NULL }; 173 return kmk_builtin_cat(argc, argv, envp, &Ctx); 174 } 175 #endif 176 177 static int 178 usage(PKMKBUILTINCTX pCtx, int fIsErr) 179 { 180 kmk_builtin_ctx_printf(pCtx, fIsErr, 181 "usage: %s [-benstuv] [file ...]\n" 182 " or: %s --help\n" 183 " or: %s --version\n", 184 pCtx->pszProgName, pCtx->pszProgName, 185 pCtx->pszProgName); 177 186 return 1; 178 187 } 179 188 180 189 static int 181 scanfiles( char *argv[], int cooked)190 scanfiles(PKMKBUILTINCTX pCtx, char *argv[], int cooked) 182 191 { 183 192 int i = 0; … … 198 207 #ifndef NO_UDOM_SUPPORT 199 208 if (fd < 0 && errno == EOPNOTSUPP) 200 fd = udom_open(p ath, O_RDONLY);209 fd = udom_open(pCtx, path, O_RDONLY); 201 210 #endif 202 211 } 203 212 if (fd < 0) { 204 warn( "%s", path);213 warn(pCtx, "%s", path); 205 214 rc2 = 1; /* non fatal */ 206 215 } else if (cooked) { 207 216 if (fd == STDIN_FILENO) 208 rc = cook_cat( stdin);217 rc = cook_cat(pCtx, stdin); 209 218 else { 210 219 fp = fdopen(fd, "r"); 211 rc = cook_cat( fp);220 rc = cook_cat(pCtx, fp); 212 221 fclose(fp); 213 222 } 214 223 } else { 215 rc = raw_cat( fd);224 rc = raw_cat(pCtx, fd); 216 225 if (fd != STDIN_FILENO) 217 226 close(fd); … … 224 233 } 225 234 226 static int 227 cook_cat(FILE *fp) 235 static int cat_putchar(PKMKBUILTINCTX pCtx, char ch) 236 { 237 #ifndef KMK_BUILTIN_STANDALONE 238 if (pCtx->pOut) { 239 output_write_text(pCtx->pOut, 0, &ch, 1); 240 return 0; 241 } 242 #endif 243 return putchar(ch); 244 } 245 246 static int 247 cook_cat(PKMKBUILTINCTX pCtx, FILE *fp) 228 248 { 229 249 int ch, gobble, line, prev; … … 246 266 } 247 267 if (nflag && (!bflag || ch != '\n')) { 248 (void)fprintf(stdout, "%6d\t", ++line);268 kmk_builtin_ctx_printf(pCtx, 0, "%6d\t", ++line); 249 269 if (ferror(stdout)) 250 270 break; … … 252 272 } 253 273 if (ch == '\n') { 254 if (eflag && putchar('$') == EOF)274 if (eflag && cat_putchar(pCtx, '$') == EOF) 255 275 break; 256 276 } else if (ch == '\t') { 257 277 if (tflag) { 258 if ( putchar('^') == EOF || putchar('I') == EOF)278 if (cat_putchar(pCtx, '^') == EOF || cat_putchar(pCtx, 'I') == EOF) 259 279 break; 260 280 continue; … … 262 282 } else if (vflag) { 263 283 if (!isascii(ch) && !isprint(ch)) { 264 if ( putchar('M') == EOF || putchar('-') == EOF)284 if (cat_putchar(pCtx, 'M') == EOF || cat_putchar(pCtx, '-') == EOF) 265 285 break; 266 286 ch = toascii(ch); 267 287 } 268 288 if (iscntrl(ch)) { 269 if ( putchar('^') == EOF ||270 putchar(ch == '\177' ? '?' :289 if (cat_putchar(pCtx, '^') == EOF || 290 cat_putchar(pCtx, ch == '\177' ? '?' : 271 291 ch | 0100) == EOF) 272 292 break; … … 274 294 } 275 295 } 276 if ( putchar(ch) == EOF)296 if (cat_putchar(pCtx, ch) == EOF) 277 297 break; 278 298 } 279 299 if (ferror(fp)) { 280 warn( "%s", filename);300 warn(pCtx, "%s", filename); 281 301 rc = 1; 282 302 clearerr(fp); 283 303 } 284 304 if (ferror(stdout)) 285 return err( 1, "stdout");305 return err(pCtx, 1, "stdout"); 286 306 return rc; 287 307 } 288 308 289 309 static int 290 raw_cat( int rfd)310 raw_cat(PKMKBUILTINCTX pCtx, int rfd) 291 311 { 292 312 int off, wfd = fileno(stdout); … … 299 319 if (buf == NULL) { 300 320 if (fstat(wfd, &sbuf)) 301 return err( 1, "%s", filename);321 return err(pCtx, 1, "%s", filename); 302 322 #ifdef KBUILD_OS_WINDOWS 303 323 bsize = 16384; … … 306 326 #endif 307 327 if ((buf = malloc(bsize)) == NULL) 308 return err( 1, "buffer");328 return err(pCtx, 1, "buffer"); 309 329 } 310 330 while ((nr = read(rfd, buf, bsize)) > 0) 311 for (off = 0; nr; nr -= nw, off += nw) 312 if ((nw = write(wfd, buf + off, (size_t)nr)) < 0) 313 return err(1, "stdout"); 331 for (off = 0; nr; nr -= nw, off += nw) { 332 #ifndef KMK_BUILTIN_STANDALONE 333 if (pCtx->pOut) 334 nw = output_write_text(pCtx->pOut, 0, buf, nr); 335 else 336 #endif 337 nw = write(wfd, buf + off, (size_t)nr); 338 if (nw < 0) 339 return err(pCtx, 1, "stdout"); 340 } 314 341 if (nr < 0) { 315 warn( "%s", filename);342 warn(pCtx, "%s", filename); 316 343 return 1; 317 344 } … … 322 349 323 350 static int 324 udom_open( const char *path, int flags)351 udom_open(PKMKBUILTINCTX pCtx, const char *path, int flags) 325 352 { 326 353 struct sockaddr_un sou; … … 356 383 case O_RDONLY: 357 384 if (shutdown(fd, SHUT_WR) == -1) 358 warn( NULL);385 warn(pCtx, NULL); 359 386 break; 360 387 case O_WRONLY: 361 388 if (shutdown(fd, SHUT_RD) == -1) 362 warn( NULL);389 warn(pCtx, NULL); 363 390 break; 364 391 default: … … 370 397 371 398 #endif 399
Note:
See TracChangeset
for help on using the changeset viewer.