#SRC: JCON

# test csets and character conversions

procedure main()
   local a, c, i, n, s, cs, ct, x, y

   x := 'a1b2c3'
   write("x:    ", x);
   write("*x:   ", *x)
   every writes("!x:   " | !x | "\n");
   write("?z:   ", ?'z')
   write("?empty: ", ?'', " (OOPS)")	# should fail
   write()

   kw("digits", &digits)
   kw("lcase", &lcase)
   kw("ucase", &ucase)
   kw("letters", &letters)
   write("    &ascii: ", *&ascii, " elements")
   write()

   write ("   x         y     ",
      "     x++y         y++x     x--y   y--x   x**y   y**x   ~~x")

   every x := ( 'a1b2c3' | "a1b2c3" | 1234 | 12.34 | '') &
         y := ( 'xyzabc' | "xyzabc" | 3456 | 34.56 | "@ 90") do {
	write(
	   right(image(x),8), right(image(y),9),
	   right(x++y, 13), right(y++x, 13),
	   right(x--y, 7), right(y--x, 7),
	   right(x**y, 7), right(y**x, 7),
	   right(~~x, 7))
   }

   # various tests involving chars with the sign bit set

   # test conversion of int to char (string) and back
   write()
   every i := 0 to 255 by 15 do {
      s := ""
      c := char(i)
      s ||:= c
      n := ord(c)
      cs := cset(c)
      write(right(i, 3), right(image(c), 8), right(image(s), 8), right(n, 5),
	 right(image(cs), 8))
      }

   # test more and stranger conversions 
   write()
   a := [0, 15.71, "32rU", "16r2D", "60", "8r113", "90", "105", "120", "8r207",
	"16r96", "16ra5", "16rB4", "16rc3", "16rD2", "16re1", "16rf0", "16rfF"]
   every s := !a do {
      c := char(s)
      n := ord(c)
      write(right(image(s), 8), right(image(c), 8), right(n, 5))
      }

   # test conversion of string to int and back
   write()
   a := ["\x00", "\x0F", "\x1e", "-", "<", "\113", "Z", "i", "x", "\x87",
         "\x96", "\xa5", "\xB4", "\xc3", "\xD2", "\xe1", "\xf0", "\xfF"]
   every s := !a do {
      n := ord(s)
      c := char(n)
      write(right(image(s), 6), right(n, 5), right(image(c), 8))
      }

   # test conversion of cset to string and int
   write()
   a := ['\x00', '\x0F', '\x1e', '-', '<', '\113', 'Z', 'i', 'x', '\x87',
         '\x96', '\xa5', '\xB4', '\xc3', '\xD2', '\xe1', '\xf0', '\xfF']
   every cs := !a do {
      s := string(cs)
      n := ord(cs)
      write(right(image(cs), 6), right(image(s), 8), right(n, 5))
      }
end

procedure kw(label, value)
   write(right("&" || label, 10), ": '", value, "'")
   return
end

