Hex Artifact Content

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];..}.}.