tc.str.c (167466) | tc.str.c (195609) |
---|---|
1/* $Header: /p/tcsh/cvsroot/tcsh/tc.str.c,v 3.26 2006/03/02 18:46:45 christos Exp $ */ | 1/* $Header: /p/tcsh/cvsroot/tcsh/tc.str.c,v 3.30 2009/06/25 21:27:38 christos Exp $ */ |
2/* 3 * tc.str.c: Short string package 4 * This has been a lesson of how to write buggy code! 5 */ 6/*- 7 * Copyright (c) 1980, 1991 The Regents of the University of California. 8 * All rights reserved. 9 * --- 20 unchanged lines hidden (view full) --- 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 */ 34#include "sh.h" 35 36#include <limits.h> 37 | 2/* 3 * tc.str.c: Short string package 4 * This has been a lesson of how to write buggy code! 5 */ 6/*- 7 * Copyright (c) 1980, 1991 The Regents of the University of California. 8 * All rights reserved. 9 * --- 20 unchanged lines hidden (view full) --- 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 */ 34#include "sh.h" 35 36#include <limits.h> 37 |
38RCSID("$tcsh: tc.str.c,v 3.26 2006/03/02 18:46:45 christos Exp $") | 38RCSID("$tcsh: tc.str.c,v 3.30 2009/06/25 21:27:38 christos Exp $") |
39 40#define MALLOC_INCR 128 41#ifdef WIDE_STRINGS 42#define MALLOC_SURPLUS MB_LEN_MAX /* Space for one multibyte character */ 43#else 44#define MALLOC_SURPLUS 0 45#endif 46 47#ifdef WIDE_STRINGS 48size_t 49one_mbtowc(wchar_t *pwc, const char *s, size_t n) 50{ 51 int len; 52 53 len = rt_mbtowc(pwc, s, n); 54 if (len == -1) { | 39 40#define MALLOC_INCR 128 41#ifdef WIDE_STRINGS 42#define MALLOC_SURPLUS MB_LEN_MAX /* Space for one multibyte character */ 43#else 44#define MALLOC_SURPLUS 0 45#endif 46 47#ifdef WIDE_STRINGS 48size_t 49one_mbtowc(wchar_t *pwc, const char *s, size_t n) 50{ 51 int len; 52 53 len = rt_mbtowc(pwc, s, n); 54 if (len == -1) { |
55 mbtowc(NULL, NULL, 0); | 55 reset_mbtowc(); |
56 *pwc = (unsigned char)*s | INVALID_BYTE; 57 } 58 if (len <= 0) 59 len = 1; 60 return len; 61} 62 63size_t --- 100 unchanged lines hidden (view full) --- 164 sdst = xmalloc((dstsize + MALLOC_SURPLUS) * sizeof(char)); 165 } 166 dst = sdst; 167 edst = &dst[dstsize]; 168 while (*src) { 169 dst += one_wctomb(dst, *src & CHAR); 170 src++; 171 if (dst >= edst) { | 56 *pwc = (unsigned char)*s | INVALID_BYTE; 57 } 58 if (len <= 0) 59 len = 1; 60 return len; 61} 62 63size_t --- 100 unchanged lines hidden (view full) --- 164 sdst = xmalloc((dstsize + MALLOC_SURPLUS) * sizeof(char)); 165 } 166 dst = sdst; 167 edst = &dst[dstsize]; 168 while (*src) { 169 dst += one_wctomb(dst, *src & CHAR); 170 src++; 171 if (dst >= edst) { |
172 char *wdst = dst; 173 char *wedst = edst; 174 |
|
172 dstsize += MALLOC_INCR; 173 sdst = xrealloc(sdst, (dstsize + MALLOC_SURPLUS) * sizeof(char)); 174 edst = &sdst[dstsize]; 175 dst = &edst[-MALLOC_INCR]; | 175 dstsize += MALLOC_INCR; 176 sdst = xrealloc(sdst, (dstsize + MALLOC_SURPLUS) * sizeof(char)); 177 edst = &sdst[dstsize]; 178 dst = &edst[-MALLOC_INCR]; |
179 while (wdst > wedst) { 180 dst++; 181 wdst--; 182 } |
|
176 } 177 } 178 *dst = 0; 179 return (sdst); 180} 181 182#ifndef WIDE_STRINGS 183Char * --- 291 unchanged lines hidden (view full) --- 475 (dstsize + MALLOC_SURPLUS) * sizeof(char)); 476 edst = &sdst[dstsize]; 477 dst = &edst[-MALLOC_INCR]; 478 } 479 } 480 dst += one_wctomb(dst, *src & CHAR); 481 src++; 482 if (dst >= edst) { | 183 } 184 } 185 *dst = 0; 186 return (sdst); 187} 188 189#ifndef WIDE_STRINGS 190Char * --- 291 unchanged lines hidden (view full) --- 482 (dstsize + MALLOC_SURPLUS) * sizeof(char)); 483 edst = &sdst[dstsize]; 484 dst = &edst[-MALLOC_INCR]; 485 } 486 } 487 dst += one_wctomb(dst, *src & CHAR); 488 src++; 489 if (dst >= edst) { |
490 ptrdiff_t i = dst - edst; |
|
483 dstsize += MALLOC_INCR; 484 sdst = xrealloc(sdst, (dstsize + MALLOC_SURPLUS) * sizeof(char)); 485 edst = &sdst[dstsize]; | 491 dstsize += MALLOC_INCR; 492 sdst = xrealloc(sdst, (dstsize + MALLOC_SURPLUS) * sizeof(char)); 493 edst = &sdst[dstsize]; |
486 dst = &edst[-MALLOC_INCR]; | 494 dst = &edst[-MALLOC_INCR + i]; |
487 } 488 } 489 *dst = 0; 490 return (sdst); 491} 492 | 495 } 496 } 497 *dst = 0; 498 return (sdst); 499} 500 |
501struct blk_buf * 502bb_alloc() 503{ 504 return xcalloc(1, sizeof(struct blk_buf)); 505} 506 |
|
493static void 494bb_store(struct blk_buf *bb, Char *str) 495{ 496 if (bb->len == bb->size) { /* Keep space for terminating NULL */ 497 if (bb->size == 0) 498 bb->size = 16; /* Arbitrary */ 499 else 500 bb->size *= 2; --- 16 unchanged lines hidden (view full) --- 517 size_t i; 518 519 bb = xbb; 520 for (i = 0; i < bb->len; i++) 521 xfree(bb->vec[i]); 522 xfree(bb->vec); 523} 524 | 507static void 508bb_store(struct blk_buf *bb, Char *str) 509{ 510 if (bb->len == bb->size) { /* Keep space for terminating NULL */ 511 if (bb->size == 0) 512 bb->size = 16; /* Arbitrary */ 513 else 514 bb->size *= 2; --- 16 unchanged lines hidden (view full) --- 531 size_t i; 532 533 bb = xbb; 534 for (i = 0; i < bb->len; i++) 535 xfree(bb->vec[i]); 536 xfree(bb->vec); 537} 538 |
539void 540bb_free(void *bb) 541{ 542 bb_cleanup(bb); 543 xfree(bb); 544} 545 |
|
525Char ** 526bb_finish(struct blk_buf *bb) 527{ 528 bb_store(bb, NULL); 529 return xrealloc(bb->vec, (bb->len + 1) * sizeof (*bb->vec)); 530} 531 532#define DO_STRBUF(STRBUF, CHAR, STRLEN) \ | 546Char ** 547bb_finish(struct blk_buf *bb) 548{ 549 bb_store(bb, NULL); 550 return xrealloc(bb->vec, (bb->len + 1) * sizeof (*bb->vec)); 551} 552 553#define DO_STRBUF(STRBUF, CHAR, STRLEN) \ |
554 \ 555struct STRBUF * \ 556STRBUF##_alloc(void) \ 557{ \ 558 return xcalloc(1, sizeof(struct STRBUF)); \ 559} \ 560 \ |
|
533static void \ 534STRBUF##_store1(struct STRBUF *buf, CHAR c) \ 535{ \ 536 if (buf->size == buf->len) { \ 537 if (buf->size == 0) \ 538 buf->size = 64; /* Arbitrary */ \ 539 else \ 540 buf->size *= 2; \ --- 47 unchanged lines hidden (view full) --- 588STRBUF##_cleanup(void *xbuf) \ 589{ \ 590 struct STRBUF *buf; \ 591 \ 592 buf = xbuf; \ 593 xfree(buf->s); \ 594} \ 595 \ | 561static void \ 562STRBUF##_store1(struct STRBUF *buf, CHAR c) \ 563{ \ 564 if (buf->size == buf->len) { \ 565 if (buf->size == 0) \ 566 buf->size = 64; /* Arbitrary */ \ 567 else \ 568 buf->size *= 2; \ --- 47 unchanged lines hidden (view full) --- 616STRBUF##_cleanup(void *xbuf) \ 617{ \ 618 struct STRBUF *buf; \ 619 \ 620 buf = xbuf; \ 621 xfree(buf->s); \ 622} \ 623 \ |
624void \ 625STRBUF##_free(void *xbuf) \ 626{ \ 627 STRBUF##_cleanup(xbuf); \ 628 xfree(xbuf); \ 629} \ 630 \ |
|
596const struct STRBUF STRBUF##_init /* = STRBUF##_INIT; */ 597 598DO_STRBUF(strbuf, char, strlen); 599DO_STRBUF(Strbuf, Char, Strlen); | 631const struct STRBUF STRBUF##_init /* = STRBUF##_INIT; */ 632 633DO_STRBUF(strbuf, char, strlen); 634DO_STRBUF(Strbuf, Char, Strlen); |