public static ZilObject M_HPOS([NotNull] Context ctx, [NotNull] ZilChannel channel) { if (!(channel is IChannelWithHPos hposChannel)) { throw new InterpreterError(InterpreterMessages._0_Not_Supported_By_This_Type_Of_Channel, "M-HPOS"); } return(new ZilFix(hposChannel.HPos)); }
public static ZilObject PRINT_MANY([NotNull] Context ctx, ZilChannel channel, [Decl("<OR ATOM APPLICABLE>")] ZilObject printer, [NotNull] ZilObject[] items) { if (printer is ZilAtom atom) { printer = ctx.GetGlobalVal(atom) ?? ctx.GetLocalVal(atom); if (printer == null) { throw new InterpreterError( InterpreterMessages._0_Atom_1_Has_No_2_Value, "PRINT-MANY", atom.ToStringContext(ctx, false), "local or global"); } } var applicablePrinter = printer.AsApplicable(ctx); if (applicablePrinter == null) { throw new InterpreterError(InterpreterMessages._0_Not_Applicable_1, "PRINT-MANY", printer.ToStringContext(ctx, false)); } var crlf = ctx.GetStdAtom(StdAtom.PRMANY_CRLF); var result = ctx.TRUE; using (var innerEnv = ctx.PushEnvironment()) { innerEnv.Rebind(ctx.GetStdAtom(StdAtom.OUTCHAN), channel); var printArgs = new ZilObject[1]; foreach (var item in items) { result = item; if (result == crlf) { CRLF(ctx); } else { printArgs[0] = result; applicablePrinter.ApplyNoEval(ctx, printArgs); } } } return(result); }
public static ZilObject IMAGE([NotNull] Context ctx, [NotNull] ZilFix ch, ZilChannel channel = null) { if (channel == null) { channel = ctx.GetLocalVal(ctx.GetStdAtom(StdAtom.OUTCHAN)) as ZilChannel ?? ctx.GetGlobalVal(ctx.GetStdAtom(StdAtom.OUTCHAN)) as ZilChannel; if (channel == null) { throw new InterpreterError(InterpreterMessages._0_Bad_OUTCHAN, "IMAGE"); } } // TODO: check for I/O error channel.WriteChar((char)ch.Value); return(ch); }
public static ZilObject CRLF([NotNull] Context ctx, ZilChannel channel = null) { if (channel == null) { channel = ctx.GetLocalVal(ctx.GetStdAtom(StdAtom.OUTCHAN)) as ZilChannel ?? ctx.GetGlobalVal(ctx.GetStdAtom(StdAtom.OUTCHAN)) as ZilChannel; if (channel == null) { throw new InterpreterError(InterpreterMessages._0_Bad_OUTCHAN, "CRLF"); } } // TODO: check for I/O error channel.WriteNewline(); return(ctx.TRUE); }
public static ZilObject PRINC([NotNull] Context ctx, [NotNull] ZilObject value, ZilChannel channel = null) { if (channel == null) { channel = ctx.GetLocalVal(ctx.GetStdAtom(StdAtom.OUTCHAN)) as ZilChannel ?? ctx.GetGlobalVal(ctx.GetStdAtom(StdAtom.OUTCHAN)) as ZilChannel; if (channel == null) { throw new InterpreterError(InterpreterMessages._0_Bad_OUTCHAN, "PRINC"); } } var str = value.ToStringContext(ctx, true); // TODO: check for I/O error channel.WriteString(str); return(value); }
public static ZilObject INDENT_TO([NotNull] Context ctx, [NotNull] ZilFix position, ZilChannel channel = null) { if (position.Value < 0) { throw new InterpreterError( InterpreterMessages._0_Expected_1, "INDENT-TO: arg 1", "a non-negative FIX"); } if (channel == null) { channel = ctx.GetLocalVal(ctx.GetStdAtom(StdAtom.OUTCHAN)) as ZilChannel ?? ctx.GetGlobalVal(ctx.GetStdAtom(StdAtom.OUTCHAN)) as ZilChannel; if (channel == null) { throw new InterpreterError(InterpreterMessages._0_Bad_OUTCHAN, "INDENT-TO"); } } if (!(channel is IChannelWithHPos hposChannel)) { throw new InterpreterError(InterpreterMessages._0_Not_Supported_By_This_Type_Of_Channel, "INDENT-TO"); } var cur = hposChannel.HPos; while (cur < position.Value) { channel.WriteChar(' '); var next = hposChannel.HPos; if (next <= cur) { // didn't move, or wrapped around break; } cur = next; } return(position); }
public static ZilObject READSTRING([NotNull] Context ctx, [NotNull] ZilString dest, ZilChannel channel, [CanBeNull][Decl("<OR FIX STRING>")] ZilObject maxLengthOrStopChars = null) { // TODO: support 1- and 4-argument forms? int maxLength = dest.Text.Length; ZilString stopChars = null; if (maxLengthOrStopChars != null) { var maxLengthFix = maxLengthOrStopChars as ZilFix; stopChars = maxLengthOrStopChars as ZilString; if (maxLengthFix != null) { maxLength = Math.Min(maxLengthFix.Value, maxLength); } } var buffer = new StringBuilder(maxLength); bool reading; do { reading = false; if (buffer.Length < maxLength) { var c = channel.ReadChar(); if (c != null && (stopChars == null || stopChars.Text.IndexOf(c.Value) < 0)) { buffer.Append(c.Value); reading = true; } } } while (reading); var readCount = buffer.Length; buffer.Append(dest.Text.Substring(readCount)); dest.Text = buffer.ToString(); return(new ZilFix(readCount)); }
public static ZilObject FILE_LENGTH([NotNull] Context ctx, [NotNull] ZilChannel channel) { var length = channel.GetFileLength(); return(length == null ? ctx.FALSE : new ZilFix((int)length.Value)); }
public static ZilObject CLOSE([NotNull] Context ctx, [NotNull] ZilChannel channel) { channel.Close(); return(channel); }