On 10/31/07, Ritesh Kumar <[EMAIL PROTECTED]> wrote: > > On 10/31/07, Anselm R. Garbe <[EMAIL PROTECTED]> wrote: > > > > Hi Ritesh, > > > <snip> > > > > Well let's have a look at the relevant bits in the code: > > > > (a) switch(r = read(STDIN_FILENO, stext, sizeof stext - 1)) { > > [...] > > default: > > (b) for(stext[r] = '\0', p = stext + strlen(stext) - 1; p >= > > stext && *p == '\n'; *p-- = '\0'); > > (c) for(; p >= stext && *p != '\n'; --p); > > (d) if(p > stext) > > (e) strncpy(stext, p + 1, sizeof stext); > > [...] > > > > (a) Reads the next bunch of stdin, beginning at stext[0] and > > ending at stext[r]. > > > > (b) 0-terminates stext, and trims rightmost '\n' from right to left > > only. > > > > (c) If p still does not point to stext, it now seeks for a '\n' > > character leftwards. > > > > (d) If during (c) such a '\n' character was found, it is the > > begin of the last line which has been read. > > > > (e) Hence, we copy the last line read only to stext, beginning > > at the '\n' character + 1 to stext. It is 0-terminated already. > > > > So in my eyes, assumed the complete output of the input script > > is read, the code is correct and does what it is supposed > > to do: it only displays the last line read from stdin (this might > > be a bunch of data which is not '\n'-terminated yet during this read > > round of course). > > > The problem is that select will notify dwm the moment *anything* is > available on stdin... and that could be partial data. > There is one semantic difference between the code snippets. While the > original one retains the last line of given multiline input, the suggested > snippet shows the first line. However, its hard to think of a situation > where somebody would pour in multiline text (all in a small amount of time) > for the status as dwm would not be able to show all of it anyways regardless > of the semantics. > > If you like to debug, you could add an > > > > fprintf(stderr, "'stext == %s'\n", stext); > > > > in there between (c) and (d). Then we can make sure that your > > guess is correct. > > > > If the input is not read during one read call as you believe, > > then at least there must be some flashing, because dwm will > > actually render the <some text> at the status bar, but maybe > > your system is really fast and you don't notice this. > > > I will do this and post the results. > You are right about my system... its really fast :). Actually, I did see a > flash but it was merely a flicker and happened only sometimes. > > _r > > Okay, I tried the debug: the output with the previous code is inputtext == <sometext> inputtext == Wed Oct 31 14:46:32 EDT 2007 inputtext == <sometext> inputtext == Wed Oct 31 14:46:33 EDT 2007 inputtext == <sometext> inputtext == Wed Oct 31 14:46:34 EDT 2007 inputtext == <sometext> inputtext == Wed Oct 31 14:46:35 EDT 2007 inputtext == <sometext> inputtext == Wed Oct 31 14:46:36 EDT 2007
So, read() is really not reading all of the 'intended text to be read' in one go. _r