Reversable mapping BBC <-> ZIP 32 spc -> hrd 33 ! <=> ! 34 " <=> " string 35 # <-> ? ? <-> # 36 $ <-> < < <-> $ 37 % <=> % dir 38 & <=> & dir 39 ' <=> ' 40 ( <=> ( 41 ) <=> ) 42 * <=> * wildcard 43 + <=> + 44 , <=> , 45 - <=> - 46 . <-> / 47 / <-> . 48 0-9 <=> 0-9 58 : <=> : drive 59 ; <=> ; 60 < <-> $ $ <-> < 61 = <=> = 62 > <-> ^ ^ <-> > 63 ? <-> # 64 @ <=> @ dir 65 A-Z <=> A-Z 91 [ <=> [ 92 \ <=> \ 93 [ <=> ] 94 ^ -> > > <- ^ 95 _ <=> _ 96 ` <=> ` 97 a-z <=> a-z 123 { <=> { 124 | <=> | pipe 125 } <=> } 126 ~ <=> ~ Reversable mapping BBC <- ZIP -> BBC 32 spc -> hrd 33 ! -> ! -> ! 34 " xx " xx 35 # xx # -> ? 36 $ xx $ -> < 37 % -> % -> ;~ 38 & -> & -> ;+ 39 ' -> ' -> ' 40 ( -> ( -> ( 41 ) -> ) -> ) 42 * * xx 43 + -> + -> + 44 , -> , -> , 45 - -> - -> - 46 . xx . -> / 47 / xx 47 / -> % -> ;~ 48 0-9 -> 0-9 -> 0-9 58 : xx : xx 59 ; -> ; -> ; 60 < -> $ -> < 61 = -> = -> = 62 > -> ^ -> > 63 ? -> # -> ? 64 @ -> @ -> ;= 65 A-Z -> A-Z -> A-Z 91 [ -> [ -> [ 92 \ -> \ xx 93 [ -> ] -> ] 94 ^ -> ^ -> > 95 _ -> _ -> _ 96 ` -> ` -> ` 97 a-z -> a-z -> a-z 123 { -> { -> { 124 | xx | ???? 125 } -> } -> } 126 ~ -> ~ -> ~ DOSFS translation 32 spc -> hrd 33 ! -> ! 34 " xx 35 # xx 36 $ xx 37 % -> % 38 & -> & 39 ' -> ' 40 ( -> ( 41 ) -> ) 42 * 43 + -> + 44 , -> , 45 - -> - 46 . xx 47 / -> % 48 0-9 -> 0-9 58 : xx 59 ; -> ; 60 < -> $ 61 = -> = 62 > -> ^ 63 ? -> # 64 @ -> @ 65 A-Z -> A-Z 91 [ -> [ 92 \ -> \ 93 [ -> ] 94 ^ -> ^ 95 _ -> _ 96 ` -> ` 97 a-z -> a 123 { -> { 124 | xx 125 } -> } 126 ~ -> ~ Saving on DOS/Win: 32 spc -> hrd 33 ! -> ! 34 " xxx 35 # -> ? 36 $ -> < 37 % -> ;~ 38 & -> ;+ 39 ' -> ' 40 ( -> ( 41 ) -> ) 42 filer 43 + -> + 44 , -> , 45 - -> - 46 . -> / 47 / xxx 48 0-9 -> 0-9 58 : xxx 59 ; -> ; 60 < xxx 61 = -> = 62 > xxx 63 filer 64 @ -> ;= 65 A-Z -> A-Z 91 [ -> [ 92 \ xxx 93 ] -> ] 94 ^ -> > 95 _ -> _ 96 ` -> ` 97 a-z -> a-z 123 { -> { 124_.txt.BBC 125 } -> } 126 ~ -> ~ Reversable Mapping ZIP <-> BBC BBC <-> ZIP BBC <-> ZIP spc -> hrd spc bad spc ! = ! ! = ! ! = ! " -> ~ " bad " <-> ~ # <-> ? # <-> ? bad # <-> ? bad $ -> < $ dir $ % -> ; % dir % & -> + & dir & ' = ' ' = ' ' = ' ( = ( ( = ( ( = ( ) = ) ) = ) ) = ) * -> &D7 * bad * bad + -> + + <- & <- + + , = , , = , , = , - = - - = - - = - . <-> / . <-> / . <-> / / -> . / <- . <- \ / <-> . 0-9 = 0-9 0-9 = 0-9 0-9 = 0-9 : -> ; : dir : ; -> ; ; <- % <- : <- ; ; < -> < < <- $ <- < < = -> = = <- = <- @ = > -> > > <- > <- ^ > ? <-> # ? <-> # ? <-> # @ -> = @ dir @ A-Z = A-Z A-Z = A-Z A-Z = A-Z [ = [ [ = [ [ = [ \ -> / \ \ ] = ] ] = ] ] = ] ^ -> > ^ dir ^ _ = _ _ = _ _ ` = ` ` = ` ` a-z = a-z a-z = a-z a-z = a-z { = { { = { { = { | -> &A6 | bad | } = } } = } } = } ~ -> ~ ~ <- " <- ~ ~ <-> " hrd <- spc &D7 <- * &A6 <- | UNZIP filename translations case '/': *pp = '\0'; break; /* can assume -j flag not given */ case '.': *pp++ = '/'; break; case ' ': *pp++ = 160; break; /* change spaces to hard-spaces */ case '#': *pp++ = '?'; break; /* single-char wildcard */ case '&': *pp++ = '+'; break; case '@': *pp++ = '='; break; case '%': *pp++ = ';'; break; case '$': *pp++ = '<'; break; case '^': *pp++ = '>'; break; /* parent-dir reference */ case '*': *pp++ = 0xD7; break; /* Latin-1 'multiply' */ case '"': *pp++ = '~'; break; case ':': *pp++ = ';'; break; case '\\': *pp++ = '/'; break; case '|': *pp++ = 0xA6; break; /* Latin-1 'broken bar' */ UNZIP: while ((workch = (uch)*cp++) != 0) { switch (workch) { case '/': /* can assume -j flag not given */ *pp = '\0'; if (((error = checkdir(__G__ pathcomp, APPEND_DIR)) & MPN_MASK) > MPN_INF_TRUNC) return error; pp = pathcomp; /* reset conversion buffer for next piece */ lastsemi = (char *)NULL; /* leave direct. semi-colons alone */ checkswap=NULL; /* reset checking at start of new leafname */ break; case '.': *pp++ = '/'; checkswap=pp; break; case ';': /* VMS version (or DEC-20 attrib?) */ lastsemi = pp; *pp++ = ';'; /* keep for now; remove VMS ";##" */ break; /* later, if requested */ case ' ': /* change spaces to hard-spaces */ *pp++ = 160; /* (ISO 8859-1 Latin-1 codepage) */ break; /* The following substitutions, unless stated otherwise, follow * those for DOSFS. They translate special symbols into other * characters which have no special meaning to RISC OS. */ case '#': *pp++ = '?'; break; /* single-char wildcard */ case '&': *pp++ = '+'; break; case '@': *pp++ = '='; break; case '%': *pp++ = ';'; break; case '$': *pp++ = '<'; break; case '^': *pp++ = '>'; break; /* parent-dir reference */ /* The following substitutions deal with the remaining special * symbols. ('.' is handled above.) */ case '*': *pp++ = 0xD7; break; /* Latin-1 'multiply' */ case '"': *pp++ = '~'; break; case ':': *pp++ = ';'; break; case '\\': *pp++ = '/'; break; case '|': *pp++ = 0xA6; break; /* Latin-1 'broken bar' */ default: /* allow European characters in filenames: */ if (isprint(workch) || (128 <= workch && workch <= 254)) *pp++ = (char)workch; } /* end switch */ AmigaDOS: AmigaDos filenames: device:directory/filename.exten : also means root of current device, eg :directory/filename.ext or :filename.ext etc :0.$.fred.jim/ext or :0.fred.jim/ext -> df0:fred/jim.ext $.fred.jim/ext -> :fred/jim.ext / - ^ // - ^.^ /// - ^.^.^ etc /fred.ext -> ^.fred/ext //fred.ext -> ^.^.fred/ext So, device:/path -> :device.$.^.path and as $.^ = $ it has no effect "" can be used to indicate the current directory devices can be a symbolic link to a directory, like RISC SO name$path variables