Compute in one pass 3 tokens position

bioinfornatics bioinfornatics at fedoraproject.org
Thu May 3 08:25:30 PDT 2012


Le lundi 30 avril 2012 à 14:52 +0200, bioinfornatics a écrit :
> Hi,
> I would like to know how compute in on pass 3 tokens position in a
> sequence.
> curently i do:
> File f = File( "reader.d", "r" );
> scope(exit) f.close();
> char[1024] buffer;
> char[] content = f.rawRead(buffer);
> char[sizediff_t] token = ['(', '{', ';'];
> auto position = map!( a => content.countUntil( a ) )( [ ['('], ['{'],
> [';'] ] );
> 
> 
> if i use reduce instead map the build fail
> 

----------------- CODE -----------------------
 import std.stdio;
 import std.conv;
 import std.c.process;

sizediff_t[string] counter( in char[] sequence, string[] token...)
in{
  assert(sequence !is null, "Error given sequence is null");
}
body{
  bool   isComputing = true;
  size_t index       = 0;
  size_t flag        = 0;
  sizediff_t[string] result;

  foreach( tok; token)
    result[tok] = -1;

  while(isComputing){
    if( index >= sequence.length )
      isComputing = false;
    else if( flag == token.length )
      isComputing = false;
    else{
      foreach( tok; token){
        if( sequence.length - index >= tok.length ){
          string currentToken = to!string(sequence[index .. index +
tok.length]);
          if( currentToken in result && result[currentToken] == -1 ){
            result[currentToken] = index;
            flag++;
          }
        }
      }
      index++;
    }
  }
  return result;
}


void main( string[] args ){
  if( args.length == 1 ){
    writefln( "Usage %s <token1> <token2> <token3> <token4>...", args[0]
);
    exit(0);
  }
  writeln( counter( "This a cool statement such as D is fun. Use it and
ot the D power. Oh yeah! Are you ready? Try it!! Have fun.", args[1..$])
);

}
---------------------------------- END CODE -----------------------


$ ./test This D !
["D":30, "!":74, "This":0] import std.string;

if all token is found befoore reach end sequence it stop and save us
from some loop
it works too if token do not has same length as shown in example



More information about the Digitalmars-d-learn mailing list