Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Diff of /sml/trunk/src/cm/paths/abspath.sml
ViewVC logotype

Diff of /sml/trunk/src/cm/paths/abspath.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 457, Thu Oct 28 05:58:19 1999 UTC revision 464, Tue Nov 9 06:49:52 1999 UTC
# Line 16  Line 16 
16    
17      val newEra : unit -> unit      val newEra : unit -> unit
18      val revalidateCwd : unit -> unit      val revalidateCwd : unit -> unit
19        val invalidateCwd : unit -> unit
20    
21      val cwdContext: unit -> context      val cwdContext: unit -> context
22      val sameDirContext: t -> context      val sameDirContext: t -> context
# Line 112  Line 113 
113    
114      type ord_key = t      type ord_key = t
115    
116        fun stdEncode p = let
117            fun a [] = []
118              | a [x] = [x]
119              | a (h :: t) = h :: "/" :: a t
120        in
121            case P.fromString p of
122                { isAbs = false, arcs, ... } => concat (a arcs)
123              | { vol = "", arcs, ... } => concat ("/" :: a arcs)
124              | { vol, arcs, ... } => concat ("%" :: vol :: "/" :: a arcs)
125        end
126    
127      local      local
128          val cwdInfoCache : cwdinfo option ref = ref NONE          val cwdInfoCache : cwdinfo option ref = ref NONE
129          fun cwdInfo () =          fun cwdInfo () =
# Line 134  Line 146 
146          val newEra = Era.newEra          val newEra = Era.newEra
147    
148          (* make sure the cwd is consistent *)          (* make sure the cwd is consistent *)
149          fun revalidateCwd () =          fun revalidateCwd () = let
150                fun notify { stamp, name, id } = Servers.cd (stdEncode name)
151            in
152              case !cwdInfoCache of              case !cwdInfoCache of
153                  NONE => ignore (cwdInfo ())                  NONE => notify (cwdInfo ())
154                | SOME { name, id, ... } => let                | SOME { name, id, ... } => let
155                      val name' = F.getDir ()                      val name' = F.getDir ()
156                      val id' = PRESENT (F.fileId name')                      val id' = PRESENT (F.fileId name')
157                  in                  in
158                      if compareId (id, id') <> EQUAL then                      if compareId (id, id') <> EQUAL then let
159                          (newEra ();                          val i = { stamp = ref (), name = name', id = id' }
160                           cwdInfoCache := SOME { stamp = ref (),                      in
161                                                  name = name', id = id' })                          newEra ();
162                            cwdInfoCache := SOME i;
163                            notify i
164                        end
165                      else ()                      else ()
166                  end                  end
167            end
168    
169            fun invalidateCwd () = cwdInfoCache := NONE
170    
171          fun cwdContext () =          fun cwdContext () =
172              (revalidateCwd ();              (revalidateCwd ();
# Line 319  Line 339 
339              fun d_c (CONFIG_ANCHOR { config_name = n, ... }, l) =              fun d_c (CONFIG_ANCHOR { config_name = n, ... }, l) =
340                  "$" :: n :: "/" :: l                  "$" :: n :: "/" :: l
341                | d_c (DIR_OF (PATH { spec, context, ... }), l) =                | d_c (DIR_OF (PATH { spec, context, ... }), l) =
342                  d_c (context, dir (spec, l))                  d_c (context, dir (stdEncode spec, l))
343                | d_c (THEN_CWD _, l) = "./" :: l                | d_c (THEN_CWD _, l) = "./" :: l
344                | d_c (ROOT "", l) = "/" :: l                | d_c (ROOT "", l) = "/" :: l
345                | d_c (ROOT vol, l) = "%" :: vol :: "/" :: l                | d_c (ROOT vol, l) = "%" :: vol :: "/" :: l
# Line 351  Line 371 
371                                         s)                                         s)
372                      end                      end
373                    | #"/" => fresh (ROOT "", String.extract (d, 1, NONE))                    | #"/" => fresh (ROOT "", String.extract (d, 1, NONE))
374                    | #"." => fresh (cwdContext (), String.extract (d, 2, NONE))                    | #"." =>
375                        if String.sub (d, 1) = #"/" then
376                            fresh (cwdContext (), String.extract (d, 2, NONE))
377                        else
378                            fresh (cwdContext (), d)
379                    | #"%" => let                    | #"%" => let
380                          val (v, s) = split 1                          val (v, s) = split 1
381                      in                      in

Legend:
Removed from v.457  
changed lines
  Added in v.464

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0