import { registerLibraryHeader, SourceFile } from "../core/compilation/Program"; import { registerOpaqueExpression, OpaqueExpressionImpl, RuntimeOpaqueExpression } from "../core/constructs/expressions/OpaqueExpression"; import { Int, CompleteClassType, Bool, VoidType } from "../core/compilation/types"; import { getDataPtr } from "./string"; import { Value } from "../core/runtime/Value"; import { CPPObject } from "../core/runtime/objects"; import { RuntimeExpression } from "../core/constructs/expressions/RuntimeExpression"; import { StandardInputStream } from "../core/compilation/streams"; import { getLocal } from "../core/compilation/contexts"; registerLibraryHeader("iostream", new SourceFile("iostream.h", ` class ostream {}; ostream cout; const char endl = '\\n'; class istream { private: bool _failbit; istream() { @istream::istream_default; } public: bool good() { return @istream::good; } bool bad() { return @istream::bad; } bool fail() { return @istream::fail; } bool eof() { return @istream::eof; } int rdstate() { return @istream::rdstate; } void setstate(int state) { @istream::setstate; } void clear() { @istream::clear; } void clear(int state) { @istream::clear_int; } }; istream cin; `, true) ); function getStream(rt: RuntimeExpression) { return rt.contextualReceiver.getAuxiliaryData("stream"); } registerOpaqueExpression("istream::istream_default", { type: VoidType.VOID, valueCategory: "prvalue", operate: (rt: RuntimeOpaqueExpression) => { rt.contextualReceiver.setAuxiliaryData("stream", rt.sim.cin); } }); registerOpaqueExpression("istream::good", >{ type: Bool.BOOL, valueCategory: "prvalue", operate: (rt: RuntimeOpaqueExpression) => { return new Value(getStream(rt).good() ? 1 : 0, Bool.BOOL); } }); registerOpaqueExpression("istream::bad", >{ type: Bool.BOOL, valueCategory: "prvalue", operate: (rt: RuntimeOpaqueExpression) => { return new Value(getStream(rt).bad() ? 1 : 0, Bool.BOOL); } }); registerOpaqueExpression("istream::fail", >{ type: Bool.BOOL, valueCategory: "prvalue", operate: (rt: RuntimeOpaqueExpression) => { return new Value(getStream(rt).fail() ? 1 : 0, Bool.BOOL); } }); registerOpaqueExpression("istream::eof", >{ type: Bool.BOOL, valueCategory: "prvalue", operate: (rt: RuntimeOpaqueExpression) => { return new Value(getStream(rt).eof() ? 1 : 0, Bool.BOOL); } }); registerOpaqueExpression("istream::rdstate", > { type: Int.INT, valueCategory: "prvalue", operate: (rt: RuntimeOpaqueExpression) => { return new Value(getStream(rt).rdstate(), Int.INT); } }); registerOpaqueExpression("istream::setstate", > { type: VoidType.VOID, valueCategory: "prvalue", operate: (rt: RuntimeOpaqueExpression) => { getStream(rt).setstate(getLocal(rt, "state").rawValue()); } }); registerOpaqueExpression("istream::clear", > { type: VoidType.VOID, valueCategory: "prvalue", operate: (rt: RuntimeOpaqueExpression) => { getStream(rt).clear(); } }); registerOpaqueExpression("istream::clear_int", > { type: VoidType.VOID, valueCategory: "prvalue", operate: (rt: RuntimeOpaqueExpression) => { getStream(rt).clear(getLocal(rt, "state").rawValue()); } }); // registerOpaqueExpression("istream::good", > { // type: Bool.BOOL, // valueCategory: "prvalue", // operate: (rt: RuntimeOpaqueExpression) => { // return getSize(rt.contextualReceiver); // } // });