void gen_charattr(Symbol* asym, Bytebuffer* databuf) { Datasrc* src; Constant* con; if(asym->data == NULL) return; src = datalist2src(asym->data); while((con=srcnext(src))) { switch (con->nctype) { /* Following list should be consistent with isstringable */ case NC_CHAR: bbAppend(databuf,con->value.charv); break; case NC_BYTE: bbAppend(databuf,con->value.int8v); break; case NC_UBYTE: bbAppend(databuf,con->value.uint8v); break; case NC_STRING: bbCat(databuf,con->value.stringv.stringv); bbNull(databuf); break; case NC_FILL: bbAppend(databuf,NC_FILL_CHAR); break; default: semerror(srcline(src), "Encountered non-string constant in attribute: %s", asym->name); return; } } }
static size_t gen_charconstant(NCConstant* con, Bytebuffer* databuf, int fillchar) { /* Following cases should be consistent with isstringable */ size_t constsize = 1; switch (con->nctype) { case NC_CHAR: bbAppend(databuf,con->value.charv); break; case NC_BYTE: bbAppend(databuf,con->value.int8v); break; case NC_UBYTE: bbAppend(databuf,con->value.uint8v); break; case NC_STRING: constsize = con->value.stringv.len; bbAppendn(databuf,con->value.stringv.stringv, con->value.stringv.len); bbNull(databuf); break; case NC_FILL: bbAppend(databuf,fillchar); break; default: PANIC("unexpected constant type"); } return constsize; }
int bbCatbuf(Bytebuffer* bb, const Bytebuffer* s) { if(bbLength(s) > 0) bbAppendn(bb,bbContents(s),bbLength(s)); bbNull(bb); return 1; }
void codeflush(void) { if(bbLength(codebuffer) > 0) { bbNull(codebuffer); fputs(bbContents(codebuffer),stdout); fflush(stdout); bbClear(codebuffer); } }
static int bin_charconstant(Generator* generator, Symbol* sym, Bytebuffer* buf, ...) { /* Just transfer charbuf to codebuf */ Bytebuffer* charbuf; va_list ap; va_start(ap,buf); charbuf = va_arg(ap, Bytebuffer*); va_end(ap); bbNull(charbuf); bbCatbuf(buf,charbuf); return 1; }
void commify(Bytebuffer* buf) { char* list,*p; if(bbLength(buf) == 0) return; list = bbDup(buf); p = list; bbClear(buf); commifyr(p,buf); bbNull(buf); efree(list); }
static int j_charconstant(Generator* generator, Symbol* sym, Bytebuffer* codebuf, ...) { /* Escapes and quoting will be handled in genc_write */ /* Just transfer charbuf to codebuf */ Bytebuffer* charbuf; va_list ap; va_start(ap,codebuf); charbuf = va_arg(ap, Bytebuffer*); va_end(ap); bbNull(charbuf); bbCatbuf(codebuf,charbuf); return 1; }
void expand_escapes( Bytebuffer *s, /* fill with contents of yytext, with escapes expanded */ char *yytext, int yyleng) { char *t, *endp; yytext[yyleng-1]='\0'; /* don't copy quotes */ /* expand "\" escapes, e.g. "\t" to tab character */ t = yytext+1; while(*t) { if (*t == '\\') { t++; switch (*t) { case 'a': bbAppend(s,'\007'); t++; /* will use '\a' when STDC */ break; case 'b': bbAppend(s,'\b'); t++; break; case 'f': bbAppend(s,'\f'); t++; break; case 'n': bbAppend(s,'\n'); t++; break; case 'r': bbAppend(s,'\r'); t++; break; case 't': bbAppend(s,'\t'); t++; break; case 'v': bbAppend(s,'\v'); t++; break; case '\\': bbAppend(s,'\\'); t++; break; case '?': bbAppend(s,'\177'); t++; break; case '\'': bbAppend(s,'\''); t++; break; case '\"': bbAppend(s,'\"'); t++; break; case 'x': t++; /* now t points to one or more hex digits */ bbAppend(s,(char) strtol(t, &endp, 16)); t = endp; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': /* t now points to octal digits */ bbAppend(s,(char) strtol(t, &endp, 8)); t = endp; break; default: bbAppend(s,*t); t++; break; } } else { bbAppend(s,*t); t++; } } bbNull(s); bbSetlength(s,strlen(bbContents(s))); return; }
static void genj_writeattr(Generator* generator, Symbol* asym, Bytebuffer* code, int rank, size_t* start, size_t* count) { Symbol* basetype = asym->typ.basetype; nc_type typecode = basetype->typ.typecode; /* default assumption */ size_t len = asym->data == NULL?0:asym->data->length; codeprintf("%s/* attribute: %s */\n",indented(1),asym->name); /* Handle NC_CHAR specially */ if(typecode == NC_CHAR) { /* revise the length count */ len = bbLength(code); if(len == 0) { bbAppend(code,'\0'); len++; bbClear(code); bbCat(code,"\"\""); len++; } else jquotestring(code,'"'); bbNull(code); } else { /* not NC_CHAR*/ char* code2; commify(code); /* Convert to constant */ code2 = bbDup(code); bbClear(code); bbprintf0(stmt,"new %s[]", jarraytype(typecode)); bbCatbuf(code,stmt); bbCat(code,"{"); bbCat(code,code2); bbCat(code,"}"); efree(code2); } switch (typecode) { case NC_BYTE: case NC_SHORT: case NC_INT: case NC_FLOAT: case NC_DOUBLE: codelined(1,"{"); bbprintf0(stmt,"%sArray data = Array.factory(%s.class, new int[]{%lu}, ", indented(1), jtype(basetype->typ.typecode), len); codedump(stmt); codedump(code); codeline(");"); if(asym->att.var == NULL) { bbprintf0(stmt,"%sncfile.addGlobalAttribute(\"%s\",data);\n", indented(1),jescapifyname(asym->name)); } else { bbprintf0(stmt,"%sncfile.addVariableAttribute(\"%s\",\"%s\",data);\n", indented(1), jescapifyname(asym->att.var->name), jescapifyname(asym->name)); } codedump(stmt); codelined(1,"}"); codeflush(); break; case NC_CHAR: if(asym->att.var == NULL) { bbprintf0(stmt,"%sncfile.addGlobalAttribute(\"%s\",%s);\n", indented(1), jescapifyname(asym->name), bbContents(code)); } else { bbprintf0(stmt,"%sncfile.addVariableAttribute(\"%s\",\"%s\",%s);\n", indented(1), jescapifyname(asym->att.var->name), jescapifyname(asym->name), bbContents(code)); } codedump(stmt); codeflush(); break; default: break; } codeflush(); }