Removed /usr/local from CDPATH
[clearscm.git] / functions / date64
1 #!/bin/ksh
2 ################################################################################
3 #
4 # File:         date64
5 # Description:  Routines to handle the odd date arithmetic for the passwd(4)
6 #               file.
7 # Author:       Andrew@DeFaria.com
8 # Created:      Thu Oct 14 14:40:31 PDT 1999
9 # Language:     Korn Shell
10 #
11 # (c) Copyright 2001, Andrew@DeFaria.com, all rights reserved
12 #
13 ################################################################################
14 # Set me to command name
15 me=$(basename $0)
16
17 # Set adm_base
18 adm_base=${adm_base:-$HOME/adm}
19
20 # Set adm_fpath
21 adm_fpath=${adm_fpath:-$adm_base/functions}
22
23 # Source functions
24 . $adm_fpath/common
25
26 # Globals
27 # Set up a the character map/base64 arrays for conversion
28 base=64
29 let index=00; character[$index]="."; let base64[$index]=$base*$index
30 let index=01; character[$index]="/"; let base64[$index]=$base*$index
31 let index=02; character[$index]="0"; let base64[$index]=$base*$index
32 let index=03; character[$index]="1"; let base64[$index]=$base*$index
33 let index=04; character[$index]="2"; let base64[$index]=$base*$index
34 let index=05; character[$index]="3"; let base64[$index]=$base*$index
35 let index=06; character[$index]="4"; let base64[$index]=$base*$index
36 let index=07; character[$index]="5"; let base64[$index]=$base*$index
37 let index=08; character[$index]="6"; let base64[$index]=$base*$index
38 let index=09; character[$index]="7"; let base64[$index]=$base*$index
39 let index=10; character[$index]="8"; let base64[$index]=$base*$index
40 let index=11; character[$index]="9"; let base64[$index]=$base*$index
41 let index=12; character[$index]="A"; let base64[$index]=$base*$index
42 let index=13; character[$index]="B"; let base64[$index]=$base*$index
43 let index=14; character[$index]="C"; let base64[$index]=$base*$index
44 let index=15; character[$index]="D"; let base64[$index]=$base*$index
45 let index=16; character[$index]="E"; let base64[$index]=$base*$index
46 let index=17; character[$index]="F"; let base64[$index]=$base*$index
47 let index=18; character[$index]="G"; let base64[$index]=$base*$index
48 let index=19; character[$index]="H"; let base64[$index]=$base*$index
49 let index=20; character[$index]="I"; let base64[$index]=$base*$index
50 let index=21; character[$index]="J"; let base64[$index]=$base*$index
51 let index=22; character[$index]="K"; let base64[$index]=$base*$index
52 let index=23; character[$index]="L"; let base64[$index]=$base*$index
53 let index=24; character[$index]="M"; let base64[$index]=$base*$index
54 let index=25; character[$index]="N"; let base64[$index]=$base*$index
55 let index=26; character[$index]="O"; let base64[$index]=$base*$index
56 let index=27; character[$index]="P"; let base64[$index]=$base*$index
57 let index=28; character[$index]="Q"; let base64[$index]=$base*$index
58 let index=29; character[$index]="R"; let base64[$index]=$base*$index
59 let index=30; character[$index]="S"; let base64[$index]=$base*$index
60 let index=31; character[$index]="T"; let base64[$index]=$base*$index
61 let index=32; character[$index]="U"; let base64[$index]=$base*$index
62 let index=33; character[$index]="V"; let base64[$index]=$base*$index
63 let index=34; character[$index]="W"; let base64[$index]=$base*$index
64 let index=35; character[$index]="X"; let base64[$index]=$base*$index
65 let index=36; character[$index]="Y"; let base64[$index]=$base*$index
66 let index=37; character[$index]="Z"; let base64[$index]=$base*$index
67 let index=38; character[$index]="a"; let base64[$index]=$base*$index
68 let index=39; character[$index]="b"; let base64[$index]=$base*$index
69 let index=40; character[$index]="c"; let base64[$index]=$base*$index
70 let index=41; character[$index]="d"; let base64[$index]=$base*$index
71 let index=42; character[$index]="e"; let base64[$index]=$base*$index
72 let index=43; character[$index]="f"; let base64[$index]=$base*$index
73 let index=44; character[$index]="g"; let base64[$index]=$base*$index
74 let index=45; character[$index]="h"; let base64[$index]=$base*$index
75 let index=46; character[$index]="i"; let base64[$index]=$base*$index
76 let index=47; character[$index]="j"; let base64[$index]=$base*$index
77 let index=48; character[$index]="k"; let base64[$index]=$base*$index
78 let index=49; character[$index]="l"; let base64[$index]=$base*$index
79 let index=50; character[$index]="m"; let base64[$index]=$base*$index
80 let index=51; character[$index]="n"; let base64[$index]=$base*$index
81 let index=52; character[$index]="o"; let base64[$index]=$base*$index
82 let index=53; character[$index]="p"; let base64[$index]=$base*$index
83 let index=54; character[$index]="q"; let base64[$index]=$base*$index
84 let index=55; character[$index]="r"; let base64[$index]=$base*$index
85 let index=56; character[$index]="s"; let base64[$index]=$base*$index
86 let index=57; character[$index]="t"; let base64[$index]=$base*$index
87 let index=58; character[$index]="u"; let base64[$index]=$base*$index
88 let index=59; character[$index]="v"; let base64[$index]=$base*$index
89 let index=60; character[$index]="w"; let base64[$index]=$base*$index
90 let index=61; character[$index]="x"; let base64[$index]=$base*$index
91 let index=62; character[$index]="y"; let base64[$index]=$base*$index
92 let index=63; character[$index]="z"; let base64[$index]=$base*$index
93
94 integer decimal_date=-1
95 base64_date=""
96
97 function date64_char_to_decimal {
98   debug "ENTER date64_char_to_decimal"
99   char="$1"
100   integer i=0
101
102   while [ $i -lt 64 ]; do
103     if [ "${character[i]}" = "$char" ]; then
104       break
105     fi
106     let i=i+1
107   done
108
109   if [ $i -eq 64 ]; then
110     print -u2 "$char not found!"
111     debug "RETURN -1 from date64_char_to_decimal"
112     return -1
113   else
114     debug "RETURN $i from date64_char_to_decimal"
115     return $i
116   fi
117 } # date64_char_to_decimal
118
119 function date64_to_decimal {
120   # This function accepts a 2 character "number of weeks" string as defined
121 in
122   # passwd(4) under password aging. Specifically this string represents the
123   # number of weeks since 1/1/1970 that the password was last changed. This
124   # function will convert this value to a decimal number stored in the
125 global
126   # decimal_date.
127   debug "ENTER date64_to_decimal ($1)"
128
129   # Assume failure
130   decimal_date=-1
131
132   datecode="$1"
133
134   first_char=$(print $datecode | sed 's/.$//')
135   second_char=$(print $datecode | sed 's/^.//')
136
137   date64_char_to_decimal $first_char
138   integer units_digit=$?
139   if [ $units_digit -eq 255 ]; then
140     error "Unable to translate the first_char \"$first_char\"" 0
141     debug "RETURN -1 from date64_to_decimal - invalid units digit"
142     return
143   fi
144
145   date64_char_to_decimal $second_char
146   integer tens_digit=$?
147   if [ $tens_digit -eq 255 ]; then
148     error "Unable to translate the second_char \"$second_char\"" 0
149     debug "RETURN -1 from date64_to_decimal - invalid tens digit"
150     return
151   fi
152
153   let decimal_date=tens_digit*64+units_digit
154   debug "RETURN $decimal_date from date64_to_decimal"
155 } # date64_to_decimal
156
157 function decimal_to_date64 {
158   # This function will convert a decimal number representing the number of
159   # weeks past 1/1/1970 and convert it to the odd base64 format described in
160   # passwd(4).
161   integer nbr=$1
162   debug "ENTER decimal_to_date64 ($nbr)"
163   i=63
164
165   while [ $nbr -lt ${base64[i]} ]; do
166     let i=i-1
167   done
168
169   let nbr=nbr-base64[i]
170
171   tens_digit=${character[i]}
172   units_digit=${character[nbr]}
173   base64_date="$units_digit$tens_digit"
174   debug "RETURN $base64_date from decimal_to_date64 ($nbr)"
175 } # decimal_to_date64