[M3devel] [M3commit] CVS Update: cm3

Tony Hosking hosking at cs.purdue.edu
Thu Feb 21 18:54:54 CET 2008


I will dip my toe into this swamp only to make some high-level  
observations.  First, until we can come up with a well-specified  
abstraction in the form of a clean M3 interface I for one will find  
it increasingly difficult to follow the motivation and developments  
of any scheme.  In the face of that difficulty, I strongly prefer to  
stick to the current, non-portable, approach (ie, different path  
encodings for different targets maintained *separately*).  This will  
minimize disturbance for the many of us that only work on POSIX  
targets and need those to stay stable.  I am very nervous that my  
POSIX target will start to behave strangely or differently because of  
some interim commit to a rapidly evolving code base.  Hence, I  
applaud Olaf's suggestion that we come up with a clean design before  
we start hacking, and that the implementation stay off the critical  
path until it has been well-tested and understood.

On Feb 21, 2008, at 11:48 AM, Olaf Wagner wrote:

> Quoting Jay <jayk123 at hotmail.com>:
>> I'd like to make "progress" on what I have -- mainly slash   
>> independence, no colon hack on Unix.
>> And then see about making much more progress.
>
> OK.
>
>> M3Path compromises a few bits of functionality, some of which  
>> could  go in libm3, but not all.
>>
>> It has "path cleanup", of a sort that was strongly suggested here  
>> to  be wrong.
>> That is, "cleanup" of a/./b to a/b, a/../b to b.
>> Incorrect in the face of links.
>> But still general purpose if people want it.
>> The code that does this work I think can stand a rewrite. It is   
>> currently limited to 31 slashes and after that it just silently   
>> ignores stuff. If you reverse the path first, do the work,  
>> reverse  again, you can support unlimited lengths with small fixed  
>> memory  (smaller than it currently uses to support limit lengths).
>>
>> It has "path conversion" between "host" and "target".
>> This is specially just changing slashes around.
>> It does not deal with "drive letters".
>
> I see. This could be abstracted, too, though.
>
>> It deals with "file types".
>> This is an area that probably does not belong in libm3.
>> "types" are, you know, .m3, .i3, reasonably simple, but also   
>> libfoo.a vs. foo.lib.
>> There is code to pick apart paths to "in that way", which I  
>> find..a  little unusual.
>
> OK. This is rather compiler specific.
>
>> I did already change the Win32 Pathname implementation to  always/ 
>> usually treat forward and backward slashes as the same. That  goes  
>> pretty far.
>>
>> I believe the Pathname abstraction is that a path is essentially  
>> an  array of strings, you can add/remove from either end, add to  
>> one or  the other or both ends, and join two.
>
> Yes, but it could be extended. There is also some support for
> different kinds of `roots'.
>
>> An issue I'm avoiding..because I don't want to pollute the code  
>> with  calls out ot Cygwin, is "correct" conversion between Win32  
>> and  Cygwin paths. Generally the conversion is c:\foo <=> / 
>> cygdrive/foo.
>>
>> I haven't seen how "network paths" are handled.
>>
>> Path handling is a surprisingly large rats nest of subtle  
>> behaviors  and I'm not sure I really want to open it.
>
> I'll second that.
>
>> Really, there are a few Win32 behaviors that i haven't gotten into..
>>
>> Even if you ignore Win32 -- what about case sensitivity? Even on  
>> Mac  and presumably Unix (to a Mac or Windows server), you can  
>> encounter  case insensitive file systems. The current Modula-3  
>> code is not  prepared for that.
>
> Case sensitivity of file names should be handled centrally, too.
> It could be a property of a filename. But then that property needs to
> be set by someone - runtime, environment, user, application...
> As this is a big issue for portability of code, I'd say we should
> come up with some sound concept here, but of course that can be
> independent of your current work.
>
>> One of my favorite sob stories here, I've probably told it here,  
>> is  that I have a low end NAS (it won't boot lately..). It runs  
>> Linux,  of course (I said it is low end). I downloaded it source,  
>> extracted  it, xcopied, xcopyied it again incrementally. That  
>> fails. Because  some of the file names start with a dot and on  
>> Unix, that means they  are hidden and cannot be unhidden..
>
> `Hidden' on Unix usually only means that files are not shown with
> a simple `ls'. There's nothing special in the system to treat dot- 
> files
> different from others as far as I know.
>
>> So this whole "hidden" thing is not portable, just as colons in   
>> paths are not portable, but they work just fine if you stay on  
>> one  system...
>
>> Let me get M3Path to where I want it, and repair the Unix colon   
>> behavior, and see about rewriting the "cleanup" code... as long  
>> as  folks are happy with how it ends up, I'm not sure I want to  
>> puruse  it much more. There are much bigger fish...
>
> OK, I can understand that you just want to finishd your current work.
>
>> Oh, I already have code on my system so that when we read ROOT,   
>> CM3_INSTALL, CM3_ROOT from the command line and/or environment,   
>> those paths get "fixed up" -- slashes reversed. That should help  
>> a  lot here, without much pollution..
>
> It should help, but it also needs to be tested on different platforms.
>
>> One thing I'm not sure about is the treatment of backward slashes   
>> equivalent to forward slashes on Posix.
>> Maybe better just to do that fixup upon a few certain inputs. And   
>> have Win32 use either, but Posix only forward.
>> It's "harmless" but loose.
>
> Yes, I'd be rather conservative there, too.
>
>> There this general problem of "user input" vs. "internal,  
>> strongly  typed, analyzed, rule-following" data.
>> As well as then presenting the internal data back to the user in  
>> the  form he expected.
>>
>> It's is fine if I saw cm3 -DROOT=c:\\foo and internally it is c:/foo
>> but when an error message is reported, in case I am going to  copy/ 
>> paste the paths in it to file.open, it should be back with   
>> backward slashes. This is not simple. You could maintain two   
>> parallel representations as you muck with the path. Not great.  
>> You  could "characterize" the form of the user in put (which  
>> slash  directory), keep that around, it's just one bit, and use it  
>> to guide  the later presentation...
>
> One internal, abstract representation of the data, and two or more
> views on it (getPosixPath, getWindowsPath, ...) come to mind here.
>
> Olaf
> -- 
> Olaf Wagner -- elego Software Solutions GmbH
>                Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin,  
> Germany
> phone: +49 30 23 45 86 96  mobile: +49 177 2345 869  fax: +49 30 23  
> 45 86 95
>    http://www.elegosoft.com | Geschäftsführer: Olaf Wagner | Sitz:  
> Berlin
> Handelregister: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr:  
> DE163214194
>




More information about the M3devel mailing list