Annotation of OpenXM/src/kan96xx/Kan/yylex_polymake.c, Revision 1.1
1.1 ! takayama 1: /* $OpenXM$ */
! 2: /* parser for polymake output */
! 3: /* This program requires
! 4:
! 5:
! 6: */
! 7:
! 8: #include <stdio.h>
! 9: #include "yylex_polymake.h"
! 10: #include "yy_polymake.tab.h"
! 11:
! 12: /* #define mymalloc(n) sGC_malloc(n) */
! 13: #define mymalloc(n) malloc(n)
! 14: /* pm = PolyMake */
! 15: #define PM_emptyLineCode 1
! 16:
! 17:
! 18: static char *S=NULL;
! 19: /* It is assumed that the newline code is only \n (preprocessed).
! 20: Empty line is marked with 0x1. More than one empty line does not appear. */
! 21: static int Pt=-1;
! 22: static int PMdebug = 0;
! 23:
! 24: /* char *PMlval; */
! 25:
! 26: static char *putstr(int c);
! 27:
! 28: int PMlex() {
! 29: int type;
! 30: type = PMlex_aux();
! 31:
! 32: if (PMdebug) {
! 33: printf("type=%d ",type);
! 34: if ((type == PM_number) || (type == PM_keyword)) {
! 35: printf("value="); pmPrintObject(stdout,PMlval);
! 36: }
! 37: printf("\n");
! 38: }
! 39:
! 40: return type;
! 41: }
! 42: int PMlex_aux() {
! 43: if (Pt < 0) {
! 44: return PM_noToken;
! 45: }
! 46: if (S[Pt] == 0) { Pt=-1; return PM_noToken; }
! 47: while ((S[Pt]<=' ') && (S[Pt]!='\n') && (S[Pt] != PM_emptyLineCode)) Pt++;
! 48: if (S[Pt] == '\n') { Pt++; return PM_newline; }
! 49: if (S[Pt] == PM_emptyLineCode) {Pt++; return PM_emptyLine; }
! 50: if (S[Pt] == '{') { Pt++; return PM_LCurryBrace; }
! 51: if (S[Pt] == '}') { Pt++; return PM_RCurryBrace; }
! 52: if (((S[Pt] >= '0') && (S[Pt] <= '9')) || (S[Pt] == '-')) {
! 53: putstr(-1); putstr(S[Pt++]);
! 54: while (((S[Pt]>='0') && (S[Pt]<='9')) || (S[Pt] == '/')) putstr(S[Pt++]);
! 55: PMlval = pmNewStrObject(putstr(0));
! 56: return PM_number;
! 57: }
! 58: if (((S[Pt] >= 'A') && (S[Pt] <= 'Z')) ||
! 59: ((S[Pt] >= 'a') && (S[Pt] <= 'z')) ||
! 60: (S[Pt] == '_')) {
! 61: putstr(-1); putstr(S[Pt++]);
! 62: while (((S[Pt] >= 'A') && (S[Pt] <= 'Z')) ||
! 63: ((S[Pt] >= 'a') && (S[Pt] <= 'z')) ||
! 64: (S[Pt] == '_')) putstr(S[Pt++]);
! 65: PMlval = pmNewStrObject(putstr(0));
! 66: return PM_keyword;
! 67: }
! 68: Pt++; return PM_unknown;
! 69: }
! 70:
! 71: #define PUTSTR_INIT 10
! 72: static char *putstr(int c) {
! 73: static char *s=NULL;
! 74: static int pt=0;
! 75: static int limit=0;
! 76: int i;
! 77: char *old;
! 78: if (c < 0) {
! 79: s = (char *)mymalloc(PUTSTR_INIT);
! 80: if (s == NULL) {fprintf(stderr,"No more memory.\n"); exit(10);}
! 81: limit = PUTSTR_INIT;
! 82: pt = 0; s[pt] = 0;
! 83: return s;
! 84: }
! 85: if (s == NULL) putstr(-1);
! 86: if (pt < limit-1) {
! 87: s[pt++]=c; s[pt]=0;
! 88: return s;
! 89: }else{
! 90: old = s;
! 91: limit = 2*limit;
! 92: s = (char *)mymalloc(limit);
! 93: if (s == NULL) {fprintf(stderr,"No more memory.\n"); exit(10);}
! 94: for (i=0; i<=pt; i++) {
! 95: s[i] = old[i];
! 96: }
! 97: return putstr(c);
! 98: }
! 99: }
! 100:
! 101: pmPreprocess() {
! 102: int newp,oldp;
! 103: int state;
! 104: int i,j;
! 105: if (S == NULL) return -1;
! 106: Pt = 0;
! 107: for (oldp = newp = 0; S[oldp] != 0; oldp++) {
! 108: if ((S[oldp] == 0xd) && (S[oldp] == 0xa)) { /* Windows 0d 0a */
! 109: S[newp++] = '\n'; oldp++;
! 110: }else{
! 111: S[newp++] = S[oldp];
! 112: }
! 113: }
! 114: S[newp] = '\0';
! 115:
! 116: for (oldp = newp = 0; S[oldp] != 0; oldp++) {
! 117: if (S[oldp] == 0xd) { /* Replace for mac 0xd to 0xa */
! 118: S[newp++] = '\n';
! 119: }else{
! 120: S[newp++] = S[oldp];
! 121: }
! 122: }
! 123: S[newp] = '\0';
! 124:
! 125: /* Remove #, empty lines, ... */
! 126: state = 1; newp=0;
! 127: for (oldp=0; S[oldp] != 0; oldp++) {
! 128: /* printf("oldp=%d, state=%d, char=%c\n",oldp,state,S[oldp]); */
! 129: switch(state) {
! 130: case 0:
! 131: if (S[oldp] == '\n') {state=1; newp=oldp+1;}
! 132: break;
! 133: case 1:
! 134: if ((S[oldp] == ' ') || (S[oldp] == '\t')) break;
! 135: if ((S[oldp] == '#') || ((S[oldp]=='_') && (S[oldp-1]<' '))) {
! 136: /* skip the rest of the line, state=1; */
! 137: for (; S[oldp] != 0 ; oldp++) {
! 138: if (S[oldp] == '\n') {oldp--; break;}
! 139: }
! 140: if (S[oldp] == 0) oldp--;
! 141: }else if (S[oldp] == '\n') {
! 142: /* replace the empty line by PM_emptyLine */
! 143: S[newp]= PM_emptyLineCode; j=oldp+1;
! 144: for (i=newp+1; S[j] != 0; i++) {
! 145: S[i] = S[j]; j++;
! 146: }
! 147: oldp=newp;
! 148: S[i] = 0;
! 149: }else{
! 150: state = 0;
! 151: }
! 152: break;
! 153: default:
! 154: break;
! 155: }
! 156: }
! 157: }
! 158:
! 159: pmObjectp pmNewStrObject(char *s) {
! 160: pmObjectp ob;
! 161: ob = (pmObjectp) mymalloc(sizeof(struct pmObject));
! 162: if (ob == NULL) {
! 163: fprintf(stderr,"No more memory.\n");
! 164: exit(10);
! 165: }
! 166: ob->tag = PMobject_str;
! 167: ob->body = s;
! 168: return ob;
! 169: }
! 170: pmObjectp pmNewListObject(pmObjectp a) {
! 171: pmObjectp ob;
! 172: struct pmList *aa;
! 173: ob = (pmObjectp) mymalloc(sizeof(struct pmObject));
! 174: if (ob == NULL) {
! 175: fprintf(stderr,"No more memory.\n");
! 176: exit(10);
! 177: }
! 178: aa= (struct pmList *)mymalloc(sizeof(struct pmList));
! 179: if (aa == NULL) {
! 180: fprintf(stderr,"No more memory.\n");
! 181: exit(10);
! 182: }
! 183: aa->left=a;
! 184: aa->right=NULL;
! 185: ob->tag = PMobject_list;
! 186: ob->body = aa;
! 187: return ob;
! 188: }
! 189: pmObjectp pmCons(pmObjectp a,struct pmList *b) {
! 190: pmObjectp ob;
! 191: struct pmList *t;
! 192: ob = pmNewListObject(a);
! 193: t = ob->body;
! 194: t->right = b;
! 195: return ob;
! 196: }
! 197: void pmPrintObject(FILE *fp,pmObjectp p) {
! 198: int n,i;
! 199: struct pmList *list;
! 200: struct pmList *t;
! 201: if (p == NULL) {
! 202: /* fprintf(stderr,"NULL "); */
! 203: return;
! 204: }
! 205: /* fprintf(stderr,"tag=%d ",p->tag); */
! 206: switch (p->tag) {
! 207: case PMobject_str:
! 208: fprintf(fp,"%s",(char *)(p->body));
! 209: break;
! 210: case PMobject_list:
! 211: list = (struct pmList *)(p->body);
! 212: if (list == NULL) break;
! 213: t = list; n = 0;
! 214: while (t != NULL) {
! 215: n++;
! 216: t = t->right;
! 217: }
! 218: t = list;
! 219: fprintf(fp,"[");
! 220: for (i=0; i<n; i++) {
! 221: pmPrintObject(fp,t->left);
! 222: if (i != n-1) fprintf(fp,",");
! 223: if (t == NULL) break; else t = t->right;
! 224: }
! 225: fprintf(fp,"]");
! 226: break;
! 227: default:
! 228: fprintf(stderr,"Unknown object tag %d.\n",p->tag);
! 229: /* sleep(100); to call debugger. */
! 230: break;
! 231: }
! 232: }
! 233:
! 234: main_t() {
! 235: int c,type;
! 236: putstr(-1);
! 237: while ((c=getchar()) != EOF) {
! 238: putstr(c);
! 239: }
! 240: S = putstr(0);
! 241: printf("%s\n",S);
! 242: pmPreprocess(S);
! 243: printf("--------------------------\n");
! 244: printf("%s\n",S);
! 245: printf("--------------------------\n");
! 246: while ((type=PMlex()) != PM_noToken) {
! 247: printf("type=%d ",type);
! 248: if ((type == PM_number) || (type == PM_keyword)) {
! 249: printf("value="); pmPrintObject(stdout,PMlval);
! 250: }
! 251: printf("\n");
! 252: }
! 253: }
! 254:
! 255: main() {
! 256: int c,type;
! 257:
! 258:
! 259: putstr(-1);
! 260: while ((c=getchar()) != EOF) {
! 261: putstr(c);
! 262: }
! 263: S = putstr(0);
! 264: printf("%s\n",S);
! 265: pmPreprocess(S);
! 266: printf("--------------------------\n");
! 267: printf("%s\n",S);
! 268: printf("--------------------------\n");
! 269: PMparse();
! 270: }
! 271:
! 272: PMerror() {
! 273: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>