Annotation of OpenXM/src/kan96xx/Kan/output.c, Revision 1.1
1.1 ! maekawa 1: #include <stdio.h>
! 2: #include "datatype.h"
! 3: #include "stackm.h"
! 4: #include "extern.h"
! 5: #include "extern2.h"
! 6:
! 7:
! 8: #define OUTPUT_QUEUE_SIZE 10
! 9:
! 10:
! 11: struct outputQueue {
! 12: int oqP;
! 13: int oqLimit;
! 14: char **outputQueue;
! 15: };
! 16: static void putstr(char *s,struct outputQueue *oq);
! 17:
! 18: static void putstr(s,oq)
! 19: char *s;
! 20: struct outputQueue *oq;
! 21: {
! 22: int i;
! 23: char **tmp;
! 24: int oqP,oqLimit;
! 25: char **outputQueue;
! 26: oqP = oq->oqP; oqLimit = oq->oqLimit; outputQueue = oq->outputQueue;
! 27:
! 28: if (oqP < 0) errorOutput("(putstr) Invalid value of OutputQueue Pointer.");
! 29: if (oqP <oqLimit) {
! 30: outputQueue[oqP++] = s;
! 31: }else{
! 32: oqLimit = 2*oqLimit;
! 33: #ifndef NOGC
! 34: outputQueue =
! 35: (char **)sGC_realloc((void *)outputQueue,oqLimit*sizeof(char **));
! 36: #else
! 37: tmp = (char **)sGC_malloc(oqLimit*sizeof(char **));
! 38: for (i=0; i<oqP; i++) {
! 39: tmp[i] = outputQueue[i];
! 40: }
! 41: outputQueue = tmp;
! 42: #endif
! 43: outputQueue[oqP++] = s;
! 44: }
! 45: oq->outputQueue = outputQueue;
! 46: oq->oqP = oqP;
! 47: oq->oqLimit = oqLimit;
! 48: }
! 49:
! 50: #define multStr(c) (c==' '?" ":(c=='\0'?"":"*"))
! 51:
! 52: char *POLYToString(f,multSym,brace)
! 53: POLY f;
! 54: int multSym;
! 55: int brace;
! 56: {
! 57: extern int Wrap;
! 58: int i,j,jj,fi;
! 59: int printed = 0;
! 60: int vi; /* index for variables */
! 61: char *contStr = " \\\n";
! 62: int length = 0;
! 63: int lengthLimit = Wrap; /* e.g. = 15 */
! 64: char *s;
! 65: int size,sp;
! 66: struct outputQueue oq;
! 67: struct ring *ringp;
! 68: char **xnames;
! 69: char **dnames;
! 70: int *xout; /* output order */
! 71: int n = 0;
! 72:
! 73: oq.oqP = 0;
! 74: oq.oqLimit = OUTPUT_QUEUE_SIZE;
! 75: oq.outputQueue = (char **)sGC_malloc(OUTPUT_QUEUE_SIZE*sizeof(char **));
! 76:
! 77:
! 78:
! 79: fi = 0;
! 80: if (brace) putstr("(",&oq);
! 81: if (f == POLYNULL) {
! 82: putstr("0",&oq);
! 83: printed = 1;
! 84: xnames = dnames = (char **)NULL;
! 85: }else{
! 86: ringp = f->m->ringp; xnames = f->m->ringp->x; dnames = f->m->ringp->D;
! 87: n = ringp->n;
! 88: xout = ringp->outputOrder;
! 89: }
! 90: while (f != POLYNULL) {
! 91: printed = 1;
! 92: /*print coefficient*/
! 93: if (fi == 0) {
! 94: if (isConstant(f)) {
! 95: putstr(coeffToString(f->coeffp),&oq);
! 96: }else if (isOne(f->coeffp)) {
! 97: /* do nothing */
! 98: }else if (isMinusOne(f->coeffp)) {
! 99: putstr("-",&oq);
! 100: }else{
! 101: putstr(coeffToString(f->coeffp),&oq);
! 102: putstr(multStr(multSym),&oq);
! 103: }
! 104: }else{
! 105: if (isConstant(f)) {
! 106: if (isNegative(f->coeffp)) {
! 107: putstr(coeffToString(f->coeffp),&oq);
! 108: }else{
! 109: putstr("+",&oq);
! 110: putstr(coeffToString(f->coeffp),&oq);
! 111: }
! 112: } else if (isOne(f->coeffp)) {
! 113: putstr("+",&oq);
! 114: }else if (isMinusOne(f->coeffp)) {
! 115: putstr("-",&oq);
! 116: }else{
! 117: if (!isNegative(f->coeffp)) putstr("+",&oq);
! 118: putstr(coeffToString(f->coeffp),&oq);
! 119: putstr(multStr(multSym),&oq);
! 120: }
! 121: }
! 122: /* output variables */
! 123: vi = 0;
! 124: for (jj=0; jj<n*2; jj++) {
! 125: j = xout[jj];
! 126: if (j <n) {
! 127: if (f->m->e[j].x) {
! 128: vi++;
! 129: if (vi != 1) putstr(multStr(multSym),&oq);
! 130: putstr(xnames[j],&oq);
! 131: if (f->m->e[j].x >= 2) {
! 132: putstr("^",&oq);
! 133: putstr(intToString(f->m->e[j].x),&oq);
! 134: }else if (f->m->e[j].x < 0) {
! 135: putstr("^(",&oq);
! 136: putstr(intToString(f->m->e[j].x),&oq);
! 137: putstr(")",&oq);
! 138: }
! 139: }
! 140: }else {
! 141: j = j-n;
! 142: if (f->m->e[j].D) {
! 143: vi++;
! 144: if (vi != 1) putstr(multStr(multSym),&oq);
! 145: putstr(dnames[j],&oq);
! 146: if (f->m->e[j].D >= 2) {
! 147: putstr("^",&oq);
! 148: putstr(intToString(f->m->e[j].D),&oq);
! 149: }else if (f->m->e[j].D < 0) {
! 150: putstr("^(",&oq);
! 151: putstr(intToString(f->m->e[j].D),&oq);
! 152: putstr(")",&oq);
! 153: }
! 154: }
! 155: }
! 156: }
! 157: fi++;
! 158: f = f->next;
! 159: length += n/3+1;
! 160: if (lengthLimit > 0 && length > lengthLimit) {
! 161: length = 0;
! 162: putstr(contStr,&oq);
! 163: }
! 164: }
! 165: if (!printed) putstr("0",&oq);
! 166:
! 167: if (brace) putstr(")",&oq);
! 168:
! 169: size = 0;
! 170: for (i=0; i<oq.oqP;i++) {
! 171: size += strlen(oq.outputQueue[i]);
! 172: }
! 173: s = (char *)sGC_malloc(sizeof(char *)*(size + 2));
! 174: if (s == (char *)NULL) errorOutput("No more memory.");
! 175: sp = 0;
! 176: for (i=0; i<oq.oqP; i++) {
! 177: strcpy(&(s[sp]),oq.outputQueue[i]);
! 178: sp += strlen(oq.outputQueue[i]);
! 179: }
! 180:
! 181: return(s);
! 182: }
! 183:
! 184: char *KPOLYToString(f)
! 185: POLY f;
! 186: {
! 187: extern int OutputStyle;
! 188: return(POLYToString(f,OutputStyle,0));
! 189: }
! 190:
! 191: isOne(c)
! 192: struct coeff *c;
! 193: {
! 194: switch(c->tag) {
! 195: case INTEGER:
! 196: if (c->val.i == 1) return(1); else return(0);
! 197: break;
! 198: case POLY_COEFF:
! 199: return(0);
! 200: break;
! 201: case MP_INTEGER:
! 202: if (mpz_cmp_si(c->val.bigp,(long) 1) == 0) return(1);
! 203: else return(0);
! 204: break;
! 205: default:
! 206: errorCoeff("not yet");
! 207: }
! 208: }
! 209: isMinusOne(c)
! 210: struct coeff *c;
! 211: {
! 212: switch(c->tag) {
! 213: case INTEGER:
! 214: if (c->val.i == -1) return(1); else return(0);
! 215: break;
! 216: case POLY_COEFF:
! 217: return(0);
! 218: break;
! 219: case MP_INTEGER:
! 220: if (mpz_cmp_si(c->val.bigp,(long) -1) == 0) return(1);
! 221: return(0);
! 222: default:
! 223: errorCoeff("not yet");
! 224: }
! 225:
! 226: }
! 227: isNegative(c)
! 228: struct coeff *c;
! 229: {
! 230: switch(c->tag) {
! 231: case INTEGER:
! 232: if (c->val.i < 0) return(1); else return(0);
! 233: break;
! 234: case POLY_COEFF:
! 235: return(0);
! 236: break;
! 237: case MP_INTEGER:
! 238: if (mpz_cmp_si(c->val.bigp,(long) 1) < 0) return(1);
! 239: else return(0);
! 240: break;
! 241: default:
! 242: errorCoeff("not yet");
! 243: }
! 244: }
! 245:
! 246: isConstant(f)
! 247: POLY f;
! 248: {
! 249: int i;
! 250: int n;
! 251: if (f == POLYNULL) return(1);
! 252: n = f->m->ringp->n;
! 253: for (i=0; i<n; i++) {
! 254: if (f->m->e[i].x || f->m->e[i].D) return(0);
! 255: }
! 256: return(1);
! 257: }
! 258:
! 259: void errorOutput(s)
! 260: char *s;
! 261: {
! 262: fprintf(stderr,"Error(output.c):%s\n",s);
! 263: exit(15);
! 264: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>