I keep forgetting to copy the maxima list on my replies. It's probably a
habit I'll have difficulty breaking now.
-------- Original Message --------
Subject: Re: Universal read_data function
Date: Thu, 09 Jun 2011 13:50:57 -0700
From: Paul Bowyer <pbowyer at olynet.com>
To: Edwin Woollett <woollett at charter.net>
On 06/09/2011 10:21 AM, Edwin Woollett wrote:
> On June 8, 2011, Paul Bowyer wrote:
> ----------------------------------------
> Evidently there is something going on with text file EOL conversion that
> happens in Thunderbird. I tried opening the attached data files directly
> with okteta by right-clicking on the attachment and selecting okteta,
> but Thunderbird uses some internal program/function to transfer the
> data. When I examined the data file in okteta I'd find the EOL chars to
> be either unix LF or, in the case of the macintosh file, non-existent. I
> also tried using notepad (comes with the Windows emulator, wine) and was
> unable to get the EOL chars the way you described them. I finally used
> kwrite as the opener after I had pre-configured it for the proper EOL
> sequences, but even then I had to manually modify a couple of the files
> by inserting spaces at the proper locations so I could then use okteta
> to convert those inserted spaces to CRs.
>
> After I got the EOL sequences set up according to those you described, I
> ran eol_chars and here are the results:
> -------------
> printfile("/home/pfb/ndata9.dat")$
> eol_chars("/home/pfb/ndata9.dat");
>
> printfile("/home/pfb/line1w.txt")$
> eol_chars("/home/pfb/line1w.txt");
>
> printfile("/home/pfb/line1u.txt")$
> eol_chars("/home/pfb/line1u.txt");
>
> printfile("/home/pfb/line1m.txt")$
> eol_chars("/home/pfb/line1m.txt");
>
> 2 , 4.8, -3/4, "xyz", -2.8e-9
>
> 2 , 4.8, -3/4, "xyz", -2.8e-9
>
> 2 , 4.8, -3/4, "xyz", -2.8e-9
>
> (%o4) [13,10]
> ABCD
> (%o6) [13,10]
> ABCD
> (%o8) [10]
> ABCD
> (%o10) [13]
> ----------------
> So it looks like you have a working solution to the EOL situation that
> covers all of the platforms maxima runs on.
>
> By looking at the maxima documentation, I wouldn't have thought of using
> lfreeof as a way to discover character numbers in a string. So I learned
> something new about maxima that may come in handy one day.
> -----------------------------------------
> Hi Paul,
>
> The next part of the experiment is to take those three one
> line files with known different eol chars and open each as
> a stream and then use the maxima function readline.
>
> The Maxima help manual description of readline is irritatingly
> vague. :
> ---
> readline (stream)
>
> Returns a string containing the characters from the current position
> in stream up to the end of the line or false if the end of the file is
> encountered.
>
> ----
> (notice that 'end of line' is not defined there.)
>
> If you look at the lisp code for readline in stringproc.lisp, it uses
> the lisp function read-line, and the common lisp cookbook description
> of read-line is:
> ----
> READ-LINE will read one line from a stream (which defaults to standard
> input) the end of which is determined by either a newline character or
> the end of the file. It will return this line as a string without the
> trailing newline character. (Note that READ-LINE has a second return
> value which is true if there was no trailing newline, i.e. if the line
> was terminated by the end of the file.) READ-LINE will by default
> signal an error if the end of the file is reached. You can inhibit
> this by supplying NIL as the second argument. If you do this,
> READ-LINE will return NIL if it reaches the end of the file.
> -----------------
> So my literal reading of this is that the CL read-line will return all
> the chars up to
> the newline char (which I interpret to mean LF, decimal 10), and this
> would mean
> that Maxima's readline would return the CR (decimal 13) char as well
> as the
> first four chars "ABCD".
> ---------------------------
> So basically, I don't know who or what to believe, and thus this
> experiment. Is there a Lisp version dependency of read-line which
> will affect certain users of a universal read_data function??
> (in which case I would have to write my own homemade read_line)
> ------------------------------------
> Anyway, if your operating system and Lisp version cooperate as
> hoped for, you should get the following results:
>
> ------------------
> (%i1) display2d:false$
> (%i3) load(eol_chars);
> (%o3) "c:/work2/eol_chars.mac"
> (%i4) printfile("line1w.txt")$
> ABCD
> (%i5) eol_chars ("line1w.txt");
> (%o5) [13,10]
> (%i6) file_length ("line1w.txt");
> (%o6) 6
> (%i7) ss : openr ("line1w.txt");
> (%o7) ?\#\<input\ stream\ line1w\.txt\>
> (%i8) al : readline (ss);
> (%o8) "ABCD"
> (%i9) slength(al);
> (%o9) 4
> (%i10) close(ss);
> (%o10) true
> (%i11) printfile ("line1u.txt")$
> ABCD
> (%i12) eol_chars ("line1u.txt");
> (%o12) [10]
> (%i13) file_length ("line1u.txt");
> (%o13) 5
> (%i14) ss : openr ("line1u.txt");
> (%o14) ?\#\<input\ stream\ line1u\.txt\>
> (%i15) al : readline (ss);
> (%o15) "ABCD"
> (%i16) slength (al);
> (%o16) 4
> (%i17) close(ss);
> (%o17) true
> (%i18) printfile ("line1m.txt")$
> ABCD
> (%i19) eol_chars ("line1m.txt");
> (%o19) [13]
> (%i20) file_length ("line1m.txt");
> (%o20) 5
> (%i21) ss : openr ("line1m.txt");
> (%o21) ?\#\<input\ stream\ line1m\.txt\>
> (%i22) al : readline (ss);
> (%o22) "ABCD"
> (%i23) slength (al);
> (%o23) 4
> (%i24) close (ss);
> (%o24) true
> -------------------------
> Ted
>
>
>
Hi Ted:
I discovered that I didn't have your
'file_length ("pathname")'
so I substituted "fl : flength(ss) which should give similar results.
Here's the input and results:
/*More testing of eol_chars: line1w*/
printfile("/home/pfb/line1w.txt")$
eol_chars("/home/pfb/line1w.txt");
ss : openr("/home/pfb/line1w.txt");
fl : flength(ss );
al : readline (ss);
close(ss);
ABCD
(%o22) [13,10]
(%o23) Stream [CHARACTER]
(%o24) 6
(%o25) "ABCD?"
(%o26) true
/*More testing of eol_chars: line1u*/
printfile("/home/pfb/line1u.txt")$
eol_chars("/home/pfb/line1u.txt");
ss : openr("/home/pfb/line1u.txt");
fl : flength(ss );
al : readline (ss);
close(ss);
ABCD
(%o28) [10]
(%o29) Stream [CHARACTER]
(%o30) 5
(%o31) "ABCD"
(%o32) true
/*More testing of eol_chars: line1m*/
printfile("/home/pfb/line1m.txt")$
eol_chars("/home/pfb/line1m.txt");
ss : openr("/home/pfb/line1m.txt");
fl : flength(ss );
al : readline (ss);
close(ss);
ABCD
(%o34) [13]
(%o35) Stream [CHARACTER]
(%o36) 5
(%o37) "ABCD?"
(%o38) true
The ? is the CR in the file.
Paul