X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fcase.c;h=bb6f7c0a8e05c735f9b17cd0aab309993e4d7a21;hb=258e45aa9b44b6a127e4f23c655f4740c04e05df;hp=a4a78dd0efcf9750d26c169e4db63a46e2093a25;hpb=5c3291dc396b795696e94f47780308fd7ace6fc4;p=pspp diff --git a/src/data/case.c b/src/data/case.c index a4a78dd0ef..bb6f7c0a8e 100644 --- a/src/data/case.c +++ b/src/data/case.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2004, 2007, 2009 Free Software Foundation, Inc. + Copyright (C) 2004, 2007, 2009, 2010, 2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,19 +16,27 @@ #include -#include +#include "data/case.h" #include #include #include -#include -#include -#include -#include +#include "data/value.h" +#include "data/variable.h" +#include "libpspp/assertion.h" +#include "libpspp/str.h" -#include "minmax.h" -#include "xalloc.h" +#include "gl/minmax.h" +#include "gl/xalloc.h" + +/* Set this flag to 1 to copy cases instead of ref counting them. + This is sometimes helpful in debugging situations. */ +#define DEBUG_CASEREFS 0 + +#if DEBUG_CASEREFS +#warning "Caseref debug enabled. CASES ARE NOT BEING SHARED!!" +#endif static size_t case_size (const struct caseproto *); static bool variable_matches_case (const struct ccase *, @@ -80,6 +88,19 @@ case_clone (const struct ccase *c) return case_unshare (case_ref (c)); } +/* Increments case C's reference count and returns C. Afterward, + case C is shared among its reference count holders. */ +struct ccase * +case_ref (const struct ccase *c_) +{ + struct ccase *c = CONST_CAST (struct ccase *, c_); + c->ref_cnt++; +#if DEBUG_CASEREFS + c = case_unshare__ (c); +#endif + return c; +} + /* Returns an estimate of the number of bytes of memory that would be consumed in creating a case based on PROTO. The estimate includes typical overhead from malloc() in addition @@ -308,7 +329,7 @@ case_num_idx (const struct ccase *c, size_t idx) Like the strings embedded in all "union value"s, the return value is not null-terminated. */ -const char * +const uint8_t * case_str (const struct ccase *c, const struct variable *v) { size_t idx = var_get_case_index (v); @@ -321,7 +342,7 @@ case_str (const struct ccase *c, const struct variable *v) Like the strings embedded in all "union value"s, the return value is not null-terminated. */ -const char * +const uint8_t * case_str_idx (const struct ccase *c, size_t idx) { assert (idx < c->proto->n_widths); @@ -336,7 +357,7 @@ case_str_idx (const struct ccase *c, size_t idx) Like the strings embedded in all "union value"s, the return value is not null-terminated. */ -char * +uint8_t * case_str_rw (struct ccase *c, const struct variable *v) { size_t idx = var_get_case_index (v); @@ -352,7 +373,7 @@ case_str_rw (struct ccase *c, const struct variable *v) Like the strings embedded in all "union value"s, the return value is not null-terminated. */ -char * +uint8_t * case_str_rw_idx (struct ccase *c, size_t idx) { assert (idx < c->proto->n_widths);