www.digitalmars.com         C & C++   DMDScript  

DMDScript - How to extract command-line arguments ?

reply "Anthony Borla" <ajborla bigpond.com> writes:
Greetings,

I'd like to extract the command-line arguments passed to a DMDScript script.
For example, if I enter the following command:

    ds myscript.ds 1 "aaa" DMD

I would like the values:

    1
    aaa
    DMD

to be accessable from within the script.

I am able to accomplish this task via the Windows Scripting Host using the
following code:

    // Extract command-line arguments, and load into
    // 'arguments' array
    if (WScript.Arguments.length < 1)
    {
      arguments = new Array(0);
    }
    else
    {
      arguments = new Array(WScript.Arguments.length);

      for (var i = 0 ; i < arguments.length; ++i)
        arguments[i] = WScript.Arguments(i);
    }

    // Display command-line arguments
    for (var i = 0 ; i < arguments.length; ++i)
      WScript.Echo("Argument[" + i + "] is " + arguments[i]);

Using DMDScript, the 'println' function is the obvious analog of
'WScript.Echo'. However, I'm not aware of a global array, or function, of
similar functionality to, 'WScript.Arguments'.

So my questions are:

* Is there such an array or function natively available in
   DMDScript ?

* If not, is it possible to perhaps 'hook into' a D function
   with this functionality *without* having to modify the
   DMDScript source code, and recompile the interpreter ?

* If not, are there plans add such functionality to future
   versions of DMDScript ?

I look forward to any response.

Cheers,

Anthony Borla
Oct 30 2005
next sibling parent reply Carlos Santander <csantander619 gmail.com> writes:
Anthony Borla escribió:
 Greetings,
 
 I'd like to extract the command-line arguments passed to a DMDScript script.
 For example, if I enter the following command:
 
     ds myscript.ds 1 "aaa" DMD
 
 I would like the values:
 
     1
     aaa
     DMD
 
 to be accessable from within the script.
 
 I am able to accomplish this task via the Windows Scripting Host using the
 following code:
 
     // Extract command-line arguments, and load into
     // 'arguments' array
     if (WScript.Arguments.length < 1)
     {
       arguments = new Array(0);
     }
     else
     {
       arguments = new Array(WScript.Arguments.length);
 
       for (var i = 0 ; i < arguments.length; ++i)
         arguments[i] = WScript.Arguments(i);
     }
 
     // Display command-line arguments
     for (var i = 0 ; i < arguments.length; ++i)
       WScript.Echo("Argument[" + i + "] is " + arguments[i]);
 
 Using DMDScript, the 'println' function is the obvious analog of
 'WScript.Echo'. However, I'm not aware of a global array, or function, of
 similar functionality to, 'WScript.Arguments'.
 
 So my questions are:
 
 * Is there such an array or function natively available in
    DMDScript ?
 
 * If not, is it possible to perhaps 'hook into' a D function
    with this functionality *without* having to modify the
    DMDScript source code, and recompile the interpreter ?
 
 * If not, are there plans add such functionality to future
    versions of DMDScript ?
 
 I look forward to any response.
 
 Cheers,
 
 Anthony Borla
 
 

DMDScript treats its command line arguments rather oddly, but there's a global variable "arguments". There're two paths you can take: modify DMDScript source (maybe testscript.d would be enough) so command line arguments are not treated as more source files and then pass them to the program, or use Walnut, which already does that for you. The problem with Walnut is that it's kinda on extended hold by now because I'm busy with other things, but I think there's a compiled version available for Windows on www.dsource.org which you can use (I'm not telling you to compile it because I doubt it'll compile.) -- Carlos Santander Bernal
Oct 31 2005
parent reply "Anthony Borla" <ajborla bigpond.com> writes:
"Carlos Santander" <csantander619 gmail.com> wrote in message
news:dk6lfb$26pr$1 digitaldaemon.com...
 Anthony Borla escribió:
 Greetings,


Carlos,
 I'd like to extract the command-line arguments passed
 to a DMDScript script. For example, if I enter the
 following command:


 DMDScript treats its command line arguments rather
 oddly, but there's a global variable "arguments".

That was the first thing I tried. Yes, a global 'arguments' exists, but command-line values do not get passed to them. For example, issuing from the command-line: ds myscript.ds X Y Z should see the following occur in the script: ... println(arguments[0]); // X printed println(arguments[1]); // Y printed println(arguments[2]); // Z printed ... Instead the observed behaviour is: ... println(arguments[0]); // undefined println(arguments[1]); // " println(arguments[2]); // " ... and DMDScript interprets the first command-line argument as a file name: Error: X.ds: The system cannot find the file specified. This is unintuitive behaviour for a command-line tool whether executed in a Windows-family, or a *NIX environment.
 There're two paths you can take: modify DMDScript
 source (maybe testscript.d would be enough) so
 command line arguments are not treated as more
 source files and then pass them to the program,

