using GLib; namespace Email { class EmailInputStream : Object { private InputStream parent; public EmailInputStream(InputStream parent) { this.parent = parent; } public bool eof { get; private set; default = false; } private uint8[] push_back = {}; private bool push_back_eof = false; public bool read_char(out uint8 c){ if (push_back.length > 0) { c = push_back[push_back.length - 1]; push_back.length--; if(push_back.length == 0) { eof = push_back_eof; } } else { if (parent.read (&c, 1, null) == 0){ eof = true; return false; } } return true; } public void unread_char(uint8 c){ if (push_back.length == 0){ push_back_eof = eof; eof = false; } push_back += c; } public void push_back_buffer (uint8[] buffer) { if (buffer.length > 0 && push_back.length == 0){ push_back_eof = eof; eof = false; } for(int i = buffer.length - 1; i >= 0; --i){ push_back += buffer[i]; } } public bool read_line(ref uint8[] buffer){ uint8 c; uint8 CR = 0x0D; uint8 LF = 0x0A; bool crlf = false; buffer.resize(0); while (read_char(out c)) { // // CRLF management: // // ?? LF -> append, break // ?? CR -> append, wait for the LF // CR LF -> append, break // CR ?? -> push back, break // ?? ?? -> append, continue // if (c == LF) { buffer += c; break; } if (crlf) { unread_char(c); break; } if (c == CR) { crlf = true; } buffer += c; } return !eof; } } } static void main(string[] args) { stdout.puts("Hello\n"); }