1 module fcgi.stdio; 2 3 public import fcgi.app; 4 import std.format; 5 import std.traits; 6 import std.format : formattedWrite; 7 8 9 void writeln(S...)(S args) 10 { 11 write(args, '\n'); 12 } 13 14 void writefln(S...)(in char[] fmt, S args) 15 { 16 writef(fmt, args); 17 request.stdout.put('\n'); 18 } 19 20 void putc(char c) 21 { 22 request.stdout.put(c); 23 } 24 25 void writef(S...)(in char[] fmt, S args) 26 { 27 formattedWrite(&request.stdout, fmt, args); 28 } 29 30 void write(S...)(S args) 31 { 32 import std.traits : isBoolean, isIntegral, isAggregateType, isSomeString, isSomeChar; 33 foreach (arg; args) 34 { 35 alias A = typeof(arg); 36 static if (isAggregateType!A || is(A == enum)) 37 { 38 formattedWrite(&request.stdout, "%s", arg); 39 } 40 else static if (isSomeString!A) 41 { 42 request.stdout.writeBlock(arg.ptr, arg.length * typeof(arg[0]).sizeof); 43 } 44 else static if (isIntegral!A) 45 { 46 import std.conv: toTextRange; 47 toTextRange(arg, &request.stdout); 48 } 49 else static if (isBoolean!A) 50 { 51 arg ? 52 request.stdout.writeBlock("true".ptr, 4): 53 request.stdout.writeBlock("false".ptr, 5); 54 } 55 else static if (is(A == char)) 56 { 57 request.stdout.put(arg); 58 } 59 else 60 { 61 std.format.formattedWrite(&request.stdout, "%s", arg); 62 } 63 } 64 } 65 66 void flush() 67 { 68 request.stdout.flush(); 69 } 70 71 size_t read(T)(T buf) 72 { 73 return request.stdout.read(cast(ubyte*)buf.ptr, buf.length); 74 } 75 76 77 alias ThreadProc = void function(size_t n); 78 79 public import std.concurrency; 80 81 82