dopp.d 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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 -t == shortened for test (onto single .de -> .d module)
  35. // ./dopp -d "/test" -o "/test2" == input dir path + output dir path (default output dir = input dir)
  36. // ./dopp -f test.de -o test.d == input file name + output file name (default output file name = input file name [but .d instead .de] )
  37. // ./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] )
  38. bool is_valid_argv(ref string[] argv){
  39. //ulong num = argv[1 .. $].length; // uint64
  40. ulong num = argv.length; // uint64
  41. if(num != 1 && num != 2 && num != 4){
  42. return false;
  43. }else if(num == 1){ // one argument only (just filename or /path/filename) == shortened ./dopp -f test.de = ./dopp test.de; or -t == shortened for test (onto single .de -> .d module)
  44. if( (argv[0] == "-t") || (argv[0].length >= 4 && argv[0][$-3 .. $] == ".de") ){
  45. return true;
  46. }else{
  47. return false;
  48. }
  49. }else if(num == 2){ // two arguments = input file name/path or input dir path
  50. if(argv[0] != "-d" && argv[0] != "-f"){
  51. return false;
  52. }else if(argv[0] == "-f"){ // must be file
  53. if(argv[1].length >= 4 && argv[1][$-3 .. $] == ".de"){
  54. return true;
  55. }else{
  56. return false;
  57. }
  58. }else{ // dir
  59. if(argv[1].length > 0){
  60. return true;
  61. }else{
  62. return false;
  63. }
  64. }
  65. }else{ // num == 4
  66. string[] argv2 = argv[0 .. 2];
  67. if( is_valid_argv(argv2) ){ // valid first 2
  68. string[] argv4 = argv[2 .. $];
  69. if( argv[2] != "-o" ){ // valid next - last 2
  70. return false;
  71. }else if(argv[0] == "-f"){ // must be file
  72. if(argv[3].length >= 3 && argv[3][$-2 .. $] == ".d"){
  73. return true;
  74. }else{
  75. return false;
  76. }
  77. }else{ // dir
  78. if(argv[3].length > 0){
  79. return true;
  80. }else{
  81. return false;
  82. }
  83. }
  84. }else{
  85. return false;
  86. }
  87. }
  88. }
  89. //void main(string[] argv){
  90. int main(string[] argv){
  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 || Segmentation fault (core dumped)
  94. writeln("indent_matter in: ", "indent_matter" in toml_s);
  95. writeln("xyz in: ", "xyz" in toml_s);
  96. // todo function - config and default values
  97. /*
  98. int i = 0;
  99. foreach(string s; argv[1 .. $]){
  100. writeln(s);
  101. i++;
  102. }
  103. writeln("i = ", i);
  104. */
  105. string[] argv1 = argv[1 .. $]; // argv[0] always = program name ( ./dopp in my case in linux )
  106. bool valid1 = is_valid_argv(argv1);
  107. writeln("valid1 = ", valid1);
  108. if(!valid1){
  109. return 0;
  110. }
  111. //string source = `if (x > 0) { writeln("Positive"); }`;
  112. //auto tokens = tokenize(source);
  113. //writeln(tokens);
  114. //parse(tokens);
  115. return 1;
  116. }
  117. unittest{
  118. assert( is_valid_argv([]) == false );
  119. assert( is_valid_argv([""]) == false );
  120. assert( is_valid_argv(["-t"]) == true );
  121. assert( is_valid_argv(["-d"]) == false );
  122. assert( is_valid_argv(["-d", ""]) == false );
  123. assert( is_valid_argv(["-d", "/test"]) == true );
  124. assert( is_valid_argv(["-d", "/test", "-o", "/test2"]) == true );
  125. assert( is_valid_argv(["test.de"]) == true );
  126. assert( is_valid_argv(["-f", "test.de"]) == true );
  127. assert( is_valid_argv(["-f", "test.de", "-o", "test.d"]) == true );
  128. assert( is_valid_argv(["test.txt"]) == false );
  129. assert( is_valid_argv(["-f", "test.txt"]) == false );
  130. assert( is_valid_argv(["-f", "test.txt", "-o", "test.d"]) == false );
  131. assert( is_valid_argv(["-f", "test.de", "-o", "test.txt"]) == false );
  132. }
  133. // ./dopp -t == shortened for test (onto single .de -> .d module)
  134. // ./dopp -d "/test" -o "/test2" == input dir path + output dir path (default output dir = input dir)
  135. // ./dopp -f test.de -o test.d == input file name + output file name (default output file name = input file name [but .d instead .de] )
  136. // ./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] )