Yes, I *could* modify the source code and add the requisite behaviour [including remedying the other behavioural 'anomolies' mentioned in my other posts]. However, not being a D expert, it would take a significant amount of my time. To be quite honest, if I'd wanted to write D code, I'd do so, and not bother using an ECMAScript interpreter :) ! In addition, any enhancements would only be of benefit to users of this customised version of the interpreter rather than to all those future downloaders of DMScript from the DigitalMars website. Rather a waste of effort I should think !
 or use Walnut, which already does that for you. The problem
 with Walnut is that it's kinda on extended hold by now because
 I'm busy with other things, but I think there's a compiled version
 available for Windows on www.dsource.org which you can use
 (I'm not telling you to compile it because I doubt it'll compile.)

I truly do appreciate your suggestion because you are making a constructive suggestion to help me solve a specific problem. However, I'm not sure that using yet another tool to remedy a 'problem' in an existing tool is the answer [IMO it does not adhere to the KISS principle]. What I'd really like to see for my, and I'm sure, many other people's benefit, is a revised version of DMDScript which remedies the 'problems' I mentioned here, and in related posts. My argument for suggesting this is as follows. Whilst DMDScript is presented as both a 'showcase' product for the D language, and as an embeddable ECMAScript interpreter [both roles, I believe, it admirably fulfils], it is also presented in a command-line version, presumably to act as a 'command-line tool'. Sadly, owing a number of minor, but behaviourally significant, deficiencies, it does not effectively fulfil this role. For example, I can't use it in my script files [I have to, instead, use WSH 5.6] because it can neither accept command-line arguments, return an exit code, nor correctly read text files. I'm sure I'm not the only one hampered by such difficulties. Sadly, this serves only to limit DMDScript's potential user base. Further, it may even leave others with a poor, or negative, opinion of the product. It seems a shame to tarnish the reputation of an otherwise fine product by not applying a few 'finishing touches' to it. Finally, I'm not being critical just for the sake of it. If I was in a position to make the requisite improvements I would have done so [I much prefer action to words, but this isn't always possible]. I would have thought, though, that in the four months since I first mentioned these problems, that some action by the relevant experts would have been taken. Cheers, Anthony Borla P.S. The version I've been using is: Digital Mars DMDScript 1.06 www.digitalmars.com Compiled by Digital Mars DMD D compiler Copyright (c) 1999-2005 by Digital Mars written by Walter Bright which I believe is the latest.
Nov 01 2005
parent reply Dan <Dan_member pathlink.com> writes:
Wow.

Thanks for the heads up Anthony.  I've got to go do a friend's website today,
but tommorrow I'll work on implementing (at least) one of your changes.

I actually noticed a few of the same problems.  :p  Needless to say, I thought
DMDScript was a little more capable as well.  My understanding is though that
it, at one point, did support command line arguments (it seems to be just
choking on the first one?)

This may also explain why it doesn't accept piped input too.  :p  I haven't done
any real homework into how piping text around works.  (call myself a programmer,
gawd)
Nov 01 2005
parent reply "Anthony Borla" <ajborla bigpond.com> writes:
"Dan" <Dan_member pathlink.com> wrote in message
news:dk9bd0$1l4d$1 digitaldaemon.com...

Dan,
 Wow.

 Thanks for the heads up Anthony.  I've got to go do a friend's
 website today, but tommorrow I'll work on implementing
 (at least) one of your changes.

 I actually noticed a few of the same problems.  :p  Needless
 to say, I thought DMDScript was a little more capable as well.

