awk: fix memory leak (can affect large file processing)

This commit is contained in:
Denis Vlasenko 2007-02-24 17:05:52 +00:00
parent 5276402f2c
commit 629563b5d7

View File

@ -12,34 +12,34 @@
#include <math.h> #include <math.h>
#define MAXVARFMT 240 #define MAXVARFMT 240
#define MINNVBLOCK 64 #define MINNVBLOCK 64
/* variable flags */ /* variable flags */
#define VF_NUMBER 0x0001 /* 1 = primary type is number */ #define VF_NUMBER 0x0001 /* 1 = primary type is number */
#define VF_ARRAY 0x0002 /* 1 = it's an array */ #define VF_ARRAY 0x0002 /* 1 = it's an array */
#define VF_CACHED 0x0100 /* 1 = num/str value has cached str/num eq */ #define VF_CACHED 0x0100 /* 1 = num/str value has cached str/num eq */
#define VF_USER 0x0200 /* 1 = user input (may be numeric string) */ #define VF_USER 0x0200 /* 1 = user input (may be numeric string) */
#define VF_SPECIAL 0x0400 /* 1 = requires extra handling when changed */ #define VF_SPECIAL 0x0400 /* 1 = requires extra handling when changed */
#define VF_WALK 0x0800 /* 1 = variable has alloc'd x.walker list */ #define VF_WALK 0x0800 /* 1 = variable has alloc'd x.walker list */
#define VF_FSTR 0x1000 /* 1 = string points to fstring buffer */ #define VF_FSTR 0x1000 /* 1 = var::string points to fstring buffer */
#define VF_CHILD 0x2000 /* 1 = function arg; x.parent points to source */ #define VF_CHILD 0x2000 /* 1 = function arg; x.parent points to source */
#define VF_DIRTY 0x4000 /* 1 = variable was set explicitly */ #define VF_DIRTY 0x4000 /* 1 = variable was set explicitly */
/* these flags are static, don't change them when value is changed */ /* these flags are static, don't change them when value is changed */
#define VF_DONTTOUCH (VF_ARRAY | VF_SPECIAL | VF_WALK | VF_CHILD | VF_DIRTY) #define VF_DONTTOUCH (VF_ARRAY | VF_SPECIAL | VF_WALK | VF_CHILD | VF_DIRTY)
/* Variable */ /* Variable */
typedef struct var_s { typedef struct var_s {
unsigned short type; /* flags */ unsigned short type; /* flags */
double number; double number;
char *string; char *string;
union { union {
int aidx; /* func arg idx (for compilation stage) */ int aidx; /* func arg idx (for compilation stage) */
struct xhash_s *array; /* array ptr */ struct xhash_s *array; /* array ptr */
struct var_s *parent; /* for func args, ptr to actual parameter */ struct var_s *parent; /* for func args, ptr to actual parameter */
char **walker; /* list of array elements (for..in) */ char **walker; /* list of array elements (for..in) */
} x; } x;
} var; } var;
@ -740,7 +740,7 @@ static var *copyvar(var *dest, const var *src)
{ {
if (dest != src) { if (dest != src) {
clrvar(dest); clrvar(dest);
dest->type |= (src->type & ~VF_DONTTOUCH); dest->type |= (src->type & ~(VF_DONTTOUCH | VF_FSTR));
dest->number = src->number; dest->number = src->number;
if (src->string) if (src->string)
dest->string = xstrdup(src->string); dest->string = xstrdup(src->string);