Changeset 2900 for trunk/src/kmk
- Timestamp:
- Sep 9, 2016, 4:42:06 PM (9 years ago)
- Location:
- trunk/src/kmk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/kmkbuiltin/cat.c
r2113 r2900 81 81 82 82 83 #ifdef KBUILD_OS_WINDOWS 84 /* This is a trick to seriuosly speed up console output windows. */ 85 # undef write 86 # define write maybe_con_write 87 extern ssize_t maybe_con_write(int, void const *, size_t); 88 #endif 89 90 83 91 int bflag, eflag, nflag, sflag, tflag, vflag; 84 92 /*int rval;*/ … … 120 128 #ifdef kmk_builtin_cat /* kmk did this already. */ 121 129 setlocale(LC_CTYPE, ""); 130 #else 131 fflush(stdout); 122 132 #endif 123 133 … … 288 298 raw_cat(int rfd) 289 299 { 290 int off, wfd ;300 int off, wfd = fileno(stdout); 291 301 ssize_t nr, nw; 292 302 static size_t bsize; … … 298 308 if (fstat(wfd, &sbuf)) 299 309 return err(1, "%s", filename); 300 #ifdef _MSC_VER301 bsize = 1 024;310 #ifdef KBUILD_OS_WINDOWS 311 bsize = 16384; 302 312 #else 303 313 bsize = MAX(sbuf.st_blksize, 1024); -
trunk/src/kmk/kmkbuiltin/printf.c
r2646 r2900 76 76 #include "../kmkbuiltin.h" 77 77 78 #ifdef KBUILD_OS_WINDOWS 79 /* This is a trick to speed up console output on windows. */ 80 # undef fwrite 81 # define fwrite maybe_con_fwrite 82 extern size_t maybe_con_fwrite(void const *, size_t, size_t, FILE *); 83 #endif 84 78 85 79 86 #ifdef __GNUC__ … … 113 120 static int usage(FILE *); 114 121 122 static int flush_buffer(void); 115 123 static void b_count(int); 116 124 static void b_output(int); … … 126 134 #include "../../bin/sh/bltin/bltin.h" 127 135 #endif /* SHELL */ 136 137 /* Buffer the output because windows doesn't do line buffering of stdout. */ 138 static char g_achBuf[256]; 139 static size_t g_cchBuf; 128 140 129 141 #define PF(f, func) { \ … … 156 168 int ch; 157 169 158 /* kmk: reset getopt and set progname*/170 /* kmk: reset getopt, set progname and reset buffer. */ 159 171 g_progname = argv[0]; 160 172 opterr = 1; … … 225 237 rval = 0; 226 238 gargv = NULL; 239 g_cchBuf = 0; 227 240 228 241 format = *argv; … … 272 285 ch = *fmt; 273 286 if (!ch) { 287 flush_buffer(); 274 288 warnx("missing format character"); 275 289 return (1); … … 354 368 } 355 369 default: 370 flush_buffer(); 356 371 warnx("%s: invalid directive", start); 357 372 return 1; … … 360 375 *fmt = nextch; 361 376 /* escape if a \c was encountered */ 362 if (rval & 0x100) 377 if (rval & 0x100) { 378 flush_buffer(); 363 379 return rval & ~0x100; 380 } 364 381 } 365 382 } while (gargv != argv && *gargv); 366 383 384 flush_buffer(); 367 385 return rval; 368 386 } 387 369 388 370 389 /* helper functions for conv_escape_str */ … … 408 427 } 409 428 #endif 410 return putchar(ch); 429 /* Buffered output. */ 430 if (g_cchBuf + 1 < sizeof(g_achBuf)) { 431 g_achBuf[g_cchBuf++] = ch; 432 } else { 433 int rc = flush_buffer(); 434 g_achBuf[g_cchBuf++] = ch; 435 if (rc) 436 return -1; 437 } 438 return 0; 411 439 } 412 440 413 441 static int wrap_printf(const char * fmt, ...) 414 442 { 415 int rc;443 ssize_t cchRet; 416 444 va_list va; 417 445 char *pszTmp; 446 447 va_start(va, fmt); 448 cchRet = vasprintf(&pszTmp, fmt, va); 449 va_end(va); 450 if (cchRet >= 0) { 418 451 #ifndef kmk_builtin_printf 419 if (g_o) { 420 char *str; 421 422 va_start(va, fmt); 423 rc = vasprintf(&str, fmt, va); 424 va_end(va); 425 if (rc >= 0) { 426 g_o = variable_buffer_output(g_o, str, rc); 427 free(str); 428 } 429 return rc; 430 } 431 #endif 432 433 va_start(va, fmt); 434 rc = vprintf(fmt, va); 435 va_end(va); 436 return rc; 437 } 452 if (g_o) { 453 g_o = variable_buffer_output(g_o, pszTmp, cchRet); 454 } else 455 #endif 456 { 457 if (cchRet + g_cchBuf <= sizeof(g_achBuf)) { 458 /* We've got space in the buffer. */ 459 memcpy(&g_achBuf[g_cchBuf], pszTmp, cchRet); 460 g_cchBuf += cchRet; 461 } else { 462 /* Try write out complete lines. */ 463 const char *pszLeft = pszTmp; 464 ssize_t cchLeft = cchRet; 465 466 while (cchLeft > 0) { 467 const char *pchNewLine = strchr(pszLeft, '\n'); 468 ssize_t cchLine = pchNewLine ? pchNewLine - pszLeft + 1 : cchLeft; 469 if (g_cchBuf + cchLine <= sizeof(g_achBuf)) { 470 memcpy(&g_achBuf[g_cchBuf], pszLeft, cchLine); 471 g_cchBuf += cchLine; 472 } else { 473 if (flush_buffer() < 0) { 474 return -1; 475 } 476 if (fwrite(pszLeft, cchLine, 1, stdout) < 1) { 477 return -1; 478 } 479 } 480 pszLeft += cchLine; 481 cchLeft -= cchLine; 482 } 483 } 484 } 485 free(pszTmp); 486 } 487 return (int)cchRet; 488 } 489 490 /** 491 * Flushes the g_abBuf/g_cchBuf. 492 */ 493 static int flush_buffer(void) 494 { 495 if (g_cchBuf > 0) { 496 ssize_t cchToWrite = g_cchBuf; 497 ssize_t cchWritten = fwrite(g_achBuf, 1, g_cchBuf, stdout); 498 g_cchBuf = 0; 499 if (cchWritten >= cchToWrite) { 500 /* likely */ 501 } else { 502 ssize_t off = cchWritten; 503 if (cchWritten >= 0) { 504 off = cchWritten; 505 } else if (errno == EINTR) { 506 cchWritten = 0; 507 } else { 508 return -1; 509 } 510 511 while (off < cchToWrite) { 512 cchWritten = fwrite(&g_achBuf[off], 1, cchToWrite - off, stdout); 513 if (cchWritten > 0) { 514 off += cchWritten; 515 } else if (errno == EINTR) { 516 /* nothing */ 517 } else { 518 return -1; 519 } 520 } 521 } 522 } 523 return 0; 524 } 525 438 526 439 527 -
trunk/src/kmk/main.c
r2818 r2900 1380 1380 char *windows32_path = NULL; 1381 1381 1382 # ifndef ELECTRIC_HEAP /* Drop this because it prevents JIT debugging. */1382 # ifndef ELECTRIC_HEAP /* Drop this because it prevents JIT debugging. */ 1383 1383 SetUnhandledExceptionFilter(handle_runtime_exceptions); 1384 # endif /* !ELECTRIC_HEAP */1384 # endif /* !ELECTRIC_HEAP */ 1385 1385 1386 1386 /* start off assuming we have no shell */
Note:
See TracChangeset
for help on using the changeset viewer.