Deleted Added
full compact
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);