#include "pshuang.h" /**********************************************************************/ /* Definitions */ /**********************************************************************/ int debug_level = 0; base_symtab *file_symbol_table = NULL; base_symtab *global_symbol_table = NULL; char *k_qif_statement; char *k_qif_set_analyzed; char *k_qif_set; char *k_qif_variable; char *k_qif_variable_defined; char *k_qint_parameter; char *k_qinfluence_statement; char *k_qinfluence_set; char *k_qdecision_history; char *k_qdecision_current; /**********************************************************************/ /* Code */ /**********************************************************************/ /* The code for my_suif_proc_iter was lifted from suif/include/suif/misc.cc. I needed the functionality of being able to call a function after all the SUIF file proc's had been processed, so I threw in the ability to call a function before, too. Modifications are clearly marked. */ void my_suif_proc_iter(int argc, char * argv[], prociter_f fun, /* ADDED */ void (*before_hook)(void), /* ADDED */ void (*after_hook)(void), boolean writeback, boolean exp_trees, boolean use_fortran_form) { // [....] /* ADDED */ if (before_hook != NULL) (*before_hook)(); // [....] /* ADDED */ if (after_hook != NULL) (*after_hook)(); // [....] } /**********************************************************************/ void attach_annotation_string(suif_object *obj, char *the_annotation, char *string_data) { immed *i = new immed(string_data); immed_list_e *ile = new immed_list_e(*i); immed_list *il = new immed_list(); il->push(ile); obj->append_annote(the_annotation, (void *) il); } /**********************************************************************/ immed_list *pCStringSet2pIL(CStringSet *pSet) { Pix index; immed_list *il = new immed_list(); if (pSet == NULL) return il; index = pSet->first(); while (index != 0) { immed *i = new immed((*pSet)(index)); immed_list_e *ile = new immed_list_e(*i); il->push(ile); pSet->next(index); } return il; } CStringSet *pIL2pCStringSet(immed_list *il) { CStringSet *pSet = new CStringSet(); immed_list_iter *iter = new immed_list_iter(il); while (! iter->is_empty()) { immed i = iter->step(); if (i.is_string()) pSet->add(strdup(i.string())); } return pSet; } /**********************************************************************/ char *pCStringSet2pChar(CStringSet *pSet) { if (pSet == NULL) return NULL; /* Seems fitting, no? */ #define INITIAL_SIZE 1024 #define INCREMENT 1024 int length_used = 0; int buffer_size = INITIAL_SIZE; char *buffer = (char *) malloc(INITIAL_SIZE); assert(buffer != NULL); buffer[0] = 0; Pix index; index = pSet->first(); while (index != 0) { char *str = (*pSet)(index); int len = strlen(str); while ((length_used + (len+3)) >= buffer_size) /* The constant 3 is for the two single quotes and potential comma */ { buffer_size = buffer_size + INCREMENT; buffer = (char *) realloc(buffer, buffer_size+1); /* +1 for '\0' */ assert(buffer != NULL); } sprintf((char *)(buffer+length_used), "'%s'", str); length_used = length_used + (len+2); pSet->next(index); if (index != 0) { sprintf((char *)(buffer+length_used), ","); length_used++; } } buffer = (char *) realloc(buffer, length_used+1); /* +1 for '\0' */ assert(buffer != NULL); return buffer; } CStringSet *pChar2pCStringSet(char *input_str) { /* This function isn't meant to be able to handle the general case of converting strings to CStringSet's; it can handle the output format of pCStringSet2pChar, provided that none of the constituent strings contains single quotes and/or commas. */ CStringSet *pSet = new CStringSet(); char *str = strdup(input_str); char *ptr = strtok(str, "',"); while (ptr != NULL) { pSet->add(strdup(ptr)); ptr = strtok(NULL, "',"); } return pSet; } /**********************************************************************/ void register_qannotations(void) { #define WRITE_ANNOTATION TRUE ANNOTE(k_qif_statement, "QIF STATEMENT", WRITE_ANNOTATION); ANNOTE(k_qif_set_analyzed, "QIF SET ANALYZED", WRITE_ANNOTATION); ANNOTE(k_qif_set, "QIF SET", WRITE_ANNOTATION); ANNOTE(k_qif_variable, "QIF VARIABLE", WRITE_ANNOTATION); ANNOTE(k_qif_variable_defined, "QIF VARIABLE DEFINED", WRITE_ANNOTATION); ANNOTE(k_qint_parameter, "QINT PARAMETER", WRITE_ANNOTATION); ANNOTE(k_qinfluence_statement, "QINFLUENCE STATEMENT", WRITE_ANNOTATION); ANNOTE(k_qinfluence_set, "QINFLUENCE SET", WRITE_ANNOTATION); ANNOTE(k_qdecision_history, "QDECISION HISTORY", WRITE_ANNOTATION); ANNOTE(k_qdecision_current, "QDECISION CURRENT", WRITE_ANNOTATION); } /**********************************************************************/ SubsetsGenerator::SubsetsGenerator(CStringSet *set) { this->set = new CStringSet(); (*(this->set)) |= (*set); current = NULL; } boolean SubsetsGenerator::done() { if (current == NULL) return FALSE; return (((*set) == (*current)) ? TRUE : FALSE); } void SubsetsGenerator::increment_at_position(Pix index) { char *var = (*set)(index); assert(var != NULL); if (current->contains(var)) { set->seek(var); set->next(index); if (index == 0) return; /* Current is already at 11...11 */ current->del(var); increment_at_position(index); } else { current->add(var); } } CStringSet *shallow_copy_CStringSet(CStringSet *set) { CStringSet *new_set = new CStringSet(); Pix index = set->first(); while (index != 0) { new_set->add((*set)(index)); set->next(index); } return new_set; } CStringSet *SubsetsGenerator::yield() { if (current == NULL) { current = new CStringSet(); return shallow_copy_CStringSet(current); } if (done()) return NULL; Pix index = set->first(); increment_at_position(index); return shallow_copy_CStringSet(current); /* There would be rep exposure if I returned current itself.... */ } SubsetsGenerator::~SubsetsGenerator() { delete set; delete current; } // [....] /**********************************************************************/ /* Adapted from itoa(), K&R second edition, page 64 */ void lltoa(unsigned long long int n, char s[]) { int i = 0; do { s[i++] = (n % 10) + '0'; } while ((n /= 10) > 0); s[i] = '\0'; { int c,i,j; for (i = 0, j = strlen(s)-1; i<j; i++, j--) { c = s[i]; s[i] = s[j]; s[j] = c; } } } /**********************************************************************/