www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - regading detection of stdin

reply Hugo Florentino <hugo acdam.cu> writes:
Hi,

I was trying to do something like this (using dmd.2.064.2 both from 
Windows and Linux), but if nothing is passed from stdin and no parameter 
is provided, the application freezes:

import std.stdio, std.file: readText;

int main(string[] args) {
   string s;
   switch (args.length) {
     case 1:
       if ((s = stdin.readln()) is null)
         writeln("No argument passed as parameter or from stdin.");
       else
         writeln("Argument passed from stdin succesfully stored in 
variable s.");
       scope (failure) {
         writeln("Error reading from stdin.");
         return -1;
       }
       break;
     case 2:
       s = readText(args[1]);
       scope (failure) {
         writeln("Error reading from file passed as parameter.");
         return -2;
       }
       writeln("Argument passed as parameter succesfully stored in 
variable s.");
       break;
     default:
       writeln("Incorrect number of parameters. Maximum is one.");
       return -3;
   }
   return 0;
}


Where is the problem?

Regards, Hugo
Dec 05 2013
next sibling parent "Adam D. Ruppe" <destructionator gmail.com> writes:
On Friday, 6 December 2013 at 00:24:22 UTC, Hugo Florentino wrote:
 if nothing is passed from stdin and no parameter is provided, 
 the application freezes:
Does it freeze or just wait for you to press enter on the keyboard?
Dec 05 2013
prev sibling next sibling parent reply Hugo Florentino <hugo acdam.cu> writes:
On Fri, 06 Dec 2013 06:42:01 +0100, Jesse Phillips" wrote:
 On Friday, 6 December 2013 at 02:41:28 UTC, Hugo Florentino wrote:
 I see... so the "problem" simply was that function readln was
 expecting user input. In that case, this is not what I intended. I
 want the application to receive the stdout of another command as
 stdin, and to detect if nothing is sent. How coud I accomplish this?
Then you'll want std.process[1]. This provides functions for "piping" output[2]. As for detecting output, that can only be verified once the other process has finished; to handle that it should be reasonable to execute[3] and check the complete output. 1. http://dlang.org/phobos/std_process.html
Hmm... I am not too clear even after reading the documentation. From what I could understand, these are all wrappers around spawnProcess and spawnShell, which are intended to launch a child process from the application, but that is not quite what I need. I simply want to support this kind of use: echo -n "This is just a test" | myapplication The command echo here serves only as an example, it could be any other command not necessarily open-source or programmed in D. What can I do? Regards, Hugo
Dec 07 2013
parent "Adam D. Ruppe" <destructionator gmail.com> writes:
Sounds like what you need is to see if stdin is a tty.

import core.sys.posix.unistd; // has isatty()

void main() {
         import std.stdio;
         writeln(isatty(0)); // 0 is stdin, so this will show 1 if 
keyboard or 0 if pope
}
Dec 07 2013
prev sibling parent "Chris Cain" <clcain uncg.edu> writes:
On Friday, 6 December 2013 at 00:24:22 UTC, Hugo Florentino wrote:
 Hi,

 I was trying to do something like this (using dmd.2.064.2 both 
 from Windows and Linux), but if nothing is passed from stdin 
 and no parameter is provided, the application freezes:

 ...snip...


 Where is the problem?

 Regards, Hugo
I'm not sure I understand the problem. Your program works as I think you describe it should on my Linux box: --- zshazz manjarox ~/projects/explore % cat /dev/null | rdmd inputStuff.d No argument passed as parameter or from stdin. zshazz manjarox ~/projects/explore % echo -n "" | rdmd inputStuff.d No argument passed as parameter or from stdin. zshazz manjarox ~/projects/explore % echo -n "test" | rdmd inputStuff.d Argument passed from stdin succesfully stored in variable s. zshazz manjarox ~/projects/explore % rdmd inputStuff.d blah.txt Argument passed as parameter succesfully stored in variable s. --- If you just run it (via `rdmd inputStuff.d`) it pauses and waits for some sort of input, but that's expected. Using `ctrl-d` results in "No argument passed as parameter or from stdin." as expected in that case. Could you describe what you're doing exactly that causes it to freeze?
Dec 07 2013