Artifact
50cddefa11fac37014e807e3bd067987fa0def05:
0000: 23 20 73 74 72 74 6f 6e 75 6d 20 2d 2d 2d 20 63 # strtonum --- c
0010: 6f 6e 76 65 72 74 20 73 74 72 69 6e 67 20 74 6f onvert string to
0020: 20 6e 75 6d 62 65 72 0a 0a 23 0a 23 20 41 72 6e number..#.# Arn
0030: 6f 6c 64 20 52 6f 62 62 69 6e 73 2c 20 61 72 6e old Robbins, arn
0040: 6f 6c 64 40 73 6b 65 65 76 65 2e 63 6f 6d 2c 20 old@skeeve.com,
0050: 50 75 62 6c 69 63 20 44 6f 6d 61 69 6e 0a 23 20 Public Domain.#
0060: 46 65 62 72 75 61 72 79 2c 20 32 30 30 34 0a 0a February, 2004..
0070: 66 75 6e 63 74 69 6f 6e 20 6d 79 73 74 72 74 6f function mystrto
0080: 6e 75 6d 28 73 74 72 2c 20 20 20 20 20 20 20 20 num(str,
0090: 72 65 74 2c 20 63 68 61 72 73 2c 20 6e 2c 20 69 ret, chars, n, i
00a0: 2c 20 6b 2c 20 63 29 0a 7b 0a 20 20 20 20 69 66 , k, c).{. if
00b0: 20 28 73 74 72 20 7e 20 2f 5e 30 5b 30 2d 37 5d (str ~ /^0[0-7]
00c0: 2a 24 2f 29 20 7b 0a 20 20 20 20 20 20 20 20 23 *$/) {. #
00d0: 20 6f 63 74 61 6c 0a 20 20 20 20 20 20 20 20 6e octal. n
00e0: 20 3d 20 6c 65 6e 67 74 68 28 73 74 72 29 0a 20 = length(str).
00f0: 20 20 20 20 20 20 20 72 65 74 20 3d 20 30 0a 20 ret = 0.
0100: 20 20 20 20 20 20 20 66 6f 72 20 28 69 20 3d 20 for (i =
0110: 31 3b 20 69 20 3c 3d 20 6e 3b 20 69 2b 2b 29 20 1; i <= n; i++)
0120: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 20 {. c
0130: 3d 20 73 75 62 73 74 72 28 73 74 72 2c 20 69 2c = substr(str, i,
0140: 20 31 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 1).
0150: 69 66 20 28 28 6b 20 3d 20 69 6e 64 65 78 28 22 if ((k = index("
0160: 30 31 32 33 34 35 36 37 22 2c 20 63 29 29 20 3e 01234567", c)) >
0170: 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 0).
0180: 20 20 20 20 6b 2d 2d 20 23 20 61 64 6a 75 73 74 k-- # adjust
0190: 20 66 6f 72 20 31 2d 62 61 73 69 6e 67 20 69 6e for 1-basing in
01a0: 20 61 77 6b 0a 0a 20 20 20 20 20 20 20 20 20 20 awk..
01b0: 20 20 72 65 74 20 3d 20 72 65 74 20 2a 20 38 20 ret = ret * 8
01c0: 2b 20 6b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 + k. }.
01d0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 } else if (str
01e0: 20 7e 20 2f 5e 30 5b 78 58 5d 5b 30 2d 39 61 2d ~ /^0[xX][0-9a-
01f0: 66 41 2d 66 5d 2b 2f 29 20 7b 0a 20 20 20 20 20 fA-f]+/) {.
0200: 20 20 20 23 20 68 65 78 61 64 65 63 69 6d 61 6c # hexadecimal
0210: 0a 20 20 20 20 20 20 20 20 73 74 72 20 3d 20 73 . str = s
0220: 75 62 73 74 72 28 73 74 72 2c 20 33 29 20 20 20 ubstr(str, 3)
0230: 20 23 20 6c 6f 70 20 6f 66 66 20 6c 65 61 64 69 # lop off leadi
0240: 6e 67 20 30 78 0a 20 20 20 20 20 20 20 20 6e 20 ng 0x. n
0250: 3d 20 6c 65 6e 67 74 68 28 73 74 72 29 0a 20 20 = length(str).
0260: 20 20 20 20 20 20 72 65 74 20 3d 20 30 0a 20 20 ret = 0.
0270: 20 20 20 20 20 20 66 6f 72 20 28 69 20 3d 20 31 for (i = 1
0280: 3b 20 69 20 3c 3d 20 6e 3b 20 69 2b 2b 29 20 7b ; i <= n; i++) {
0290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d . c =
02a0: 20 73 75 62 73 74 72 28 73 74 72 2c 20 69 2c 20 substr(str, i,
02b0: 31 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 1). c
02c0: 20 3d 20 74 6f 6c 6f 77 65 72 28 63 29 0a 20 20 = tolower(c).
02d0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 28 6b if ((k
02e0: 20 3d 20 69 6e 64 65 78 28 22 30 31 32 33 34 35 = index("012345
02f0: 36 37 38 39 22 2c 20 63 29 29 20 3e 20 30 29 0a 6789", c)) > 0).
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0310: 6b 2d 2d 20 23 20 61 64 6a 75 73 74 20 66 6f 72 k-- # adjust for
0320: 20 31 2d 62 61 73 69 6e 67 20 69 6e 20 61 77 6b 1-basing in awk
0330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 . els
0340: 65 20 69 66 20 28 28 6b 20 3d 20 69 6e 64 65 78 e if ((k = index
0350: 28 22 61 62 63 64 65 66 22 2c 20 63 29 29 20 3e ("abcdef", c)) >
0360: 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 0).
0370: 20 20 20 20 6b 20 2b 3d 20 39 0a 0a 20 20 20 20 k += 9..
0380: 20 20 20 20 20 20 20 20 72 65 74 20 3d 20 72 65 ret = re
0390: 74 20 2a 20 31 36 20 2b 20 6b 0a 20 20 20 20 20 t * 16 + k.
03a0: 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 }. } else
03b0: 69 66 20 28 73 74 72 20 7e 20 2f 5e 5b 2d 2b 5d if (str ~ /^[-+]
03c0: 3f 28 5b 30 2d 39 5d 2b 28 5b 2e 5d 5b 30 2d 39 ?([0-9]+([.][0-9
03d0: 5d 2a 28 5b 45 65 5d 5b 30 2d 39 5d 2b 29 3f 29 ]*([Ee][0-9]+)?)
03e0: 3f 7c 28 5b 2e 5d 5b 30 2d 39 5d 2b 28 5b 45 65 ?|([.][0-9]+([Ee
03f0: 5d 5b 2d 2b 5d 3f 5b 30 2d 39 5d 2b 29 3f 29 29 ][-+]?[0-9]+)?))
0400: 24 2f 29 20 7b 0a 20 20 20 20 20 20 20 20 23 20 $/) {. #
0410: 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2c 20 decimal number,
0420: 70 6f 73 73 69 62 6c 79 20 66 6c 6f 61 74 69 6e possibly floatin
0430: 67 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 20 20 g point.
0440: 72 65 74 20 3d 20 73 74 72 20 2b 20 30 0a 20 20 ret = str + 0.
0450: 20 20 7d 20 65 6c 73 65 0a 20 20 20 20 20 20 20 } else.
0460: 20 72 65 74 20 3d 20 22 4e 4f 54 2d 41 2d 4e 55 ret = "NOT-A-NU
0470: 4d 42 45 52 22 0a 0a 20 20 20 20 72 65 74 75 72 MBER".. retur
0480: 6e 20 72 65 74 0a 7d 0a 0a 2f 5e 45 6e 64 20 6f n ret.}../^End o
0490: 66 20 73 65 61 72 63 68 20 6c 69 73 74 2f 7b 0a f search list/{.
04a0: 09 69 6e 5f 73 65 61 72 63 68 70 61 74 68 20 3d .in_searchpath =
04b0: 20 30 3b 0a 7d 0a 0a 28 69 6e 5f 73 65 61 72 63 0;.}..(in_searc
04c0: 68 70 61 74 68 20 3d 3d 20 31 29 7b 0a 09 73 65 hpath == 1){..se
04d0: 61 72 63 68 70 61 74 68 20 3d 20 24 30 3b 0a 09 archpath = $0;..
04e0: 73 75 62 28 2f 5e 20 20 2a 2f 2c 20 22 22 2c 20 sub(/^ */, "",
04f0: 73 65 61 72 63 68 70 61 74 68 29 3b 0a 09 73 75 searchpath);..su
0500: 62 28 2f 20 20 2a 24 2f 2c 20 22 22 2c 20 73 65 b(/ *$/, "", se
0510: 61 72 63 68 70 61 74 68 29 3b 0a 0a 09 73 65 61 archpath);...sea
0520: 72 63 68 70 61 74 68 73 5b 73 65 61 72 63 68 69 rchpaths[searchi
0530: 64 78 5d 20 3d 20 73 65 61 72 63 68 70 61 74 68 dx] = searchpath
0540: 20 22 2f 22 3b 0a 09 73 65 61 72 63 68 69 64 78 "/";..searchidx
0550: 2b 2b 3b 0a 7d 0a 0a 2f 23 69 6e 63 6c 75 64 65 ++;.}../#include
0560: 20 3c 5c 2e 5c 2e 5c 2e 3e 20 73 65 61 72 63 68 <\.\.\.> search
0570: 20 73 74 61 72 74 73 20 68 65 72 65 3a 2f 7b 0a starts here:/{.
0580: 09 69 6e 5f 73 65 61 72 63 68 70 61 74 68 20 3d .in_searchpath =
0590: 20 31 3b 0a 09 73 65 61 72 63 68 69 64 78 20 3d 1;..searchidx =
05a0: 20 30 3b 0a 7d 0a 0a 2f 5e 23 20 5b 30 2d 39 5d 0;.}../^# [0-9]
05b0: 5b 30 2d 39 5d 2a 20 2f 7b 0a 09 66 69 6c 65 20 [0-9]* /{..file
05c0: 3d 20 24 33 3b 0a 0a 09 73 75 62 28 2f 5e 22 2f = $3;...sub(/^"/
05d0: 2c 20 22 22 2c 20 66 69 6c 65 29 3b 0a 09 73 75 , "", file);..su
05e0: 62 28 2f 22 24 2f 2c 20 22 22 2c 20 66 69 6c 65 b(/"$/, "", file
05f0: 29 3b 0a 0a 09 69 66 20 28 66 69 6c 65 20 7e 20 );...if (file ~
0600: 2f 3c 2f 29 20 7b 0a 09 09 6e 65 78 74 3b 0a 09 /</) {...next;..
0610: 7d 0a 0a 09 69 66 20 28 66 69 6c 65 20 21 7e 20 }...if (file !~
0620: 2f 5c 2e 68 24 2f 29 20 7b 0a 09 09 6e 65 78 74 /\.h$/) {...next
0630: 3b 0a 09 7d 0a 0a 09 64 65 73 74 66 69 6c 65 20 ;..}...destfile
0640: 3d 20 66 69 6c 65 3b 0a 09 6c 6f 6e 67 65 73 74 = file;..longest
0650: 6d 61 74 63 68 6c 65 6e 20 3d 20 2d 31 3b 0a 09 matchlen = -1;..
0660: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 for (idx = 0; id
0670: 78 20 3c 20 73 65 61 72 63 68 69 64 78 3b 20 69 x < searchidx; i
0680: 64 78 2b 2b 29 20 7b 0a 09 09 6c 65 6e 20 3d 20 dx++) {...len =
0690: 6c 65 6e 67 74 68 28 73 65 61 72 63 68 70 61 74 length(searchpat
06a0: 68 73 5b 69 64 78 5d 29 3b 0a 09 09 69 66 20 28 hs[idx]);...if (
06b0: 73 75 62 73 74 72 28 64 65 73 74 66 69 6c 65 2c substr(destfile,
06c0: 20 31 2c 20 6c 65 6e 29 20 3d 3d 20 73 65 61 72 1, len) == sear
06d0: 63 68 70 61 74 68 73 5b 69 64 78 5d 29 20 7b 0a chpaths[idx]) {.
06e0: 09 09 09 69 66 20 28 6c 65 6e 20 3e 20 6c 6f 6e ...if (len > lon
06f0: 67 65 73 74 6d 61 74 63 68 6c 65 6e 29 20 7b 0a gestmatchlen) {.
0700: 09 09 09 09 6c 6f 6e 67 65 73 74 6d 61 74 63 68 ....longestmatch
0710: 69 64 78 20 3d 20 69 64 78 3b 0a 09 09 09 09 6c idx = idx;.....l
0720: 6f 6e 67 65 73 74 6d 61 74 63 68 6c 65 6e 20 3d ongestmatchlen =
0730: 20 6c 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 len;....}...}..
0740: 7d 0a 0a 09 77 68 69 6c 65 28 73 75 62 28 2f 5c }...while(sub(/\
0750: 2f 5c 2f 2a 5b 5e 5c 2f 5d 2a 5c 2f 5c 2e 5c 2e /\/*[^\/]*\/\.\.
0760: 5c 2f 5c 2f 2a 2f 2c 20 22 2f 22 2c 20 66 69 6c \/\/*/, "/", fil
0770: 65 29 29 20 7b 7d 0a 0a 09 69 66 20 28 6c 6f 6e e)) {}...if (lon
0780: 67 65 73 74 6d 61 74 63 68 6c 65 6e 20 3e 20 30 gestmatchlen > 0
0790: 29 20 7b 0a 09 09 69 64 78 20 3d 20 6c 6f 6e 67 ) {...idx = long
07a0: 65 73 74 6d 61 74 63 68 69 64 78 3b 0a 0a 09 09 estmatchidx;....
07b0: 64 65 73 74 66 69 6c 65 20 3d 20 73 75 62 73 74 destfile = subst
07c0: 72 28 64 65 73 74 66 69 6c 65 2c 20 6c 6f 6e 67 r(destfile, long
07d0: 65 73 74 6d 61 74 63 68 6c 65 6e 20 2b 20 31 29 estmatchlen + 1)
07e0: 3b 0a 0a 09 09 77 68 69 6c 65 28 73 75 62 28 2f ;....while(sub(/
07f0: 5c 2f 5c 2f 2a 5b 5e 5c 2f 5d 2a 5c 2f 5c 2e 5c \/\/*[^\/]*\/\.\
0800: 2e 5c 2f 5c 2f 2a 2f 2c 20 22 2f 22 2c 20 64 65 .\/\/*/, "/", de
0810: 73 74 66 69 6c 65 29 29 20 7b 7d 0a 09 7d 20 65 stfile)) {}..} e
0820: 6c 73 65 20 7b 0a 09 09 77 68 69 6c 65 28 73 75 lse {...while(su
0830: 62 28 2f 5c 2f 5c 2f 2a 5b 5e 5c 2f 5d 2a 5c 2f b(/\/\/*[^\/]*\/
0840: 5c 2e 5c 2e 5c 2f 5c 2f 2a 2f 2c 20 22 2f 22 2c \.\.\/\/*/, "/",
0850: 20 64 65 73 74 66 69 6c 65 29 29 20 7b 7d 0a 0a destfile)) {}..
0860: 09 09 69 66 20 28 21 73 75 62 28 2f 5e 2e 2a 5c ..if (!sub(/^.*\
0870: 2f 69 6e 63 6c 75 64 65 5c 2f 2f 2c 20 22 22 2c /include\//, "",
0880: 20 64 65 73 74 66 69 6c 65 29 29 20 7b 0a 09 09 destfile)) {...
0890: 09 6e 65 78 74 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 .next;...}..}...
08a0: 63 6f 70 79 5b 66 69 6c 65 2c 69 64 78 5d 20 3d copy[file,idx] =
08b0: 20 64 65 73 74 66 69 6c 65 3b 0a 7d 0a 0a 45 4e destfile;.}..EN
08c0: 44 7b 0a 09 66 6f 72 20 28 6b 65 79 20 69 6e 20 D{..for (key in
08d0: 63 6f 70 79 29 20 7b 0a 09 09 73 70 6c 69 74 28 copy) {...split(
08e0: 6b 65 79 2c 20 70 61 72 74 73 2c 20 53 55 42 53 key, parts, SUBS
08f0: 45 50 29 3b 0a 0a 09 09 73 72 63 20 3d 20 70 61 EP);....src = pa
0900: 72 74 73 5b 31 5d 3b 0a 09 09 69 64 78 20 3d 20 rts[1];...idx =
0910: 6d 79 73 74 72 74 6f 6e 75 6d 28 70 61 72 74 73 mystrtonum(parts
0920: 5b 32 5d 29 3b 0a 09 09 64 65 73 74 20 3d 20 63 [2]);...dest = c
0930: 6f 70 79 5b 6b 65 79 5d 3b 0a 0a 09 09 64 65 73 opy[key];....des
0940: 74 63 6f 70 79 5b 64 65 73 74 2c 69 64 78 5d 20 tcopy[dest,idx]
0950: 3d 20 73 72 63 3b 0a 09 09 64 65 73 74 63 6f 70 = src;...destcop
0960: 79 66 69 6c 65 73 5b 64 65 73 74 5d 20 3d 20 31 yfiles[dest] = 1
0970: 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 64 65 73 74 ;..}...for (dest
0980: 66 69 6c 65 20 69 6e 20 64 65 73 74 63 6f 70 79 file in destcopy
0990: 66 69 6c 65 73 29 20 7b 0a 09 09 6f 75 74 69 64 files) {...outid
09a0: 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 69 64 x = 0;...for (id
09b0: 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 73 65 61 x = 0; idx < sea
09c0: 72 63 68 69 64 78 20 2b 20 31 3b 20 69 64 78 2b rchidx + 1; idx+
09d0: 2b 29 20 7b 0a 09 09 09 69 66 20 28 64 65 73 74 +) {....if (dest
09e0: 63 6f 70 79 5b 64 65 73 74 66 69 6c 65 2c 69 64 copy[destfile,id
09f0: 78 5d 29 20 7b 0a 09 09 09 09 73 72 63 66 69 6c x]) {.....srcfil
0a00: 65 20 3d 20 64 65 73 74 63 6f 70 79 5b 64 65 73 e = destcopy[des
0a10: 74 66 69 6c 65 2c 69 64 78 5d 3b 0a 09 09 09 09 tfile,idx];.....
0a20: 6e 65 77 63 6f 70 79 5b 73 72 63 66 69 6c 65 2c newcopy[srcfile,
0a30: 6f 75 74 69 64 78 5d 20 3d 20 64 65 73 74 66 69 outidx] = destfi
0a40: 6c 65 3b 0a 09 09 09 09 6f 75 74 69 64 78 2b 2b le;.....outidx++
0a50: 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 7d 0a 0a ;....}...}...}..
0a60: 09 66 6f 72 20 28 6b 65 79 20 69 6e 20 6e 65 77 .for (key in new
0a70: 63 6f 70 79 29 20 7b 0a 09 09 73 70 6c 69 74 28 copy) {...split(
0a80: 6b 65 79 2c 20 70 61 72 74 73 2c 20 53 55 42 53 key, parts, SUBS
0a90: 45 50 29 3b 0a 0a 09 09 69 66 20 28 70 61 72 74 EP);....if (part
0aa0: 73 5b 32 5d 20 3d 3d 20 22 30 22 29 20 7b 0a 09 s[2] == "0") {..
0ab0: 09 09 70 61 72 74 73 5b 32 5d 20 3d 20 22 22 3b ..parts[2] = "";
0ac0: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 70 ...} else {....p
0ad0: 61 72 74 73 5b 32 5d 20 3d 20 70 61 72 74 73 5b arts[2] = parts[
0ae0: 32 5d 20 22 2f 22 3b 0a 09 09 7d 0a 0a 09 09 70 2] "/";...}....p
0af0: 72 69 6e 74 20 70 61 72 74 73 5b 31 5d 2c 20 70 rint parts[1], p
0b00: 61 72 74 73 5b 32 5d 20 20 6e 65 77 63 6f 70 79 arts[2] newcopy
0b10: 5b 6b 65 79 5d 3b 0a 09 7d 0a 7d 0a [key];..}.}.