#!/bin/sh # This file is a part of Julia. License is MIT: https://julialang.org/license # both $1 and $2 are absolute paths beginning with / # returns relative path to $2/$target from $1/$source proc relpath { test $Argc -ge 1 && test $Argc -le 2 || return 1 global current := $(2:+"$1") global target := $(2:-"$1") test $target != . || global target := '/' global target := ""/$(target##/)"" test $current != . || global current := '/' global current := $(current:="/") global current := ""/$(current##/)"" global appendix := $(target##/) global relative := '''' while appendix="${target#"$current"/}" [ "$current" != '/' ] && [ "$appendix" = "$target" ]; { if test $current = $appendix { global relative := $(relative:-.) echo $(relative#/) return 0 } global current := $(current%/*) global relative := ""$relative$(relative:+/).."" } global relative := ""$relative$(relative:+${appendix:+/})$(appendix#/)"" echo $relative } relpath @Argv (CommandList children: [ (FuncDef name: relpath body: (BraceGroup children: [ (AndOr children: [ (C {(Lit_Other "[")} {($ VSub_Pound "$#")} {(-ge)} {(1)} {(Lit_Other "]")}) (AndOr children: [ (C {(Lit_Other "[")} {($ VSub_Pound "$#")} {(-le)} {(2)} {(Lit_Other "]")}) (ControlFlow token: arg_word:{(1)}) ] op_id: Op_DPipe ) ] op_id: Op_DAmp ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:current) op: Equal rhs: { (DQ (BracedVarSub token: suffix_op: (StringUnary op_id: VTest_ColonPlus arg_word: {(DQ ($ VSub_Number "$1"))} ) spids: [53 59] ) ) } spids: [51] ) ] spids: [51] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:target) op: Equal rhs: { (DQ (BracedVarSub token: suffix_op: (StringUnary op_id: VTest_ColonHyphen arg_word: {(DQ ($ VSub_Number "$1"))} ) spids: [65 71] ) ) } spids: [63] ) ] spids: [63] ) (AndOr children: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$target"))} {(KW_Bang "!") (Lit_Other "=")} {(.)} {(Lit_Other "]")} ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:target) op:Equal rhs:{(/)} spids:[90])] spids: [90] ) ] op_id: Op_DPipe ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:target) op: Equal rhs: { (DQ (/) (BracedVarSub token: suffix_op: (StringUnary op_id:VOp1_DPound arg_word:{(Lit_Slash /)}) spids: [97 101] ) ) } spids: [94] ) ] spids: [94] ) (AndOr children: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$current"))} {(KW_Bang "!") (Lit_Other "=")} {(.)} {(Lit_Other "]")} ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:current) op:Equal rhs:{(/)} spids:[120])] spids: [120] ) ] op_id: Op_DPipe ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:current) op: Equal rhs: { (DQ (BracedVarSub token: suffix_op: (StringUnary op_id:VTest_ColonEquals arg_word:{(DQ (/))}) spids: [126 132] ) ) } spids: [124] ) ] spids: [124] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:current) op: Equal rhs: { (DQ (/) (BracedVarSub token: suffix_op: (StringUnary op_id:VOp1_DPound arg_word:{(Lit_Slash /)}) spids: [139 143] ) ) } spids: [136] ) ] spids: [136] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:appendix) op: Equal rhs: { (DQ (BracedVarSub token: suffix_op: (StringUnary op_id:VOp1_DPound arg_word:{(Lit_Slash /)}) spids: [149 153] ) ) } spids: [147] ) ] spids: [147] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:relative) op:Equal rhs:{(SQ )} spids:[157])] spids: [157] ) (While cond: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:appendix) op: Equal rhs: { (DQ (BracedVarSub token: suffix_op: (StringUnary op_id: VOp1_Pound arg_word: {(DQ ($ VSub_Name "$current")) (Lit_Slash /)} ) spids: [166 173] ) ) } spids: [164] ) ] spids: [164] ) (Sentence child: (AndOr children: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$current"))} {(KW_Bang "!") (Lit_Other "=")} {(SQ )} {(Lit_Other "]")} ) (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$appendix"))} {(Lit_Other "=")} {(DQ ($ VSub_Name "$target"))} {(Lit_Other "]")} ) ] op_id: Op_DAmp ) terminator: ) ] body: (DoGroup children: [ (If arms: [ (if_arm cond: [ (Sentence child: (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$current"))} {(Lit_Other "=")} {(DQ ($ VSub_Name "$appendix"))} {(Lit_Other "]")} ) terminator: ) ] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:relative) op: Equal rhs: { (DQ (BracedVarSub token: suffix_op: (StringUnary op_id: VTest_ColonHyphen arg_word: {(.)} ) spids: [234 238] ) ) } spids: [232] ) ] spids: [232] ) (C {(echo)} { (DQ (BracedVarSub token: suffix_op: (StringUnary op_id:VOp1_Pound arg_word:{(Lit_Slash /)}) spids: [245 249] ) ) } ) (ControlFlow token: arg_word: {(0)} ) ] spids: [-1 229] ) ] spids: [-1 258] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:current) op: Equal rhs: { (DQ (BracedVarSub token: suffix_op: (StringUnary op_id: VOp1_Percent arg_word: {(Lit_Slash /) ("*")} ) spids: [263 268] ) ) } spids: [261] ) ] spids: [261] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:relative) op: Equal rhs: { (DQ ($ VSub_Name "$relative") (BracedVarSub token: suffix_op: (StringUnary op_id: VTest_ColonPlus arg_word: {(Lit_Slash /)} ) spids: [275 279] ) (..) ) } spids: [272] ) ] spids: [272] ) ] spids: [209 284] ) ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:relative) op: Equal rhs: { (DQ ($ VSub_Name "$relative") (BracedVarSub token: suffix_op: (StringUnary op_id: VTest_ColonPlus arg_word: { (BracedVarSub token: suffix_op: (StringUnary op_id: VTest_ColonPlus arg_word: {(Lit_Slash /)} ) spids: [293 297] ) } ) spids: [290 298] ) (BracedVarSub token: suffix_op: (StringUnary op_id:VOp1_Pound arg_word:{(Lit_Slash /)}) spids: [299 303] ) ) } spids: [287] ) ] spids: [287] ) (C {(echo)} {(DQ ($ VSub_Name "$relative"))}) ] spids: [19] ) spids: [14 18] ) (C {(relpath)} {(DQ ($ VSub_At "$@"))}) ] )