:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: : class Program.Dual.Public public Gilda: Paths that work on Windows and Unix type Find.Path is &Access directories using Dual path notation. Id Directory.Id, &Set by Open.Multi; used by Next.Multi. Partial Queue..string, &Directory tree walk state First Bit, &First element found Directory string, &Os path of a walk directory (trailing slash) Prefix string, &Os path for the prefixed directory Tail string :Last component in the path (may be wild) type Directory.Member in &Type of an element in a directory None, &Missing or unknown element Head, &Iterator starting a new directory Directory, &Subdirectory File, &Data file Executable, &Program file Link :Unix link import Io.File, Io.Directory, Program.Environment.Public global +File.List Map, &Files in a directory scan +Directory.List Map, &Subdirectories in a directory scan +Max.Width word :Maximum width of file and directory names : :............................................................................... :::::::::::::::::::::::: program/dual/path/Dual.Path ::::::::::::::::::::::::: : method DIRECTORY.TAIL pure: Divide a Dual path (with wildcards) into a directory : and the last component. entry Dual string :Dual path to divide (wild, forward slashes) exit Lead string, &Dual path directory components. Ends in slash. Tail string :Last path component. If a directory, ends in slash. : :............................................................................... : method TAME.COMPONENT: Convert a component to a tame component. entry Tail string :Dual path component (may contain quotes) exit Tame string :Empty if any wildcards (*?!#); else unquoted component : : Ticks are treated as literals. :............................................................................... : method TO.OS.PATH: Convert a Tame Dual path to an OS path. entry Dual string :Dual path (tame, forward slash) exit Os string :Os path (relative, tame, forward slash) : :............................................................................... : function TO.DUAL.PATH: Convert a Windoze specific path to a Dual path. entry Os string :Raw OS path name (forward slashes) exit Dual string :Dual path (lower or exact; path.slash; trail / if Os does). :May be absolute or reference relative to home (-). : :............................................................................... : method TO.DUAL.FORM: Convert an OS specific path to a Dual path. entry Os string :OS path name (tame, forward slashes) exit Form string :Formatted Dual path name (proper, exect or lower case) entry Lower = 0 Bit :0 - Format as a proper or exact name. :1 - Lowercase the result. : :............................................................................... : method QUOTE.OS.PATH: Validate an OS path and quote it if needed. change Path string :OS path to prepare : :............................................................................... : method SINGLE.DIRECTORY: Convert a wild path to a single directory. entry Wild string :Wild Dual path to search exit Path string, &The first match (forward slashes, trailing /) & Empty if no match. More Bit :Set if many; clear if none or one match. : :............................................................................... : method SINGLE.FILE: Convert a wild path to a single file. entry Wild string :Wild Dual path to search exit Path string, &The first matching file; empty if no match. More Bit :Set if many; clear if none or one match. : :............................................................................... : method SINGLE.EXECUTABLE: Convert a wild path to a single executable file. entry Wild string :Wild Dual path to search exit Path string, &The first matching file; empty if no match. More Bit :Set if many; clear if none or one match. : :............................................................................... : method SINGLE.TEXT: Convert a wild path to a single text file. entry Wild string :Wild Dual path to search exit Path string, &The first matching file; empty if no match. More Bit :Set if many; clear if none or one match. : :............................................................................... : method FORM.PATH.NAME: Format a file or directory name for display. change Path string :Directory element name entry Element = 0 Directory.Member :0 - regular file; executable, directory : :............................................................................... : method FORM.PATH.SIZE: Squeeze long path names for display purposes only. change Path string : In - Tame :Out - Display path. May not be a valid path. entry Size parcel :Allowable path size (127 maximum) exit Truncate Bit :The last component was truncated; else left as is. entry Retain = 0 Bit :0 - Discard alpha-numerics for special characters. :1 - Retain alpha-numerics in component (reusable path). : :............................................................................... : method FORM.DUAL.WILD: Make implicit wildcards explicit. entry Dual string :Any Dual path (forward slashes) exit Wild string :Dual path with stars and no ticks (OS slashes). :No trailing slash unless a :disk (<drive>:/), root(/), or net root (//). : :............................................................................... : method DUAL.ABSOLUTE: Derive an absolute path from a base and Dual path. entry Dual string, &Dual path relative to the Root Root string :Relative directory (absolute, trailing slash) exit Path string :Absolute path (may or may not have a trailing slash) : :............................................................................... ::::::::::::::::::: program/dual/directory/Dual.Directory :::::::::::::::::::: : method COMPONENT.TAME: If a component is tame, get its raw name. entry Component string :Component to be checked and transformed. exit Tame string :Null if the component is wild (unquoted *, ?, or !) :else the raw tame text (unquoted, no right tick) : : Faults if an improperly formed quote. :............................................................................... : method COMPONENT.WILD: Prepare a path component for Match.Wild. entry Component string :A right tick suppresses star. exit Wild string :Right tick removed; explicit star added. : :............................................................................... : method DI.PATH: Save a directory element in sorted tables. entry Os string, &Directory element name (no trailing slash) Element Directory.Member, &Type of element Raw = 0 Bit :0 - Format unless Platform`Path.Case = 1 :1 - List actual case : : Exit: Directories are added to Directory.List. : Files are added to File.List. : Long listings use raw (actual) element casing. : Short Windows listings proper case directories and lower case files. : Ambiguous file names are quoted. These contain a : leading dash, trailing tilda or tick, a quote, *, #, !, ?, or space. :............................................................................... : method DI.PATH.ATTRIBUTE: Save a directory element in sorted tables. entry Os string, &Directory element name (no trailing slash) Attribute :Type of element : : Exit: Directories are added to Directory.List. : Files are added to File.List. : Ambiguous file names are quoted. These contain a : leading dash, trailing tilda or tick, a quote, *, #, !, ?, or space. :............................................................................... : method FORM.PATH.LONG: Format a file or directory. entry Lead string, &Os (relative; tame) or directory (trailing /) Tail string :Directory element name exit Long string :Formatted path : :............................................................................... : method FORM.PATH.MULTI: Prepare a Dual path for scanning in Open.Multi. entry Dual string :Dual path name (wild; either slash; double quotes only). exit Path string : :............................................................................... : method OS.PATH.PREFIX: Extract the prefix fields from a Dual path and : translate them into an os dependent form. entry Dual string :Dual path (forward slashes) to extract the node :and disk. Upon exit, these fields are removed. exit Index word, &Index past the end of the prefix in Dual Prefix string :Os prefix (tame; trailing forward slash) precondition Is.Dual.Lead( byte{ Dual }) &Invalid lead path character. fault Dual . : Prefix = { (['-'] ('.'* ['/']))* | {A-Z | a-z} ':' } :............................................................................... : method OS.TO.DUAL.PROMPT: Convert an os specific path to a prompt path. entry Os string :Raw OS path name (forward slashes) :Ends in / if a directory. exit Dual string :Dual path (mixed; path.slash; trail slash if Os does) :Paths with spaces are quoted with prefered slashes. : :............................................................................... : method TRIM.UP.PREFIX: Remove trailing components from a prefix. change Prefix string :Path to trim (tame, forward slash, trailing slash) entry Remove parcel :Number of components to remove : :............................................................................... : function IS.DUAL.LEAD: Determine if an ascii character is alphanumeric. entry C byte :A character to test exit Result Bit :Set if: A-Z a-z $ 0-9 _ . * ? / \ - + ! " ' ` : :............................................................................... : function IS.DUAL.IN: Determine if an ascii character is inside a Dual path. entry C byte :Character to test exit Pass Bit :Set if a lead character plus: ` % @ ^ | # ~ : :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: : sequence WILD.PATH: Get a series of absolute path names. entry Wild string :Dual path (wild; any slash; double quotes only). :End in slash to match to directories only; : otherwise files or directories will match. :Forward or backslashes are okay. exit Tame string :OS path name (no wildcards) : Full path name if above the current directory or : relative to the current directory. : The path has only forward slashes. : Directories have a trailing slash. : Program files have a trailing backslash. :............................................................................... : function IS.SINGLE..Wild.Path: See if multiple paths matched. entry ~Wild.Path :Iterator exit Single Bit :Set if only one element matches. : :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: : sequence WILD.FILE: Find files that match a pattern. entry Wild string :Dual path(s) to find :Wild; Forward or backward slashes; Double quotes only exit Tame string :Relative tame file path (forward slashes) : :............................................................................... : function IS.SINGLE..Wild.File: Check after the first match for a unique result. entry ~Wild.File :Iterator exit Single Bit :Set if only one element matches. : :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: : sequence WILD.DIRECTORY: Find directories that match a pattern. entry Wild string :Dual directory path(s) to find :Wild; forward or backward slashes; double quotes only exit Tame string :Relative tame directory OS path :Forward slashes, trailing slash : :............................................................................... : function IS.SINGLE..Wild.Directory: Check after the first match for a unique result. entry ~Wild.Directory :Iterator exit Single Bit :Set if only one element matches. : :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: : sequence WILD.TEXT: Find text files whose names match a pattern. entry Wild string :Dual text file path(s) to find :Wild; forward or backward slashes; double quotes only exit Tame string :Relative tame file path (forward slashes) : :............................................................................... : function IS.SINGLE..Wild.Text: Check after the first match for a unique result. entry ~Wild.Text :Iterator exit Single Bit :Set if only one element matches. : :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: : sequence WILD.EXECUTABLE: Find program files that match a pattern. entry Wild string :Dual file path(s) to find :Wild; forward or backward slashes; double quotes only exit Tame string :Relative tame file path (forward slashes) : :............................................................................... : function IS.SINGLE..Wild.Executable: Check after the first match for a unique result. entry ~Wild.Executable :Iterator exit Single Bit :Set if only one element matches. : :............................................................................... ::::::::::::::::::::::: program/dual/directory/Find.Path ::::::::::::::::::::: : method OPEN..Find.Path: Begin retrieving a series of absolute path names. change Find.Path :Initialize the search state. entry Dual string :Dual path (wild; any slash; double quotes only) :End in slash to match to directories only; : otherwise files or directories will match. :Forward or backslashes are okay. exit Lead = "" string, &Null if no matching directory paths, or & the only OS directory to match (Single = 1), & or first OS directory path (Single = 0). & (trailing forward slash; actual case). Single = 0 Bit :0 - Several matching path elements. :1 - A single directory is scanned (or none). : :............................................................................... : method CLOSE..Find.Path pure: Terminate an incomplete directory scan. change Find.Path :Close the search state. : :............................................................................... : method NEXT..Find.Path: Retrieve next full os path name in a series of multiples. : Call Open.Multi first and Lead must be non-null. change Find.Path :Update the search state. exit Path string, &OS path (no wildcards) or "" (Element = None) &Full path name if above the current directory &or relative to the current directory &(forward slashes; no trailing slash). & Element Directory.Member :None (Os = ""), Diretory, Executable, or File : :............................................................................... : method MATCH: Match a relative path to the tail. change Find.Path :Update the search state. entry Path string :Os path name (relative; tame) exit Element Directory.Member, &0 (if no match), File, or Directory Size cell :File size : :............................................................................... : method OPEN.DI..Find.Path: Access a path for the Directory command. change Find.Path :Update the search state. entry Dual string :Dual path name (may be wild) exit Lead string, :Lead path component Single Bit :Set if a single match. : :............................................................................... : method NEXT.DI..Find.Path: Retrieve next path name is a series of multiples. change Find.Path :Update the search state. entry Hidden = 0 Bit :1 - Include hidden files. exit Path string, &Os path name (relative; tame) Attribute :Attribute of the component : : The sequence returned is: : ( Relative directory, Head ) : ( Element, {File | Directory | Executable} )* : ( "", None ) :............................................................................... : method MATCH.WILD: Match an absolute string against a wild string. entry Tame string, &Absolute string (no wildcards, no nulls) Wild string, &Wild string (no auto-star nor trailing tick) & Quote literals and case sensitive characters. & Either single or double quotes may be used. & * - Match 0 or more characters. & ? - Match a single character. & ! - Match none or 1 character. & # - Match a single decimal digit. & Non-printable characters may be matched. Case = 0 Bit :1 - for case sensitive matching. exit Match Bit, &1 - An exact match. Partial word :Number of tame characters that matched all wilds. : :............................................................................... : method NEXT.COMPONENT: Parse the next component in a Dual path (left to right). entry Dual string :A Dual path (may contain wildcards, forward slash) change Index word :Current position in the Dual path exit Name string, &The next component (may have wildcards). Dot parcel :Number of dots only; 0 if none. : :............................................................................... : method PATH.TAIL: Finds the start of the last component in a Dual path. : If the path ends in a slash, the last component will : precede it. entry Dual string :Dual or Os path (forward slashes; wild) change Index word : In - Past prefix :Out - Index to the first character of the last component exit Tail string :Text from the index on; Null if Dual is all prefix. : :............................................................................... : method PATH.ELEMENT: Determine if a path is a directory, file, or executable. entry Path string :Os path name (relative; tame) exit Element Directory.Member, &Executable, File, or Directory Size cell :File size : :............................................................................... : method DUAL.TAIL: Finds the last component in a Dual path. entry Dual string :A Dual or Os path (forward slashes; wildcards). exit Tail string :Has leading slash. Null if all prefix. : : If the path ends in a slash, the last component will precede it. :............................................................................... : : function UNQUOTE.LEAD.DUAL: Unquote drives and lead slashes (make them forward) entry Dual string :Dual path name (may be wild) exit Path string :Unquoted path : :............................................................................... : method SINGLE.PATH: Convert a wild path to a single file. entry Wild string :Wild Dual path to search exit Path string, &The first tame OS path to match (forward slashes) &Directories have a trailing forward slash. &Empty if no match. More Bit :Set if many; clear if none or one match. : :............................................................................... end