ASCII(애스키)란 American Standard Code for Information Interchange의 줄임글로서, 영문자에 기초한 문자 인코딩이다.  이 문자 인코딩에는 C0 제어문자(C0 control character)도 포함되어 있다.  ( 참고:  ASCII - Wikipedia, the free encyclopedia )

다음은  7bit ASCII 코드표를 만들어 보여주는 OCaml 소스 코드이다. 소스 코드 중에 진법변환에 필요한 함수

                atoi string  radix
                itoa number radix

를 OCaml 코드로 자체 작성하여 사용하였다.

(아래의 소스는 Python 소스를 F# 소스로 일대일 변환 수정하고, 또 F# 소스를 OCaml 소스로 바꾼 것이라서 명령형 언어 특징을 위주로 작성되어 있다. 그래서 함수형 언어의 관점으로 보면 사이드 이팩트가 많아 난잡하게 보이는 소스이다.)

  1. (*
  2.  *  Filename: makeAsciiTable.ml
  3.  *            Make a table of ascii codes.
  4.  *
  5.  *  Execute: ocaml makeAsciiTable.ml
  6.  *
  7.  *    Or
  8.  *
  9.  *  Compile: ocamlc -o makeAsciiTable.exe makeAsciiTable.ml
  10.  *  Execute: makeAsciiTable
  11.  *
  12.  *      Date:  20013. 1. 29.
  13.  *    Author:  pkim __AT__ scripts.pe.kr
  14.  *)
  15. open Printf;;
  16. exception RuntimeError of string
  17. exception ValueError of string
  18. let println s = printf "%s\n" s ;;
  19. let print s = printf "%s" s ;;
  20. let printUsage() =
  21.     println "Usage: makeAsciiTable" ;
  22.     println "Make a table of ascii codes." ;;
  23. let split_char sep str =
  24.   let rec indices acc i =
  25.     try
  26.       let i = succ(String.index_from str i sep) in
  27.       indices (i::acc) i
  28.     with Not_found ->
  29.       (String.length str + 1) :: acc
  30.   in
  31.   let is = indices [0] 0 in
  32.   let rec aux acc = function
  33.     | last::start::tl ->
  34.         let w = String.sub str start (last-start-1) in
  35.         aux (w::acc) (start::tl)
  36.     | _ -> acc
  37.   in
  38.   aux [] is ;;
  39. let sBASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"  ;;
  40. let rec sdup str n =
  41.         match n with
  42.         | 0 -> ""
  43.         | k when k > 0 -> str ^ (sdup str (n - 1))
  44.         | _ -> ""
  45. let contains s1 s2 =
  46.   try
  47.     let len = String.length s2 in
  48.     for i = 0 to (String.length s1) - len do
  49.       if String.sub s1 i len = s2 then raise Exit
  50.     done;
  51.     false
  52.   with Exit -> true ;;
  53. let join list sep =
  54.     let rec join' list acc =
  55.         match list with
  56.             | [] -> ""
  57.             | [single] -> single
  58.             | one::[two] ->
  59.                         if acc = "" then one ^ sep ^ two
  60.                                     else acc ^ one ^ sep ^ two
  61.             | first::others -> join' others (acc ^ first ^ ", ")
  62.                                         in
  63.                                         join' list "" ;;
  64. let str_reverse str =
  65.     let len = String.length str in
  66.     let res = String.create len in
  67.     for i = 0 to pred len do
  68.         let j = pred len - i in
  69.         res.[i] <- str.[j]
  70.     done;
  71.     res ;;
  72. let itoa num radix =
  73.    let isNegative = ref false in
  74.    let num1 = num + 0 in
  75.    let numx = ref num1 in
  76.    if num < 0 then begin
  77.       isNegative := true ;
  78.       numx := (-num)
  79.    end ;
  80.    let nnumx = !numx in
  81.    let q1 = nnumx in
  82.    let q = ref q1 in
  83.    let r = ref 0 in
  84.    let slen = ref 1 in
  85.    while (!q >= radix) do
  86.        r := !q mod radix ;
  87.        q := !q / radix ;
  88.        slen := !slen + 1
  89.    done ;
  90.    let sslen = !slen in
  91.    let str = String.create sslen in
  92.    let p1 = nnumx in
  93.    let p = ref p1 in
  94.    for i = 0 to sslen - 1 do
  95.        r := !p mod radix ;
  96.        p := !p / radix ;
  97.        str.[i] <- sBASE36.[!r]
  98.    done ;
  99.    let str2 = str_reverse str in
  100.    str2;;
  101. let atoi s radix =
  102.     let ret = ref 0 in
  103.     let isNegative = ref false in
  104.     let len = String.length s in
  105.     let valx = ref 0 in
  106.     let c1 = s.[0] in
  107.     let c = ref c1 in
  108.     if !c = '-' then
  109.         isNegative := true
  110.     else if (!c >= '0' && !c <= '9') then
  111.         ret := (int_of_char !c) - (int_of_char '0')
  112.     else if (!c >= 'A' && !c <= 'Z') then
  113.         ret := (int_of_char !c) - (int_of_char 'A') + 10
  114.     else if (!c >= 'a' && !c <= 'z') then
  115.         ret := (int_of_char !c) - (int_of_char 'a') + 10 ;
  116.     if (!ret >= radix) then
  117.         raise (ValueError (sprintf "Can not read \"%s\" (as radix %d): '%c' is invalid." s radix !c ) ) ;
  118.     for i = 1 to len - 1 do
  119.         c := s.[i] ;
  120.         ret := (!ret)*radix  ;
  121.         if (!c >= '0' && !c <= '9') then
  122.             valx := int_of_char !c - int_of_char '0' 
  123.         else if (!c >= 'A' && !c <= 'Z') then
  124.             valx := int_of_char !c - int_of_char 'A' + 10
  125.         else if (!c >= 'a' && !c <= 'z') then
  126.             valx := int_of_char !c - int_of_char 'a' + 10 ;
  127.         if (!valx >= radix) then
  128.             raise (ValueError (sprintf "Can not read \"%s\" (as radix %d): '%c' is invalid." s radix !c ) ) ;
  129.         ret := (!ret) + (!valx)
  130.     done;
  131.     if (!isNegative) then
  132.         ret := (-(!ret) ) ;
  133.     !ret ;;
  134. let asc = [|
  135.     "NUL"; "SOH"; "STX"; "ETX"; "EOT";
  136.     "ENQ"; "ACK"; "BEL"; "BS"; "HT";
  137.     "LF"; "VT"; "FF"; "CR"; "SO";
  138.     "SI"; "DLE"; "DC1"; "DC2"; "DC3";
  139.     "DC4"; "NAK"; "SYN"; "ETB"; "CAN";
  140.     "EM"; "SUB"; "ESC"; "FS"; "GS";
  141.     "RS"; "US"; "Spc" |] ;;
  142. let control = [|
  143.     "NUL (null)";
  144.     "SOH (start of heading)";
  145.     "STX (start of text)";
  146.     "ETX (end of text)";
  147.     "EOT (end of transmission)";
  148.     "ENQ (enquiry)";
  149.     "ACK (acknowledge)";
  150.     "BEL (bell)";
  151.     "BS  (backspace)";
  152.     "TAB (horizontal tab)";
  153.     "LF  (line feed, NL new line)";
  154.     "VT  (vertical tab)";
  155.     "FF  (form feed, NP new page)";
  156.     "CR  (carriage return)";
  157.     "SO  (shift out)";
  158.     "SI  (shift in)";
  159.     "DLE (data link escape)";
  160.     "DC1 (device control 1)";
  161.     "DC2 (device control 2)";
  162.     "DC3 (device control 3)";
  163.     "DC4 (device control 4)";
  164.     "NAK (negative acknowledge)";
  165.     "SYN (synchronous idle)";
  166.     "ETB (end of trans. block)";
  167.     "CAN (cancel)";
  168.     "EM  (end of medium)";
  169.     "SUB (substitute, EOF end of file)";
  170.     "ESC (escape)";
  171.     "FS  (file separator)";
  172.     "GS  (group separator)";
  173.     "RS  (record separator)";
  174.     "US  (unit separator)" |] ;;
  175. let makeTable() =
  176.     let sbuf = "    " in
  177.     let sbuf = sbuf ^ (sdup "+----" 8) in
  178.     let sbuf = sbuf ^  "+" in
  179.     println sbuf ;
  180.     let sbuf = "    " in
  181.     let sbuf = sbuf ^  "| 0- " in
  182.     let sbuf = sbuf ^  "| 1- " in
  183.     let sbuf = sbuf ^  "| 2- " in
  184.     let sbuf = sbuf ^  "| 3- " in
  185.     let sbuf = sbuf ^  "| 4- " in
  186.     let sbuf = sbuf ^  "| 5- " in
  187.     let sbuf = sbuf ^  "| 6- " in
  188.     let sbuf = sbuf ^  "| 7- " in
  189.     let sbuf = sbuf ^  "|" in
  190.     println sbuf  ;
  191.     let sbuf = "+---" in
  192.     let sbuf = sbuf ^ (sdup "+----" 8) in
  193.     let sbuf = sbuf ^  "+" in
  194.     println sbuf ;
  195.     let aa = Array.make_matrix 16 8 "" in
  196.     for i = 0 to (16-1) do
  197.         let sbuf = (itoa i 16) in
  198.         let tbuf = "| " ^ sbuf ^ " " in
  199.         print tbuf ;
  200.         for j = 0 to (8-1) do
  201.            if j*16 + i <= 32 then
  202.                aa.(i).(j) <- sprintf "| %-3s" asc.(j*16 + i)
  203.             else if j*16 + i = 127 then
  204.                 aa.(i).(j) <- sprintf  "| %-3s" "DEL"
  205.             else begin
  206.                let c = char_of_int (j*16 + i) in
  207.                 aa.(i).(j) <- sprintf "|  %1c " c
  208.             end ;
  209.             print aa.(i).(j)
  210.         done;
  211.         println "|"
  212.     done ;
  213.     let sbuf = "+---" in
  214.     let sbuf = sbuf ^ (sdup "+----"  8) in
  215.     let sbuf = sbuf ^ "+" in
  216.     println sbuf ;
  217.     println "" ;
  218.     for i = 0 to (16-1) do
  219.         let tbuf = sprintf "%-30s  %-34s" control.(i) control.(i+16) in
  220.         println tbuf
  221.     done ;
  222.     "" ;;
  223. (* Begin here *)
  224. let main() =
  225.     let cmdArgs = Sys.argv in
  226.     if (Array.length cmdArgs > 1 && "-h" = cmdArgs.(1)) then  begin
  227.         printUsage() ;
  228.         exit(1)
  229.     end ;
  230.     makeTable() ;;
  231. main() ;;




컴파일> ocamlc -o makeAsciiTable.exe makeAsciiTable.ml

실행> makeAsciiTable

   
    +----+----+----+----+----+----+----+----+
    | 0- | 1- | 2- | 3- | 4- | 5- | 6- | 7- |
+---+----+----+----+----+----+----+----+----+
| 0 | NUL| DLE| Spc|  0 |  @ |  P |  ` |  p |
| 1 | SOH| DC1|  ! |  1 |  A |  Q |  a |  q |
| 2 | STX| DC2|  " |  2 |  B |  R |  b |  r |
| 3 | ETX| DC3|  # |  3 |  C |  S |  c |  s |
| 4 | EOT| DC4|  $ |  4 |  D |  T |  d |  t |
| 5 | ENQ| NAK|  % |  5 |  E |  U |  e |  u |
| 6 | ACK| SYN|  & |  6 |  F |  V |  f |  v |
| 7 | BEL| ETB|  ' |  7 |  G |  W |  g |  w |
| 8 | BS | CAN|  ( |  8 |  H |  X |  h |  x |
| 9 | HT | EM |  ) |  9 |  I |  Y |  i |  y |
| A | LF | SUB|  * |  : |  J |  Z |  j |  z |
| B | VT | ESC|  + |  ; |  K |  [ |  k |  { |
| C | FF | FS |  , |  < |  L |  \ |  l |  | |
| D | CR | GS |  - |  = |  M |  ] |  m |  } |
| E | SO | RS |  . |  > |  N |  ^ |  n |  ~ |
| F | SI | US |  / |  ? |  O |  _ |  o | DEL|
+---+----+----+----+----+----+----+----+----+

NUL (null)                      DLE (data link escape)
SOH (start of heading)          DC1 (device control 1)
STX (start of text)             DC2 (device control 2)
ETX (end of text)               DC3 (device control 3)
EOT (end of transmission)       DC4 (device control 4)
ENQ (enquiry)                   NAK (negative acknowledge)
ACK (acknowledge)               SYN (synchronous idle)
BEL (bell)                      ETB (end of trans. block)
BS  (backspace)                 CAN (cancel)
TAB (horizontal tab)            EM  (end of medium)
LF  (line feed, NL new line)    SUB (substitute, EOF end of file)
VT  (vertical tab)              ESC (escape)
FF  (form feed, NP new page)    FS  (file separator)
CR  (carriage return)           GS  (group separator)
SO  (shift out)                 RS  (record separator)
SI  (shift in)                  US  (unit separator)



 

Posted by Scripter
,