*** empty log message ***
This commit is contained in:
parent
ce3517788a
commit
37567c705e
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: run.c,v 1.183 2006-08-30 07:15:14 bacon Exp $
|
* $Id: run.c,v 1.184 2006-08-30 14:23:19 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -4653,16 +4653,36 @@ static int __set_record (xp_awk_run_t* run, const xp_char_t* str, xp_size_t len)
|
|||||||
|
|
||||||
static int __split_record (xp_awk_run_t* run)
|
static int __split_record (xp_awk_run_t* run)
|
||||||
{
|
{
|
||||||
/* TODO: support FS and regular expression */
|
|
||||||
/* TODO: set NR after split */
|
|
||||||
|
|
||||||
xp_char_t* p, * tok;
|
xp_char_t* p, * tok;
|
||||||
xp_size_t len, tok_len, nflds;
|
xp_size_t len, tok_len, nflds;
|
||||||
xp_awk_val_t* v;
|
xp_awk_val_t* v, * fs;
|
||||||
|
xp_char_t* fs_ptr;
|
||||||
|
xp_size_t fs_len;
|
||||||
|
|
||||||
/* inrec should be cleared before __split_record is called */
|
/* inrec should be cleared before __split_record is called */
|
||||||
xp_assert (run->inrec.nflds == 0);
|
xp_assert (run->inrec.nflds == 0);
|
||||||
|
|
||||||
|
/* get FS */
|
||||||
|
#if 0
|
||||||
|
fs = xp_awk_getglobal (run, XP_AWK_GLOBAL_FS);
|
||||||
|
if (fs->type == XP_AWK_VAL_NIL)
|
||||||
|
{
|
||||||
|
fs_ptr = XP_NULL;
|
||||||
|
fs_len = 0;
|
||||||
|
}
|
||||||
|
else if (fs->type == XP_AWK_VAL_STR)
|
||||||
|
{
|
||||||
|
fs_ptr = ((xp_awk_val_str_t*)fs)->buf;
|
||||||
|
fs_len = ((xp_awk_val_str_t*)fs)->len;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fs_ptr = xp_awk_valtostr (
|
||||||
|
fs, &run->errnum, xp_true, XP_NULL, &fs_len);
|
||||||
|
if (fs_ptr == XP_NULL) return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* scan the input record to count the fields */
|
/* scan the input record to count the fields */
|
||||||
p = XP_STR_BUF(&run->inrec.line);
|
p = XP_STR_BUF(&run->inrec.line);
|
||||||
len = XP_STR_LEN(&run->inrec.line);
|
len = XP_STR_LEN(&run->inrec.line);
|
||||||
@ -4670,12 +4690,38 @@ static int __split_record (xp_awk_run_t* run)
|
|||||||
nflds = 0;
|
nflds = 0;
|
||||||
while (p != XP_NULL)
|
while (p != XP_NULL)
|
||||||
{
|
{
|
||||||
p = xp_strxtok (p, len, XP_T(" \t"), &tok, &tok_len);
|
/* TODO: support FS */
|
||||||
|
#if 0
|
||||||
|
if (fs->type == XP_AWK_VAL_NIL)
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
p = xp_strxtok (p, len, XP_T(" \t"), &tok, &tok_len);
|
||||||
|
#if 0
|
||||||
|
}
|
||||||
|
else if (fs_len == 0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (fs_len == 1)
|
||||||
|
{
|
||||||
|
p = xp_strxntok (p, len,
|
||||||
|
fs_ptr, fs_len, &tok, &tok_len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* TODO: FS regular expression */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (nflds == 0 && p == XP_NULL && tok_len == 0)
|
if (nflds == 0 && p == XP_NULL && tok_len == 0)
|
||||||
{
|
{
|
||||||
/* there are no fields. it can just return here
|
/* there are no fields. it can just return here
|
||||||
* as __clear_record has been called before this */
|
* as __clear_record has been called before this */
|
||||||
|
#if 0
|
||||||
|
if (fs->type != XP_AWK_VAL_STR)
|
||||||
|
{
|
||||||
|
if (fs_ptr != XP_NULL) xp_free (fs_ptr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4686,6 +4732,14 @@ static int __split_record (xp_awk_run_t* run)
|
|||||||
(p - XP_STR_BUF(&run->inrec.line));
|
(p - XP_STR_BUF(&run->inrec.line));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* THIS PART IS WRONG. FREE IT AFTER THE NEXT SPLIT LOOP */
|
||||||
|
#if 0
|
||||||
|
if (fs->type != XP_AWK_VAL_STR)
|
||||||
|
{
|
||||||
|
if (fs_ptr != XP_NULL) xp_free (fs_ptr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* allocate space */
|
/* allocate space */
|
||||||
if (nflds > run->inrec.maxflds)
|
if (nflds > run->inrec.maxflds)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user