I am looking for a D version of scanf() but I'm sure there is no such thing so I tried contrived one. I am sure I missed a slew of obvious things and that this cannot be used for much more than a little toy on my personal computer. I would like to make it usable for others so I am asking for some guidance/suggestions for making it better.

Thanks,
Andrew

This is written in D2 v2.029 with an updated std.random to fix a problem I was having with the current release.

module ace.io;

private import std.conv: to, ConvError;
private import std.string: split, stripr;

public import std.stdio;

int read(/+File inFile = stdin,+/ A...)(out A a) /+Uncommenting results
    in: Error: arithmetic/string type expected for value-parameter, not
    File+/
{  start:
   auto data = stripr(readln());
   auto input = split(data);

   string assign()
   {
       return
       `  try {
                        if(a.length != input.length)
                                                return -1;
                        a[i] = to!(typeof(t))(input[i]);
              } catch (ConvError e) {
                  writeln("Invalid input!");
                  goto start;
              }`;
   }

   foreach(i, t; a)
   {
     static if(is(typeof(t) == void))
       {}
     else static if(is(typeof(t) == bool))
       {}
     else static if(is(typeof(t) == byte))
       mixin(assign);
     else static if(is(typeof(t) == ubyte))
       mixin(assign);
     else static if(is(typeof(t) == short))
       mixin(assign);
     else static if(is(typeof(t) == ushort))
       mixin(assign);
     else static if(is(typeof(t) == int))
       mixin(assign);
     else static if(is(typeof(t) == uint))
       mixin(assign);
     else static if(is(typeof(t) == long))
       mixin(assign);
     else static if(is(typeof(t) == ulong))
       mixin(assign);
     /+static if(is(typeof(t) == cent))
       mixin(assign);
     static if(is(typeof(t) == ucent))
       mixin(assign);+/
     else static if(is(typeof(t) == float))
       mixin(assign);
     else static if(is(typeof(t) == double))
       mixin(assign);
     else static if(is(typeof(t) == real))
       mixin(assign);
     else static if(is(typeof(t) == ifloat))
       a[i] = ifloat.max;
     else static if(is(typeof(t) == idouble))
       a[i] = idouble.max;
     else static if(is(typeof(t) == ireal))
       a[i] = ireal.max;
     else static if(is(typeof(t) == cfloat))
       a[i] = cfloat.max;
     else static if(is(typeof(t) == cdouble))
       a[i] = cdouble.max;
     else static if(is(typeof(t) == creal))
       a[i] = creal.max;
     else static if(is(typeof(t) == char))
       a[i] = input[i][0];
     else static if(is(typeof(t) == wchar))
       mixin(assign);
     else static if(is(typeof(t) == dchar))
       a[i] = input[i][0];
     else static if(is(typeof(t) == string))
       if(a.length > 1)
         a[i] = input[i];
       else
         a[i] = data;
     else static if(is(typeof(t) == dstring))
       {}
     else static if(is(typeof(t) == char[]))
       a[i] = stripr(data).dup;
   }
   return 0;
}

Reply via email to