Código Natural/Notação posicional: mudanças entre as edições

→‎Encode e decode Nh: simplificando vbit_to_baseh() e corrigindo
(→‎Encode e decode Nh: simplificando vbit_to_baseh() e corrigindo)
Linha 378: Linha 378:
     ret text := '';
     ret text := '';
     blk varbit;
     blk varbit;
    blk_n int;
     bits_per_digit int;
     bits_per_digit int;
     tr int[] := '{ {1,2,0,0}, {1,3,4,0}, {1,3,5,6} }'::int[]; -- --4h(bits,pos), 8h(bits,pos)
     tr int[] := '{ {1,2,0,0}, {1,3,4,0}, {1,3,5,6} }'::int[]; -- --4h(bits,pos), 8h(bits,pos)
     tr_selected JSONb;
     tr_selected JSONb;
     trtypes JSONb := '{"2":[1,1], "4":[1,2], "8":[2,3], "16":[3,4]}'::JSONb; -- TrPos,bits. Can optimize? by sparse array.
     trtypes JSONb := '{"2":[1,1], "4":[1,2], "8":[2,3], "16":[3,4]}'::JSONb;
     trpos int;
     trpos int;
     baseh "char"[] := array[ -- the standards for Baseh:
     baseh "char"[] := array[ -- the standards for Baseh:
Linha 395: Linha 394:
BEGIN
BEGIN
   vlen := bit_length(p_val);
   vlen := bit_length(p_val);
   tr_selected := trtypes->(p_base::text);  -- can be array instead of JSON
   tr_selected := trtypes->(p_base::text);
  IF p_val IS NULL OR tr_selected IS NULL OR vlen=0 THEN
    RETURN NULL; -- or  p_retnull;
  END IF;
   IF p_base=2 THEN
   IF p_base=2 THEN
     RETURN $1::text; --- direct bit string as string
     RETURN $1::text; -- bit string as string
   END IF;
   END IF;
   bits_per_digit := (tr_selected->>1)::int;
   bits_per_digit := (tr_selected->>1)::int;
  blk_n := vlen/bits_per_digit;
   pos0  := (tr_selected->>0)::int;
   pos0  := (tr_selected->>0)::int;
   trpos := tr[pos0][bits_per_digit];
   trpos := tr[pos0][bits_per_digit];
   FOR counter IN 1..blk_n LOOP
   FOR counter IN 1..(vlen/bits_per_digit) LOOP
       blk := substring(p_val FROM 1 FOR bits_per_digit);
       blk := substring(p_val FROM 1 FOR bits_per_digit);
       ret := ret || baseh[trpos][ varbit_to_int(blk,bits_per_digit) ];
       ret := ret || baseh[trpos][ varbit_to_int(blk,bits_per_digit) ];
       p_val := substring(p_val FROM bits_per_digit+1); -- same as p_val<<(bits_per_digit*blk_n)
       p_val := substring(p_val FROM bits_per_digit+1);
   END LOOP;
   END LOOP;
   vlen := bit_length(p_val);
   vlen := bit_length(p_val);
   IF p_val!=b'' THEN -- vlen % bits_per_digit>0
   IF p_val!=b'' THEN
     trpos := tr[pos0][vlen];
     trpos := tr[pos0][vlen];
     ret := ret || baseh[trpos][ varbit_to_int(p_val,vlen) ];
     ret := ret || baseh[trpos][ varbit_to_int(p_val,vlen) ];
Linha 426: Linha 421:
CREATE FUNCTION natcod.baseh_to_vbit(
CREATE FUNCTION natcod.baseh_to_vbit(
   p_val text,  -- input (enforced lower case)
   p_val text,  -- input (enforced lower case)
   p_base int DEFAULT 4 -- selecting base2h, base4h, base8h, or base16h.
   p_base int DEFAULT 16 -- selecting base2h, base4h, base8h, or base16h.
) RETURNS varbit AS $f$
) RETURNS varbit AS $f$
DECLARE
DECLARE
   tr_hdig jsonb := '{
   tr_hdig jsonb := '{
     "g":[1,0],"q":[1,1],
     "G":[1,0],"Q":[1,1],
     "h":[2,0],"m":[2,1],"r":[2,2],"v":[2,3],
     "H":[2,0],"M":[2,1],"R":[2,2],"V":[2,3],
     "j":[3,0],"k":[3,1],"n":[3,2],"p":[3,3],
     "J":[3,0],"K":[3,1],"N":[3,2],"P":[3,3],
     "s":[3,4],"t":[3,5],"z":[3,6],"y":[3,7]
     "S":[3,4],"T":[3,5],"Z":[3,6],"Y":[3,7]
   }'::jsonb;
   }'::jsonb;
   tr_full jsonb := '{
   tr_full jsonb := '{
Linha 446: Linha 441:
   BEGIN
   BEGIN
   ret = '';
   ret = '';
   blk := regexp_match(p_val,'^([0-9a-f]*)([ghjkmnp-tvzy])?$');
   blk := regexp_match(p_val,'^([0-9a-f]*)([GHJKMNP-TVZY])?$');
   IF blk[1] >'' THEN
   IF blk[1] >'' THEN
     FOREACH i IN ARRAY regexp_split_to_array(blk[1],'') LOOP
     FOREACH i IN ARRAY regexp_split_to_array(blk[1],'') LOOP
2 402

edições