// // Copyright (c) 2006, Brian Frank and Andy Frank // Licensed under the Academic Free License version 3.0 // // History: // 19 Aug 06 Brian Frank Creation // ** ** FUtil provides fcode encoding and decoding utilities. ** class FUtil : FConst { ////////////////////////////////////////////////////////////////////////// // Buf ////////////////////////////////////////////////////////////////////////// static Void writeBuf(OutStream? out, Buf? buf) { if (buf == null) { out.writeI2(0) } else { out.writeI2(buf.size) out.writeBuf(buf.seek(0)) } } static Buf? readBuf(InStream in) { size := in.readU2 if (size == 0) return null return in.readBufFully(null, size) } ////////////////////////////////////////////////////////////////////////// // Attrs ////////////////////////////////////////////////////////////////////////// static Void writeAttrs(OutStream out, FAttr[]? fattrs) { if (fattrs == null) { out.writeI2(0) } else { out.writeI2(fattrs.size) fattrs.each |FAttr a| { a.write(out) } } } static FAttr[] readAttrs(InStream in) { size := in.readU2 if (size == 0) return FAttr#.emptyList fattrs := FAttr[,] fattrs.capacity = size size.times { fattrs.add(FAttr.make.read(in)) } return fattrs } ////////////////////////////////////////////////////////////////////////// // Doc ////////////////////////////////////////////////////////////////////////// ** ** Write a fandoc item to the specified output stream. The fandoc file ** format is an extremely simple plan text format with left justified ** type/slot qnames, followed by the fandoc content indented two spaces. ** static Void writeDoc(OutStream out, Str key, Str? doc) { if (doc == null) return out.print(key).print("\n").print(" ") doc.each |Int ch| { if (ch == '\r') throw ArgErr.make out.writeChar(ch) if (ch == '\n') out.print(" ") } out.print("\n\n") } }