It *is* definitely capable [e.g. exception handling works fine whilst it doesn't do so in WSH 5.6], and is *fast*, but it just has a few command-line operation-oriented 'glitches' which, I think, are crying out to be remedied. To recap, the important ones are: * Command-line argument processing; probably best to properly fill the global 'arguments' object so that: arguments[0] // ==> 1st argument arguments[1] // ==> 2nd argument and so on * An 'exit' function to return an arbitrary integer value to the OS * Fix 'readln' so it distinguishes between an 'empty' line and EOF. I'd imagine the easiest approach would be to have 'null' returned on EOF, and a zero-length string for 'empty' lines [since it 'eats' the line terminator] With these in place it should be possible to, quite effectively, use DMDScript for command-line scripting such as, for example, creating filters. Optionally, I suppose, file-oriented I/O could be expanded: * 'open', 'close' functions, returning / taking a file handle / descriptor etc * Extend 'readln' to accept a file handle / descriptor so that an arbitrary file can be read [same with 'print' and 'println', for output] but this would obviously be for another time.
 My understanding is though that it, at one point, did support
 command line arguments (it seems to be just choking on the
 first one?)

I honestly don't know the history. I downloaded DMDScript 1.6 a few months ago hoping to use it in my scripts [both Windows 'batch' and *NIX 'bash' scripts] but the problems I mentioned pretty well hampered those efforts.
 This may also explain why it doesn't accept piped input
 too.  :p

Yes, another command-line operation-oriented glitch. This would, I'd imagine, come under the task of getting 'readln' to work correctly.
 I haven't done any real homework into how piping
 text around works.

No need to know everything, just enough to allow the job at hand to be completed.
  (call myself a programmer, gawd)

So do I. However these days I avoid compiled / statically-typed languages like the plague [only digging such tools out when I absolutely have to], and will continue to do so for as long as I am able. Cheers, Anthony Borla P.S. I can't really help with programming tasks [these, I find, are *always* very time-consuming even when they are - supposedly - minor or simple], but am more than happy to help in testing, and related matters. With any luck, a DMDScript version 1.6x will soon be a reality :) !
Nov 01 2005
next sibling parent Dan <Dan_member pathlink.com> writes:
Phhhh...

I just spent the whole week working on my new Asma library.  It is a macro
library that allows HLL programming in NASM, including explicit
STD/Pascal/C/Fastcall declaration AND calls, local variables (managed
differently by calling method), switches, loops, if/else/elseif/endif, multiple
push/pops and stuff like that.

It goes very nicely with my new assembly Array function library (that
interestingly has most of the same functionality as the ECMAScript Array object
with the JavaScript 1.6 extensions)

I did not, however, do any work on my modified DMDScript engine.  At this point,
I'm thinking it's about time I publish that... :p  I'll post back when I've done
that.
Nov 05 2005
prev sibling parent reply Dan <Dan_member pathlink.com> writes:
Okay, here is a link to a fuuuugly page where you can get the code I've done so
far.  So far, all I've done is run it through my home-brewed DTidy.js script,
which atm is only slightly better than your average tidier upper.  It also does
some neat stuff with cleaning up branching logic.

Some obvious bugfixes need to be done, as was said earlier.

Also, it's obvious that there would be some performance/codesize improvements to
be gained from unifying errmsgs.d and text.d (and use constants instead of array
offsets + enums).  I was working on making textgen handle both, but I started
working on Asma before I was done.

The other biggie I noticed is that DMDScript uses *cough*crap*cough* like malloc
and memset to do stuff.  Fugly.  For most of those routines, they could be
rewritten in 'bout 20 lines of asm for a 10-100% boost in performance.  That's
before I even touch the ECMAScript method implementations.

So DMDScript is ~sexy~ but, I think a dedicated hacker could easily pull another
200% time complexity out of it without getting his hands dirty.
Nov 05 2005
parent reply Dan <Dan_member pathlink.com> writes:
EEP.. so the fugly page is at:

http://code.murpsoft.com/dmdScript/index.asp
Nov 05 2005
parent "Anthony Borla" <ajborla bigpond.com> writes:
"Dan" <Dan_member pathlink.com> wrote in message
news:dkj4qu$26nu$1 digitaldaemon.com...

Dan,
 EEP.. so the fugly page is at:

 http://code.murpsoft.com/dmdScript/index.asp

Sorry for the delay in looking at this [got caught up at work], but will do so this weekend. Cheers, Anthony Borla
Nov 10 2005
prev sibling parent reply Dan <Dan_member pathlink.com> writes:
In DMDScript, the Global object is creating an array called arguments (I saw
some things about it in the source).  I tested it out and for some stupid reason
or another in Windows (at least) it's claiming that arguments is undefined.

Perhaps the symbol is not being linked to the array, perhaps something is
buggered or perhaps I misunderstood.  I'll work on this tonight.

My test script:

for(var i = arguments.length-1; i--;){
println(arguments[i]);
}

This currently loops infinitely btw.  :p
Wish me luck!
Nov 11 2005
parent reply Dan <Dan_member pathlink.com> writes:
Walter's 1.06 DMDScript:
global.d on lines 756-768

My "modified" 1.06 DMDScript:
global.d on lines 665-673

Walter declared a Darray and stuffed the arguments provided
to Dglobal into that Darray.  

However, in his "testscript.d" which is the main() for ds.exe, 
on line 60-63 it overrides any arguments passed to the main() 
as -i or -v the moment any other argument is passed, and it then 
instead stuffs those arguments in as source files for ds 
(and iteratively executes them in separate contexts)

What needs to be done is to instead stuff those arguments
into Dglobal.  The -i acts as a command line "include" and 
-v acts as "verbose" for the ds.exe.

If you're in a hurry, you may choose to modify this yourself,
but I'm going to be tinkering in testscript.d to make it work
properly.  I suck at D though (I'm natively an asm/C programmer)
so it may take a day or two to get a decent implementation.
If Walter wrote it, it'd probably take him an hour but then I'd have
no fun.  :p
Nov 11 2005
parent bobr <bob_racko yahoo.com> writes:
OK, I have command line arguments working.

watch for posts here
under "improved testscript.d"
Jan 16 2007