Beman Dawes <[EMAIL PROTECTED]> writes: > At 10:59 AM 8/18/2003, David Abrahams wrote: > > >Beman Dawes <[EMAIL PROTECTED]> writes: > > > >> Yes. Plus there are some other issues. > >> > >> The actual interface would include boost::filesystem::path > >> constructors which take an additional argument to explicitly specify a > >> name checker function. In working out use cases, it seems that > >> temporary overrides of the default function are best handled via these > >> constructors. That leaves only the case of wishing to permanently > >> replace the default function, and the simpler approach you are talking > >> about would be better for that. > >> > >> For safety, such a set_legal_name_policy() would use the > >> write-once-before-read idiom to avoid a dangerous global > >> variable. (I'm actually thinking of "name_check" for the type, and > >> "set_name_check" for the function name.) > >> > >> I'm about to post a message asking for opinions on the details of the > >> policy function pointer or object. > > > >This starts to align with what I've been thinking. Every path object > >could maintain a chain of checkers, and combinations of path objects > >(e.g. via operator/) would use the union of the checkers of their > >components, so that checking would never become less-restrictive > >silently. > > That is more machinery than is needed. It would be a nice design for a > system that had to revisit elements, but for that isn't required here. > > When I was first working with designs for error checking, I tried a > lot of similar schemes. Eventually I realized that treating name > validity as an invariant established at construction was much simpler > and performed quite well. It doesn't require keeping a chain of > checkers. It performs the checking at the point in the calling program > where knowledge of what is valid is present.
Sure. The question is: path x('foo/bar', portable_check); path y('baz', native_check); path z = x/y; // Which checks are made? path q = z/y; // which checks are made? > > Of course, though I think this goes against the grain of > >the library, I believe the default checker should always be the for > >the native platform. > > Because the native platform may support several different file systems > within the same directory tree, it isn't possible to perform a full > and correct lexical (inspection of the name only) check for the native > platform. You in effect have to try the path and see if the operating > system accepts it. What the lexical level name check done by class > path is trying to do is early detection of gross naming errors. Sure; I just don't want to have to be explicit about anything just to say "I'm doing native path manipulation", since I believe that's the 90% case. I don't want to be stopped by irrelevant portable path considerations nor uglify my code to avoid it. > A specific example might help. Say you are working on a Linux > platform. It supports a really wide range of characters in > names. But you know the code sometimes will run on Windows, so you > would like to check automatically that some directory tree you > create doesn't violate Windows naming conventions. You do this by > specifying a Windows name checker (which disallows a bunch of > special characters). This will prevent your program from > inadvertently using the special characters that Windows always > disallows. > > Now when the program actually runs on a Windows box, a native path > may be given (say by operator input) as the root, and then the > relative portions your program adds get tacked on. If the operator > supplied root happens to be a CD ISO-9660 file system, your > carefully chosen relative names may fail, because the ISO-9660 names > are way more restricted that general Windows names. > > In that case, the attempt at early detection was a failure; the name > checker did no good. But a lot of real-world errors will be detected > early, so I don't see the name checking as a failure. It just is a > partial check, not an iron-clad guarantee. A useful axillary > mechanism, but not the main show. No argument. > But because it can't be an iron-clad guarantee, I'd prefer not to > build an even mildly complex mechanism to support it. Particularly > since some programmers will disable it anyhow. You need to define sensible semantics for path combinators then. Oh, and disabling is easy: path z = path(x, no_check)/path(y, no_check); -- Dave Abrahams Boost Consulting www.boost-consulting.com _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost