*** empty log message ***

This commit is contained in:
hyung-hwan 2006-11-14 14:54:47 +00:00
parent 27c5b202c5
commit 4d2dca2438
5 changed files with 80 additions and 28 deletions

View File

@ -1,5 +1,5 @@
/*
* $Id: func.c,v 1.73 2006-11-13 09:37:00 bacon Exp $
* $Id: func.c,v 1.74 2006-11-14 14:54:17 bacon Exp $
*/
#include <ase/awk/awk_i.h>
@ -1244,9 +1244,42 @@ static int __bfn_match (ase_awk_run_t* run)
static int __bfn_sprintf (ase_awk_run_t* run)
{
ase_size_t nargs;
ase_awk_val_t* a0;
ase_char_t* str0, * ptr;
ase_size_t len0, len;
nargs = ase_awk_getnargs (run);
ASE_AWK_ASSERT (run->awk, nargs > 0);
a0 = ase_awk_getarg (run, 0);
if (a0->type == ASE_AWK_VAL_STR)
{
str0 = ((ase_awk_val_str_t*)a0)->buf;
len0 = ((ase_awk_val_str_t*)a0)->len;
}
else
{
str0 = ase_awk_valtostr (
run, a0, ASE_AWK_VALTOSTR_CLEAR, ASE_NULL, &len0);
if (str0 == ASE_NULL) return -1;
}
ptr = ase_awk_sprintf (run, str0, len0, nargs, ASE_NULL, &len);
if (a0->type != ASE_AWK_VAL_STR) ASE_AWK_FREE (run->awk, str0);
if (ptr == ASE_NULL) return -1;
a0 = ase_awk_makestrval (run, ptr, len);
if (a0 == ASE_NULL)
{
ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM);
return -1;
}
ase_awk_setretval (run, a0);
return 0;
}
#if 0
static int __bfn_system (ase_awk_run_t* run)
{

View File

@ -1,5 +1,5 @@
/*
* $Id: run.c,v 1.258 2006-11-13 15:07:24 bacon Exp $
* $Id: run.c,v 1.259 2006-11-14 14:54:17 bacon Exp $
*/
#include <ase/awk/awk_i.h>
@ -2441,7 +2441,7 @@ static int __formatted_output (
ase_size_t len;
int n;
ptr = ase_awk_sprintf (run, fmt, fmt_len, args, &len);
ptr = ase_awk_sprintf (run, fmt, fmt_len, 0, args, &len);
if (ptr == ASE_NULL) return -1;
n = ase_awk_writeextio_str (run, out_type, dst, ptr, len);
@ -5503,10 +5503,11 @@ static ase_char_t* __idxnde_to_str (
}
ase_char_t* ase_awk_sprintf (
ase_awk_run_t* run, const ase_char_t* fmt,
ase_size_t fmt_len, ase_awk_nde_t* args, ase_size_t* len)
ase_awk_run_t* run, const ase_char_t* fmt, ase_size_t fmt_len,
ase_size_t nargs_on_stack, ase_awk_nde_t* args, ase_size_t* len)
{
ase_size_t i, j;
ase_size_t stack_arg_idx = 1;
#define OUT_CHAR(c) \
do { \
@ -5554,13 +5555,15 @@ ase_char_t* ase_awk_sprintf (
ase_char_t* p;
int n;
if (args == ASE_NULL)
if (args == ASE_NULL && stack_arg_idx >= nargs_on_stack)
{
run->errnum = ASE_AWK_EPRINTFARG;
return ASE_NULL;
}
v = __eval_expression (run, args);
v = (args == ASE_NULL)?
ase_awk_getarg (run, stack_arg_idx):
__eval_expression (run, args);
if (v == ASE_NULL) return ASE_NULL;
ase_awk_refupval (v);
@ -5586,7 +5589,8 @@ ase_char_t* ase_awk_sprintf (
p++;
}
args = args->next;
if (args == ASE_NULL) stack_arg_idx++;
else args = args->next;
i++;
}
else
@ -5610,13 +5614,15 @@ ase_char_t* ase_awk_sprintf (
ase_char_t* p;
int n;
if (args == ASE_NULL)
if (args == ASE_NULL && stack_arg_idx >= nargs_on_stack)
{
run->errnum = ASE_AWK_EPRINTFARG;
return ASE_NULL;
}
v = __eval_expression (run, args);
v = (args == ASE_NULL)?
ase_awk_getarg (run, stack_arg_idx):
__eval_expression (run, args);
if (v == ASE_NULL) return ASE_NULL;
ase_awk_refupval (v);
@ -5642,7 +5648,8 @@ ase_char_t* ase_awk_sprintf (
p++;
}
args = args->next;
if (args == ASE_NULL) stack_arg_idx++;
else args = args->next;
i++;
}
else
@ -5665,7 +5672,7 @@ ase_char_t* ase_awk_sprintf (
ase_char_t* p;
int n;
if (args == ASE_NULL)
if (args == ASE_NULL && stack_arg_idx >= nargs_on_stack)
{
run->errnum = ASE_AWK_EPRINTFARG;
return ASE_NULL;
@ -5675,7 +5682,9 @@ ase_char_t* ase_awk_sprintf (
FMT_CHAR (ASE_T('l'));
FMT_CHAR (fmt[i]);
v = __eval_expression (run, args);
v = (args == ASE_NULL)?
ase_awk_getarg (run, stack_arg_idx):
__eval_expression (run, args);
if (v == ASE_NULL) return ASE_NULL;
ase_awk_refupval (v);
@ -5712,7 +5721,7 @@ ase_char_t* ase_awk_sprintf (
ase_char_t* p;
int n;
if (args == ASE_NULL)
if (args == ASE_NULL && stack_arg_idx >= nargs_on_stack)
{
run->errnum = ASE_AWK_EPRINTFARG;
return ASE_NULL;
@ -5721,7 +5730,9 @@ ase_char_t* ase_awk_sprintf (
FMT_CHAR (ASE_T('L'));
FMT_CHAR (fmt[i]);
v = __eval_expression (run, args);
v = (args == ASE_NULL)?
ase_awk_getarg (run, stack_arg_idx):
__eval_expression (run, args);
if (v == ASE_NULL) return ASE_NULL;
ase_awk_refupval (v);
@ -5749,7 +5760,7 @@ ase_char_t* ase_awk_sprintf (
ase_awk_val_t* v;
ase_char_t* p;
if (args == ASE_NULL)
if (args == ASE_NULL && stack_arg_idx >= nargs_on_stack)
{
run->errnum = ASE_AWK_EPRINTFARG;
return ASE_NULL;
@ -5757,7 +5768,9 @@ ase_char_t* ase_awk_sprintf (
FMT_CHAR (fmt[i]);
v = __eval_expression (run, args);
v = (args == ASE_NULL)?
ase_awk_getarg (run, stack_arg_idx):
__eval_expression (run, args);
if (v == ASE_NULL) return ASE_NULL;
ase_awk_refupval (v);
@ -5815,7 +5828,7 @@ ase_char_t* ase_awk_sprintf (
ase_awk_val_t* v;
ase_char_t* p;
if (args == ASE_NULL)
if (args == ASE_NULL && stack_arg_idx >= nargs_on_stack)
{
run->errnum = ASE_AWK_EPRINTFARG;
return ASE_NULL;
@ -5823,7 +5836,9 @@ ase_char_t* ase_awk_sprintf (
FMT_CHAR (fmt[i]);
v = __eval_expression (run, args);
v = (args == ASE_NULL)?
ase_awk_getarg (run, stack_arg_idx):
__eval_expression (run, args);
if (v == ASE_NULL) return ASE_NULL;
ase_awk_refupval (v);
@ -5878,7 +5893,8 @@ ase_char_t* ase_awk_sprintf (
OUT_CHAR (fmt[i]);
}
args = args->next;
if (args == ASE_NULL) stack_arg_idx++;
else args = args->next;
ase_awk_str_clear (&run->sprintf.fmt);
}

View File

@ -1,5 +1,5 @@
/*
* $Id: run.h,v 1.22 2006-11-13 15:08:54 bacon Exp $
* $Id: run.h,v 1.23 2006-11-14 14:54:18 bacon Exp $
*/
#ifndef _ASE_AWK_RUN_H_
@ -105,8 +105,8 @@ extern "C" {
#endif
ase_char_t* ase_awk_sprintf (
ase_awk_run_t* run, const ase_char_t* fmt,
ase_size_t fmt_len, ase_awk_nde_t* args, ase_size_t* len);
ase_awk_run_t* run, const ase_char_t* fmt, ase_size_t fmt_len,
ase_size_t nargs_on_stack, ase_awk_nde_t* args, ase_size_t* len);
#ifdef __cplusplus
}

View File

@ -1,5 +1,5 @@
/*
* $Id: val.c,v 1.81 2006-11-13 15:08:54 bacon Exp $
* $Id: val.c,v 1.82 2006-11-14 14:54:18 bacon Exp $
*/
#include <ase/awk/awk_i.h>
@ -578,6 +578,7 @@ static ase_char_t* __val_real_to_str (
/* TODO: need to use awk's own version of sprintf so that it would have
* problems with handling long double or double... */
/* TODO: does it need to check if a null character is included in convfmt??? */
/* TODO: check if convfmt contains more that one format specifier */
run->awk->syscas.sprintf (tbuf, ase_countof(tbuf), tmp, (double)v->val);
if (buf == ASE_NULL)
{

View File

@ -29,4 +29,6 @@ BEGIN {
if (ARGC >= 0) printf ("ARGC [%++#10.10f] is positive\n", 10124.1123);
printf ("[%d], [%f], [%s]\n", 10124.1123, 10124.1123, 10124.1123);
printf ("[%-10c] [% 0*.*d]\n", 65, 45, 48, -1);
print sprintf ("abc%d %*.*d %c %s %c", 10, 20, 30, 40, "good", "good", 75.34);
}