70 lines
3.0 KiB
Awk
70 lines
3.0 KiB
Awk
# syntax: GAWK -f UPC.AWK
|
|
BEGIN {
|
|
ls_arr[" ## #"] = 0
|
|
ls_arr[" ## #"] = 1
|
|
ls_arr[" # ##"] = 2
|
|
ls_arr[" #### #"] = 3
|
|
ls_arr[" # ##"] = 4
|
|
ls_arr[" ## #"] = 5
|
|
ls_arr[" # ####"] = 6
|
|
ls_arr[" ### ##"] = 7
|
|
ls_arr[" ## ###"] = 8
|
|
ls_arr[" # ##"] = 9
|
|
for (i in ls_arr) {
|
|
tmp = i
|
|
gsub(/#/,"x",tmp)
|
|
gsub(/ /,"#",tmp)
|
|
gsub(/x/," ",tmp)
|
|
rs_arr[tmp] = ls_arr[i]
|
|
}
|
|
split("3,1,3,1,3,1,3,1,3,1,3,1",weight_arr,",")
|
|
bc_arr[++n] = " # # # ## # ## # ## ### ## ### ## #### # # # ## ## # # ## ## ### # ## ## ### # # # "
|
|
bc_arr[++n] = " # # # ## ## # #### # # ## # ## # ## # # # ### # ### ## ## ### # # ### ### # # # "
|
|
bc_arr[++n] = " # # # # # ### # # # # # # # # # # ## # ## # ## # ## # # #### ### ## # # "
|
|
bc_arr[++n] = " # # ## ## ## ## # # # # ### # ## ## # # # ## ## # ### ## ## # # #### ## # # # "
|
|
bc_arr[++n] = " # # ### ## # ## ## ### ## # ## # # ## # # ### # ## ## # # ### # ## ## # # # "
|
|
bc_arr[++n] = " # # # # ## ## # # # # ## ## # # # # # #### # ## # #### #### # # ## # #### # # "
|
|
bc_arr[++n] = " # # # ## ## # # ## ## # ### ## ## # # # # # # # # ### # # ### # # # # # "
|
|
bc_arr[++n] = " # # # # ## ## # # ## ## ### # # # # # ### ## ## ### ## ### ### ## # ## ### ## # # "
|
|
bc_arr[++n] = " # # ### ## ## # # #### # ## # #### # #### # # # # # ### # # ### # # # ### # # # "
|
|
bc_arr[++n] = " # # # #### ## # #### # # ## ## ### #### # # # # ### # ### ### # # ### # # # ### # # "
|
|
bc_arr[++n] = " # # # #### ## # #### # # ## ## ### #### # # # # ### # ### ### # # ### # # # ### #" # NG
|
|
tmp = "123456712345671234567123456712345671234567"
|
|
printf("%2s: %-18s---%s-----%s---\n","N","UPC-A",tmp,tmp) # heading
|
|
for (i=1; i<=n; i++) {
|
|
# accept any number of spaces at beginning or end; I.E. minimum of 9 is not enforced
|
|
sub(/^ +/,"",bc_arr[i])
|
|
sub(/ +$/,"",bc_arr[i])
|
|
bc = bc_arr[i]
|
|
if (length(bc) == 95 && substr(bc,1,3) == "# #" && substr(bc,46,5) == " # # " && substr(bc,93,3) == "# #") {
|
|
upc = ""
|
|
sum = upc_build(ls_arr,1,substr(bc,4,42))
|
|
sum += upc_build(rs_arr,7,substr(bc,51,42))
|
|
if (upc ~ /^x+$/) { msg = "reversed" }
|
|
else if (upc ~ /x/) { msg = "invalid digit(s)" }
|
|
else if (sum % 10 != 0) { msg = "bad check digit" }
|
|
else { msg = upc }
|
|
}
|
|
else {
|
|
msg = "invalid format"
|
|
}
|
|
printf("%2d: %-18s%s\n",i,msg,bc)
|
|
}
|
|
exit(0)
|
|
}
|
|
function upc_build(arr,pos,bc, i,s,sum) {
|
|
pos--
|
|
for (i=1; i<=42; i+=7) {
|
|
s = substr(bc,i,7)
|
|
pos++
|
|
if (s in arr) {
|
|
upc = upc arr[s]
|
|
sum += arr[s] * weight_arr[pos]
|
|
}
|
|
else {
|
|
upc = upc "x"
|
|
}
|
|
}
|
|
return(sum)
|
|
}
|