- writer.endblock();
- writer.outputline("else maybe=1;");
- }
- } else { /* offset in bits is an expression that must be generated */
- VarDescriptor ob = VarDescriptor.makeNew("offsetinbits");
- writer.output("// " + ob.getSafeSymbol() + " <-- ");
- offsetbits.prettyPrint(writer);
- writer.outputline("");
- offsetbits.generate(writer, ob);
- writer.output("// " + ob.getSafeSymbol() + " = ");
- offsetbits.prettyPrint(writer);
- writer.outputline("");
-
- /* derive offset in bytes */
- VarDescriptor offset = VarDescriptor.makeNew("offset");
- writer.outputline("int " + offset.getSafeSymbol() + " = " + ob.getSafeSymbol() + " >> 3;");
-
- if (fd.getType() instanceof ReservedTypeDescriptor && !fd.getPtr()) {
- VarDescriptor shift = VarDescriptor.makeNew("shift");
- writer.outputline("int " + shift.getSafeSymbol() + " = " + ob.getSafeSymbol() +
- " - (" + offset.getSafeSymbol() + " << 3);");
- int mask = bitmask(((IntegerLiteralExpr)fd.getType().getSizeExpr()).getValue());
-
- /* type var = ((*(int *) (base + offset)) >> shift) & mask */
- writer.outputline(getType().getGenerateType() + " " + dest.getSafeSymbol()+"=0;");
- writer.outputline("if ("+leftd.getSafeSymbol()+")");
- writer.outputline(dest.getSafeSymbol() +
- " = ((*(int *)" +
- "(" + leftd.getSafeSymbol() + " + " + offset.getSafeSymbol() + ")) " +
- " >> " + shift.getSafeSymbol() + ") & 0x" + Integer.toHexString(mask) + ";");
- writer.outputline("else maybe=1;");
- } else { /* a structure address or a ptr */
- String ptr = fd.getPtr() ? "*(int *)" : "";
- /* type var = [*(int *)] (base + offset) */
- writer.outputline("int " + dest.getSafeSymbol() +"=0;");
- writer.outputline("if ("+leftd.getSafeSymbol()+")");