X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flibpspp%2Ftaint.c;h=c655d60a61cf9009fae1043ee9833877625f2704;hb=bbcfaa2d011a9e0115286769a51476a4dddf2b12;hp=0ec33a16a4981c6a7e457dcd2b93c47154fdc126;hpb=f5c108becd49d78f4898cab11352291f5689d24e;p=pspp diff --git a/src/libpspp/taint.c b/src/libpspp/taint.c index 0ec33a16a4..c655d60a61 100644 --- a/src/libpspp/taint.c +++ b/src/libpspp/taint.c @@ -1,31 +1,30 @@ -/* PSPP - computes sample statistics. - Copyright (C) 2007 Free Software Foundation, Inc. +/* PSPP - a program for statistical analysis. + Copyright (C) 2007, 2009, 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 the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. + 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + along with this program. If not, see . */ #include -#include +#include "libpspp/taint.h" #include -#include -#include +#include "libpspp/array.h" +#include "libpspp/assertion.h" +#include "libpspp/cast.h" -#include "xalloc.h" +#include "gl/xalloc.h" /* This code maintains two invariants: @@ -81,7 +80,7 @@ taint_create (void) struct taint * taint_clone (const struct taint *taint_) { - struct taint *taint = (struct taint *) taint_; + struct taint *taint = CONST_CAST (struct taint *, taint_); assert (taint->ref_cnt > 0); taint->ref_cnt++; @@ -97,26 +96,31 @@ taint_clone (const struct taint *taint_) bool taint_destroy (struct taint *taint) { - bool was_tainted = taint_is_tainted (taint); - if (--taint->ref_cnt == 0) + if ( taint ) { - size_t i, j; - - for (i = 0; i < taint->predecessors.cnt; i++) - for (j = 0; j < taint->successors.cnt; j++) - taint_propagate (taint->predecessors.taints[i], - taint->successors.taints[j]); - - for (i = 0; i < taint->predecessors.cnt; i++) - taint_list_remove (&taint->predecessors.taints[i]->successors, taint); - for (i = 0; i < taint->successors.cnt; i++) - taint_list_remove (&taint->successors.taints[i]->predecessors, taint); - - taint_list_destroy (&taint->successors); - taint_list_destroy (&taint->predecessors); - free (taint); + bool was_tainted = taint_is_tainted (taint); + if (--taint->ref_cnt == 0) + { + size_t i, j; + + for (i = 0; i < taint->predecessors.cnt; i++) + for (j = 0; j < taint->successors.cnt; j++) + taint_propagate (taint->predecessors.taints[i], + taint->successors.taints[j]); + + for (i = 0; i < taint->predecessors.cnt; i++) + taint_list_remove (&taint->predecessors.taints[i]->successors, taint); + for (i = 0; i < taint->successors.cnt; i++) + taint_list_remove (&taint->successors.taints[i]->predecessors, taint); + + taint_list_destroy (&taint->successors); + taint_list_destroy (&taint->predecessors); + free (taint); + } + return !was_tainted; } - return !was_tainted; + + return true; } /* Adds a propagation relationship from FROM to TO. This means @@ -136,8 +140,8 @@ taint_destroy (struct taint *taint) void taint_propagate (const struct taint *from_, const struct taint *to_) { - struct taint *from = (struct taint *) from_; - struct taint *to = (struct taint *) to_; + struct taint *from = CONST_CAST (struct taint *, from_); + struct taint *to = CONST_CAST (struct taint *, to_); if (from != to) { @@ -162,7 +166,7 @@ taint_is_tainted (const struct taint *taint) void taint_set_taint (const struct taint *taint_) { - struct taint *taint = (struct taint *) taint_; + struct taint *taint = CONST_CAST (struct taint *, taint_); if (!taint->tainted) recursively_set_taint (taint); } @@ -183,7 +187,7 @@ taint_has_tainted_successor (const struct taint *taint) void taint_reset_successor_taint (const struct taint *taint_) { - struct taint *taint = (struct taint *) taint_; + struct taint *taint = CONST_CAST (struct taint *, taint_); if (taint->tainted_successor) {