int SCOTCH_stratSave ( const SCOTCH_Strat * const stratptr, FILE * const stream) { return (stratSave (*((Strat **) stratptr), stream)); }
int stratSave ( const Strat * const strat, FILE * const stream) { unsigned int paraflag; /* Flag set if method has parameters */ StratParamTab * paratab; /* Pointer to method parameter table */ byte * paraofft; /* Offset of parameter within method structure */ unsigned int i; int o; o = 0; switch (strat->type) { /* Recursively view sub-strategies */ case STRATNODECOND : if ((fprintf (stream, "(/(") == EOF) || (stratTestSave (strat->data.cond.test, stream) != 0) || (fprintf (stream, ")?(") == EOF) || (stratSave (strat->data.cond.strat[0], stream) != 0)) o = 1; if ((o == 0) && (strat->data.cond.strat[1] != NULL)) { if ((fprintf (stream, "):(") == EOF) || (stratSave (strat->data.cond.strat[1], stream) != 0)) o = 1; } if (o == 0) o = (fprintf (stream, ");)") == EOF); break; case STRATNODECONCAT : if ((stratSave (strat->data.concat.strat[0], stream) != 0) || (stratSave (strat->data.concat.strat[1], stream) != 0)) o = 1; break; case STRATNODESELECT : if ((fprintf (stream, "(") == EOF) || (stratSave (strat->data.select.strat[0], stream) != 0) || (fprintf (stream, "|") == EOF) || (stratSave (strat->data.select.strat[1], stream) != 0) || (fprintf (stream, ")") == EOF)) o = 1; case STRATNODEEMPTY : break; case STRATNODEMETHOD : if (fprintf (stream, "%s", strat->tabl->methtab[strat->data.method.meth].name) == EOF) { /* Print method name */ o = 1; break; } paraflag = 0; /* No method parameters seen yet */ paratab = strat->tabl->paratab; for (i = 0; paratab[i].name != NULL; i ++) { if (paratab[i].meth == strat->data.method.meth) { /* For all parameters of that method */ paraofft = (byte*) &strat->data.method.data + /* Compute parameter offset within method */ (paratab[i].dataofft - paratab[i].database); if (fprintf (stream, "%c%s=", /* Open or continue parameter list */ ((paraflag ++ == 0) ? '{' : ','), paratab[i].name) == EOF) { o = 1; break; } switch (paratab[i].type) { /* Print parameter value */ case STRATPARAMCASE : /* Case value */ o = (fprintf (stream, "%c", /* Print corresponding character */ ((char *) paratab[i].datasltr)[*((unsigned int *) paraofft)]) == EOF); break; case STRATPARAMINT : /* Integer value */ o = (fprintf (stream, INTSTRING, *((INT *) paraofft)) == EOF); break; case STRATPARAMDOUBLE : /* Double value */ o = (fprintf (stream, "%g", *((double *) paraofft)) == EOF); break; case STRATPARAMSTRAT : /* Strategy */ o = stratSave (*((Strat **) paraofft), stream); /* Perform recursion */ break; case STRATPARAMSTRING : /* String value */ o = (fprintf (stream, "%s", (char *) paraofft) == EOF); break; #ifdef SCOTCH_DEBUG_PARSER2 default : errorPrint ("stratSave: invalid parameter type"); return (1); #endif /* SCOTCH_DEBUG_PARSER2 */ } } if (o != 0) /* If an error has occured */ break; /* Abort the loop */ } if ((o == 0) && (paraflag != 0)) /* If there is a parameter list */ o |= (fprintf (stream, "}") == EOF); /* Close it */ break; #ifdef SCOTCH_DEBUG_PARSER2 default : errorPrint ("stratSave: invalid strategy node"); return (1); #endif /* SCOTCH_DEBUG_PARSER2 */ } if (o != 0) { errorPrint ("stratSave: bad output"); } return (o); }