dopp.d 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. //import toml;
  2. public{
  3. import std.stdio : writeln;
  4. import std.file : read;
  5. import std.array;
  6. import std.string;
  7. import std.uni : isWhite, isAlpha, isAlphaNum;
  8. import std.ascii : isDigit;
  9. import std.conv : to;
  10. import std.algorithm;
  11. }
  12. //import dopp_lexer : tokenize, isKeyword;
  13. //import dopp_parser : parse;
  14. //TOMLDocument toml_s;
  15. export enum TokenType{
  16. Identifier,
  17. Keyword,
  18. Integer,
  19. Float,
  20. String,
  21. Symbol,
  22. Whitespace
  23. }
  24. export struct Token{
  25. TokenType type;
  26. string lexeme;
  27. // for debug
  28. string toString(){
  29. import std.format : format;
  30. //return "Token(type: %d, lexeme: %s)".format(type, lexeme);
  31. return "Token = type: %d, lexeme: %s\n".format(type, lexeme);
  32. }
  33. }
  34. // ./dopp -d "/test" -o "/test2" == input dir path + output dir path (default output dir = input dir)
  35. // ./dopp -f test.de -o test.d == input file name + output file name (default output file name = input file name [but .d instead .de] )
  36. // ./dopp -f "/test/test.de" -o "/result/test.d" == input file path + output file path (default output file name and path = input file name and path [but .d instead .de] )
  37. bool is_valid_argv(ref string[] argv){
  38. //ulong num = argv[1 .. $].length; // uint64
  39. ulong num = argv.length; // uint64
  40. if(num != 1 && num != 2 && num != 4){
  41. return false;
  42. }else if(num == 1){ // one argument only (just filename or /path/filename) == shortened ./dopp -f test.de = ./dopp test.de
  43. if(argv[0].length >= 4 && argv[0][$-3 .. $] == ".de"){
  44. return true;
  45. }else{
  46. return false;
  47. }
  48. }else if(num == 2){ // two arguments = input file name/path or input dir path
  49. if(argv[0] != "-d" && argv[0] != "-f"){
  50. return false;
  51. }else if(argv[0] == "-f"){ // must be file
  52. if(argv[1].length >= 4 && argv[1][$-3 .. $] == ".de"){
  53. return true;
  54. }else{
  55. return false;
  56. }
  57. }else{ // dir
  58. if(argv[1].length > 0){
  59. return true;
  60. }else{
  61. return false;
  62. }
  63. }
  64. }else{ // num == 4
  65. string[] argv2 = argv[0 .. 2];
  66. if( is_valid_argv(argv2) ){ // valid first 2
  67. string[] argv4 = argv[2 .. $];
  68. if( argv[2] != "-o" ){ // valid next - last 2
  69. return false;
  70. }else if(argv[0] == "-f"){ // must be file
  71. if(argv[3].length >= 3 && argv[3][$-2 .. $] == ".d"){
  72. return true;
  73. }else{
  74. return false;
  75. }
  76. }else{ // dir
  77. if(argv[3].length > 0){
  78. return true;
  79. }else{
  80. return false;
  81. }
  82. }
  83. }else{
  84. return false;
  85. }
  86. }
  87. }
  88. //void main(string[] argv){
  89. int main(string[] argv){
  90. /*
  91. toml_s = parseTOML(cast(string)read("dopp.toml"));
  92. writeln("indent_matter: ", toml_s["indent_matter"]); // 4
  93. writeln("xyz: ", toml_s["xyz"]); // Address boundary error
  94. */
  95. /*
  96. int i = 0;
  97. foreach(string s; argv[1 .. $]){
  98. writeln(s);
  99. i++;
  100. }
  101. writeln("i = ", i);
  102. */
  103. string[] argv1 = argv[1 .. $]; // argv[0] always = program name ( ./dopp in my case in linux )
  104. bool valid1 = is_valid_argv(argv1);
  105. writeln("valid1 = ", valid1);
  106. if(!valid1){
  107. return 0;
  108. }
  109. //string source = `if (x > 0) { writeln("Positive"); }`;
  110. //auto tokens = tokenize(source);
  111. //writeln(tokens);
  112. //parse(tokens);
  113. return 1;
  114. }
  115. unittest{
  116. assert( is_valid_argv([]) == false );
  117. assert( is_valid_argv([""]) == false );
  118. assert( is_valid_argv(["-d"]) == false );
  119. assert( is_valid_argv(["-d", ""]) == false );
  120. assert( is_valid_argv(["-d", "/test"]) == true );
  121. assert( is_valid_argv(["-d", "/test", "-o", "/test2"]) == true );
  122. assert( is_valid_argv(["test.de"]) == true );
  123. assert( is_valid_argv(["-f", "test.de"]) == true );
  124. assert( is_valid_argv(["-f", "test.de", "-o", "test.d"]) == true );
  125. assert( is_valid_argv(["test.txt"]) == false );
  126. assert( is_valid_argv(["-f", "test.txt"]) == false );
  127. assert( is_valid_argv(["-f", "test.txt", "-o", "test.d"]) == false );
  128. assert( is_valid_argv(["-f", "test.de", "-o", "test.txt"]) == false );
  129. }
  130. // ./dopp -d "/test" -o "/test2" == input dir path + output dir path (default output dir = input dir)
  131. // ./dopp -f test.de -o test.d == input file name + output file name (default output file name = input file name [but .d instead .de] )
  132. // ./dopp -f "/test/test.de" -o "/result/test.d" == input file path + output file path (default output file name and path = input file name and path [but .d instead .de] )