Jeroen Demeyer on Thu, 12 Jan 2017 10:55:38 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
[PATCH] New function outString_printf |
Cheers, Jeroen.
>From a9e68cebbf755eb3b8ccbc0e4042d3de67df238f Mon Sep 17 00:00:00 2001 From: Jeroen Demeyer <jdemeyer@cage.ugent.be> Date: Thu, 12 Jan 2017 09:51:39 +0100 Subject: [PATCH 1/5] New function outString_printf --- src/headers/paripriv.h | 11 ++++++++++ src/language/es.c | 56 +++++++++++++++++++++++++++++--------------------- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/src/headers/paripriv.h b/src/headers/paripriv.h index 71047c1..b0e6eb1 100644 --- a/src/headers/paripriv.h +++ b/src/headers/paripriv.h @@ -254,6 +254,17 @@ out_print_text(PariOUT *out, const char *s) { print_prefixed_text(out, s,NULL,NU INLINE long is_keyword_char(char c) { return (isalnum((int)c) || c=='_'); } +typedef struct outString { + char *string; /* start of the output buffer */ + char *end; /* end of the output buffer */ + char *cur; /* current writing place in the output buffer */ + size_t size; /* buffer size */ + int use_stack; /* use stack_malloc instead of malloc ? */ +} outString; + +void outString_init(outString *S, int use_stack); +void outString_printf(outString *S, const char *fmt, ...); + /* Interfaces (GP, etc.) */ hashtable *hash_from_link(GEN e, GEN names, int use_stack); void gen_relink(GEN x, hashtable *table); diff --git a/src/language/es.c b/src/language/es.c index 251717e..e413bd2 100644 --- a/src/language/es.c +++ b/src/language/es.c @@ -41,14 +41,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ static const char esc = (0x1f & '['); /* C-[ = escape */ -typedef struct outString { - char *string; /* start of the output buffer */ - char *end; /* end of the output buffer */ - char *cur; /* current writing place in the output buffer */ - size_t size; /* buffer size */ - int use_stack; /* use stack_malloc instead of malloc ? */ -} outString; - typedef void (*OUT_FUN)(GEN, pariout_t *, outString *); static void bruti_sign(GEN g, pariout_t *T, outString *S, int addsign); @@ -908,8 +900,8 @@ str_putc(outString *S, char c) { if (S->cur == S->end) str_alloc0(S, S->size, S->size << 1); } -static void -str_init(outString *S, int use_stack) +void +outString_init(outString *S, int use_stack) { char *s; S->size = 1024; @@ -918,6 +910,7 @@ str_init(outString *S, int use_stack) s = (char*)stack_malloc(S->size); else s = (char*)pari_malloc(S->size); + s[0] = '\0'; S->string = S->cur = s; S->end = S->string + S->size; } @@ -937,7 +930,7 @@ str_putscut(outString *S, const char *str, int cut) static char * stack_GENtostr_fun(GEN x, pariout_t *T, OUT_FUN out) { - outString S; str_init(&S, 1); + outString S; outString_init(&S, 1); out(x, T, &S); *S.cur = 0; return S.string; } @@ -951,7 +944,7 @@ static char * GENtostr_fun(GEN x, pariout_t *T, OUT_FUN out) { pari_sp av = avma; - outString S; str_init(&S, 0); + outString S; outString_init(&S, 0); out(x, T, &S); *S.cur = 0; avma = av; return S.string; } @@ -1283,12 +1276,16 @@ fmtreal(outString *S, GEN gvalue, int space, int signvalue, int FORMAT, outpad(S, buf, strlen(buf), signvalue, ljust, len, zpad); avma = av; } + /* format handling "inspired" by the standard draft at -- http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf pages 274ff * fmt is a standard printf format, except 'P' is a "length modifier" - * allowing GEN arguments. Use either the arg_vector or (if NULL) the va_list */ -static char * -sm_dopr(const char *fmt, GEN arg_vector, va_list args) + * allowing GEN arguments. Use either the arg_vector or (if NULL) the va_list. + * + * We will append the output to the outString *S, which must be initialized. + */ +static void +outString_arg_vprintf(outString *S, const char *fmt, GEN arg_vector, va_list args) { int GENflag = 0, longflag = 0, pointflag = 0; int print_plus, print_blank, with_sharp, ch, ljust, len, maxwidth, zpad; @@ -1296,9 +1293,6 @@ sm_dopr(const char *fmt, GEN arg_vector, va_list args) int index = 1; GEN gvalue; const char *save_fmt = fmt; - outString __S, *S = &__S; - - str_init(S, 0); while ((ch = *fmt++) != '\0') { switch(ch) { @@ -1500,8 +1494,16 @@ nextch: break; } /* first switch on ch */ } /* while loop on ch */ - *S->cur = 0; - return S->string; + *S->cur = '\0'; +} + +static char * +sm_dopr(const char *fmt, GEN arg_vector, va_list args) +{ + outString s; + outString_init(&s, 0); + outString_arg_vprintf(&s, fmt, arg_vector, args); + return s.string; } void @@ -3062,7 +3064,7 @@ matbruti(GEN g, pariout_t *T, outString *S) outString scratchstr; pad = cgetg(l*r+1, t_VECSMALL); /* left on stack if (S->use_stack)*/ av2 = avma; - str_init(&scratchstr, 1); + outString_init(&scratchstr, 1); for (j=1; j<r; j++) { GEN col = gel(g,j); @@ -4533,7 +4535,7 @@ char * pari_sprint0(const char *s, GEN g, long flag) { outString S; - str_init(&S, 0); + outString_init(&S, 0); str_puts(&S, s); str_print0(&S, g, flag); return S.string; @@ -4544,7 +4546,7 @@ print0_file(FILE *out, GEN g, long flag) { pari_sp av = avma; outString S; - str_init(&S, 1); + outString_init(&S, 1); str_print0(&S, g, flag); fputs(S.string, out); avma = av; @@ -4660,6 +4662,14 @@ pari_fprintf(FILE *file, const char *fmt, ...) pari_vfprintf(file, fmt, ap); va_end(ap); } +void +outString_printf(outString *S, const char *fmt, ...) +{ + va_list ap; va_start(ap, fmt); + outString_arg_vprintf(S, fmt, NULL, ap); + va_end(ap); +} + void print (GEN g) { print0(g, f_RAW); pari_putc('\n'); pari_flush(); } void printtex(GEN g) { print0(g, f_TEX); pari_putc('\n'); pari_flush(); } void print1 (GEN g) { print0(g, f_RAW); pari_flush(); } -- 2.7.3