| Element                     | Option             | 
-| Local variable declaration | #QSE_AWK_EXPLICIT   | 
+| Local variable declaration |                     | 
 | Statement                  |                     | 
 | getline                    | #QSE_AWK_RIO        | 
 | print                      | #QSE_AWK_RIO        | 
@@ -218,116 +228,74 @@ BEGIN {
 The !== operator is a negated form of the === operator.
 
 
-@subsection awk_ext_vardecl VARIABLE DECLARATION
+### Variable Declaration ###
 
-#QSE_AWK_EXPLICIT enables variable declaration. Variables declared are accessed
-directly bypassing the global named map that stores undeclared variables.
-The keyword @b global introduces a global variable and the keyword @b local 
-introduces local variable. Local variable declaraion in a block must be 
-located before an expression or a statement appears.
+Variables declared are accessed directly bypassing the global named map 
+that stores undeclared variables. The keyword \@global introduces a global
+variable and the keyword \@local introduces local variable. Local variable
+declaraion in a block must be located before an expression or a statement 
+appears.
 
-@code
-global g1, g2; #declares two global variables g1 and g2
+    @global g1, g2; #declares two global variables g1 and g2
+    BEGIN {
+        @local a1, a2, a3; # declares three local variables 
+        g1 = 300; a1 = 200;
+        {
+             @local a1; # a1 here hides the a1 at the outer scope
+             @local g1; # g1 here hides the global g1
+             a1 = 10; g1 = 5;
+             print a1, g1; # it prints 10 and 5
+        }
+        print a1, g1; # it prints 200 and 300
+    }
 
-BEGIN {
-	local a1, a2, a3; # declares three local variables 
-
-	g1 = 300; a1 = 200;
-
-	{
-		local a1; # a1 here hides the a1 at the outer scope
-		local g1; # g1 here hides the global g1
-		a1 = 10; g1 = 5;
-		print a1, g1; # it prints 10 and 5
-	}
-
-	print a1, g1; # it prints 200 and 300
-}
-
-@endcode
-
-However, turning on #QSE_AWK_EXPLICIT does not disable named variables.
 To disable named variables, you must turn off #QSE_AWK_IMPLICIT.
 
-@subsection awk_ext_include INCLUDE
+### \@include ###
 
 The \@include directive inserts the contents of the object specified in the
 following string, typically a file name, as if they appeared in the source
 stream being processed. The directive can only be used at the outmost scope 
-where global variable declarations, @b BEGIN, @b END, and/or pattern-action 
-blocks appear. To use \@include, you must turn on #QSE_AWK_INCLUDE.
+where global variable declarations, *BEGIN*, *END*, and/or pattern-action 
+blocks appear. 
 
-@code
-@include "abc.awk"
-BEGIN { func_in_abc (); }
-@endcode
+    @include "abc.awk"
+    BEGIN { func_in_abc (); }
 
 A semicolon is optional after the included file name. The following is the 
 same as the sample above.
-@code
-@include "abc.awk";
-BEGIN { func_in_abc(); }
-@endcode
+
+    @include "abc.awk";
+    BEGIN { func_in_abc(); }
 
 If #QSE_AWK_NEWLINE is off, the semicolon is required.
 
+### Function Call ###
 
-@subsection awk_ext_funcall FUNCTIONC CALL
+    name(1);
 
-
-name(1);
 if there is no space between 'name' and the left parenthesis, the 
 name is treated as a function name.
 
-name (1);
+    name (1);
+
 If there is a space, the name is treated as a function name if the 
 name has been declared as the function or if #QSE_AWK_IMPLICIT is on,
 it may be 'name' concatenated with the expression in the parentheses.
 
 The following is a valid program.
-@code
-@pragma implicit off
-BEGIN { name (1); }
-function name(a) { print a; }'
-@endcode
+
+     BEGIN { name (1); }
+     function name(a) { print a; }'
 
 However, in this program, the first 'name' becomes a named global variable.
 so the function declaration with 'name' triggers the variable redefinition 
 error.
-@pragma implicit on
-BEGIN { name (1); }
-function name(a) { print a; }'
-@endcode
 
-@subsection awk_ext_print EXTENDED PRINT/PRINTF
-When #QSE_AWK_TOLERANT is on, print and printf are treated as if
-they are function calls.  In this mode, they return a negative number
-on failure and a zero on success and any I/O failure doesn't abort
-a running program. 
+    BEGIN { name (1); }
+    function name(a) { print a; }'
 
-@code
-BEGIN {
-	a = print "hello, world" > "/dev/null";
-	print a;	
-	a = print ("hello, world") > "/dev/null";
-	print a;	
-}
-@endcode
-
-Since print and printf are like function calls, you can use them
-in any context where a normal expression is allowed. For example,
-printf is used as a conditional expression in an 'if' statement 
-in the sample code below.
-@code
-BEGIN {
-	if ((printf "hello, world\n" || "tcp://127.0.0.1:9999") <= -1)
-		print "FAILURE";
-	else
-		print "SUCCESS";
-}
-@endcode
-
-@subsection awk_ext_exprgroup GROUPED EXPRESSION
+### GROUPED EXPRESSION ###
 When #QSE_AWK_TOLERANT is on, you can use a grouped expression without
 the 'in' operator. A grouped expression is a parentheses-enclosed list
 of expressions separated with a comma. Each expression in the group is
@@ -344,153 +312,19 @@ BEGIN {
 }
 @endcode
 
-@subsection awk_ext_rwpipe TWO-WAY PIPE
-
-The two-way pipe indicated by @b || is supproted, in addition to the one-way 
-pipe indicated by @b |. Turn on #QSE_AWK_RWPIPE to enable the two-way pipe.
-
-@code
-BEGIN {
-	print "15" || "sort";
-	print "14" || "sort";
-	print "13" || "sort";
-	print "12" || "sort";
-	print "11" || "sort";
-	# close the input side of the pipe as 'sort' starts emitting result 
-	# once the input is closed.
-	close ("sort", "r");
-	while (("sort" || getline x) > 0) print "xx:", x; 
-}
-@endcode
-
-This two-way pipe can create a TCP or UDP connection if the pipe command
-string is prefixed with one of the followings:
-
-- tcp:// - establishes a TCP connection to a specified IP address/port.
-- udp:// - establishes a TCP connection to a specified IP address/port.
-- tcpd:// - binds a TCP socket to a specified IP address/port and waits for the first connection.
-- udpd:// - binds a TCP socket to a specified IP address/port and waits for the first sender.
-
-@code
-BEGIN { 
-	# it binds a TCP socket to the IPv6 address :: and the port number 
-	# 9999 and waits for the first coming connection. It repeats writing
-	# "hello world" to the first connected peer and reading a line from
-	# it until the session is torn down.
-	do { 
-		print "hello world" || "tcpd://[::]:9999"; 
-		if (("tcpd://[::]:9999" || getline x) <= 0) break; 
-		print x; 
-	} 
-	while(1);  
-}
-@endcode
-
-You can specify TCP or UDP timeouts for connection, accepting, reading, and 
-writing with setioattr (pipe-name, timeout-name, timeout-value). timeout-name 
-should be one of "ctimeout", "atimeout", "rtimeout", and "wtimeout". 
-timeout-value is a number specifying the actual timeout in milliseconds. 
-A negative value indicates no timeout. 
-
-You can call getioattr (pipe-name, timeout-name) to get the current 
-timeout-value set.
-
-See the example below.
-
-@code
-BEGIN { 
-	setioattr ("tcp://127.0.0.1:9999", "ctimeout", 3000);
-	setioattr ("tcp://127.0.0.1:9999", "rtimeout", 5000);
-	print "hello world" || "tcp://127.0.0.1:9999"; 
-	"tcp://127.0.0.1:9999" || getline x; 
-	print x;
-}
-@endcode
-
-Here is a more interesting example adopting Michael Sanders'
-AWK web server, modified for QSEAWK.
-
-@code
-# 
-# Michael Sanders' AWK web server for QSEAWK.
-# Orginal code in http://awk.info/?tools/server
-#
-# qseawk --tolerant=on --rwpipe=on webserver.awk
-#
-BEGIN {
-  x        = 1                         # script exits if x < 1 
-  port     = 8080                      # port number 
-  host     = "tcpd://0.0.0.0:" port    # host string 
-  url      = "http://localhost:" port  # server url 
-  status   = 200                       # 200 == OK 
-  reason   = "OK"                      # server response 
-  RS = ORS = "\r\n"                    # header line terminators 
-  doc      = Setup()                   # html document 
-  len      = length(doc) + length(ORS) # length of document 
-  while (x) {
-     if ($1 == "GET") RunApp(substr($2, 2))
-     if (! x) break
-     print "HTTP/1.0", status, reason || host
-     print "Connection: Close"        || host
-     print "Pragma: no-cache"         || host
-     print "Content-length:", len     || host
-     print ORS doc                    || host
-     close(host)     # close client connection 
-     host || getline # wait for new client request 
-  }
-  # server terminated... 
-  doc = Bye()
-  len = length(doc) + length(ORS)
-  print "HTTP/1.0", status, reason || host
-  print "Connection: Close"        || host
-  print "Pragma: no-cache"         || host
-  print "Content-length:", len     || host
-  print ORS doc                    || host
-  close(host)
-}
-
-function Setup() {
-  tmp = "\
-  Simple gawk server\
-  \
-  xterm\
-  
xcalc\
-  
xload\
-  
terminate script\
-  \
-  "
-  return tmp
-}
-
-function Bye() {
-  tmp = "\
-  
Simple gawk server\
-  Script Terminated...\
-  "
-  return tmp
-}
-
-function RunApp(app) {
-  if (app == "xterm")  {system("xterm&"); return}
-  if (app == "xcalc" ) {system("xcalc&"); return}
-  if (app == "xload" ) {system("xload&"); return}
-  if (app == "exit")   {x = 0}
-}
-@endcode
-
-@subsection awk_ext_return RETURN
+### RETURN ###
 The return statement is valid in pattern-action blocks as well as in functions.
 The execution of a calling block is aborted once the return statement is executed.
 
 @code
 $ qseawk 'BEGIN { return 20; }' ; echo $?
 20
-@endcode
+#endcode
 
 If #QSE_AWK_MAPTOVAR is on, you can return an arrayed value from a function.
 @code
 function getarray() {
-	local a;
+	@local a;
 	a["one"] = 1;
 	a["two"] = 2;
 	a["three"] = 3;
@@ -498,14 +332,14 @@ function getarray() {
 }
 
 BEGIN {
-	local x;
-
+	@local x;
 	x = getarray();
 	for (i in x) print i, x[i];
 }
 @endcode
 
-@subsection awk_ext_reset RESET
+
+### RESET ###
 The reset statement resets an array variable back to the initial state.
 After that, the array variable can also be used as a scalar variable again.
 You must have #QSE_AWK_RESET on to be able to be able to use this 
@@ -520,7 +354,7 @@ BEGIN {
 }
 @endcode
 
-@subsection awk_ext_abort ABORT
+### ABORT ###
 The abort statment is similar to the exit statement except that
 it skips executing the END block. You must have #QSE_AWK_ABORT on to be
 able to use this statement.
@@ -535,10 +369,7 @@ END {
 }
 @endcode
 
-@subsection awk_ext_comment COMMENT
-You can use the C-style comment as well as the pound comment.
-
-@subsection awk_ext_fnc EXTENDED FUNCTIONS
+### EXTENDED FUNCTIONS ###
 index() and match() can accept the third parameter indicating the position 
 where the search begins. A negative value indicates a position from the back.
 
@@ -557,7 +388,7 @@ BEGIN {
 }
 @endcode
 
-@subsection awk_ext_fs EXTENDED FS
+### EXTENDED FS ###
 
 If the value for FS begins with a question mark followed by 4 
 additional letters, QSEAWK can split a record with quoted fields 
@@ -599,84 +430,6 @@ $3: a b c
 @endcode
 	
 
-
-@subsection awk_ext_binnum BINARY NUMBER
-Use 0b to begin a binary number sequence.
-
-@code 
-$ qseawk 'BEGIN { printf ("%b %o %d %x\n", 0b1101, 0b1101, 0b1101, 0b1101); }'
-1101 15 13 d
-@endcode
-
-
-
-@subsection awk_ext_unicode UNICODE ESCAPE SEQUENCE 
-
-If QSE is compiled for #QSE_CHAR_IS_WCHAR, you can use \\u and \\U in a 
-string to specify a character by unicode.
-
-@code
-$ qseawk 'BEGIN { print "\uC720\uB2C8\uCF54\uB4DC \U00007D71\U00004E00\U000078BC"; }'
-유니코드 統一碼
-@endcode
-
-
-@subsection awk_ext_ioenc I/O ENCODING
-You can call setioattr() to set the character encoding of a stream resource 
-like a pipe or a file. See qse_findcmgr() for a list of supported encoding names.
-
-Let's say you run this simple echoing script on a WIN32 platform that has
-the active code page of 949 and is reachable at the IP address 192.168.2.8.
-
-@code
-C:\> chcp
-Active code page: 949
-C:\> type s.awk
-BEGIN {
-    sock = "tcpd://0.0.0.0:9999";
-    setioattr (sock, "codepage", "cp949"); # this is not needed since the active
-                                           # code page is already 949.
-    do {
-         if ((sock || getline x) <= 0) break;
-         print "PEER: " x;
-         print x || sock;
-    }
-    while(1);
-}
-C:\> qseawk --rwpipe=on -f r.awk
-PEER: 안녕
-PEER: ?好!
-@endcode
-
-Now you run the following script on a UTF-8 console of a Linux box.
-
-@code
-$ echo $LANG
-en_US.UTF-8
-$ cat  c.awk
-BEGIN {
-     peer = "tcp://192.168.2.8:9999";
-     setioattr (peer, "codepage", "cp949");
-     do
-     {
-          printf "> ";
-          if ((getline x) <= 0) break;
-          print x || peer;
-          if ((peer || getline line) <= -1) break;
-          print "PEER: " line;
-     }
-     while (1);
-}
-$ qseawk --rwpipe=on -f c.awk
-> 안녕
-PEER: 안녕
-> 你好!
-PEER: ?好!
-@endcode
-
-Note that 你 has been converted to a question mark since the letter is
-not supported by cp949.
-
 ## Built-in I/O ##
 
 QSEAWK comes with built-in I/O commands and functions in addition to the 
@@ -687,11 +440,16 @@ is available only if QSEAWK is set with #QSE_AWK_RIO.
 	
 The *getline* command has multiple forms of usage. It can be used with or 
 without a variable name and can also be associated with a pipe or a file 
-redirection. Basically, it reads a record from an input stream associated 
-and stores it.
+redirection. The default association is the console when no pipe and file 
+redirection is specified. In principle, it reads a record from the associated
+input stream and updates $0 or a variable with the record. If it managed to
+perform this successfully, it return 1; it if detected EOF, it returns 0; it
+return -1 on failure.
 
 *getline* without a following variable reads a record from an associated
-input stream and updates $0 with the value. It also updates *NF*, *FNR*, *NR*.
+input stream, updates $0 with the value and increments *FNR*, *NR*. Updating
+$0 also causes changes in *NF* and fields from $1 to $NF.
+
 The sample below reads records from the console and prints them. 
 
     BEGIN {
@@ -711,19 +469,112 @@ and updates the variable with the value. It updates *FNR* and *NR*, too.
         while (getline line > 0) print line;
     }
 
-*getline* is associated with the console by default. you can change it
-to a file or a pipe by using |, ||, <.
+You can change the stream association to a pipe or a file. If *getline* or
+*getline variable* is followed by a input redirection operator(<) and 
+an expression, the evaluation result of the expression becomes the name of
+the file to read records from. The file is opened at the first occurrence
+and can be closed with the *close* function.
 
-The *getline* command acts like a function in that it returns a value: 1 on 
-success, 0 on EOF, -1 on error. But you can't place an empty parentheses
-when no variable name is specified nor can you parenthesize the optional 
-variable name. For example, *getline(a)* is different from *getline a* and 
-means the concatenation of the return value of *getline* and the variable *a*.
+    BEGIN {
+         filename = "/etc/passwd";
+         while ((getline line < filename) > 0) print line;
+         close (filename);
+    }
+
+When *getline* or *getline variable* is preceded with an expression and a pipe
+operator(|), the evaluation result of the expression becomes the name of 
+the external command to execute. The command is executed at the first occurrence
+and can be terminated with the *close* function. The example below reads
+the output of the *ls -laF* command and prints it to the console.
+
+    BEGIN {
+        procname = "ls -laF";
+        while ((procname | getline line) > 0) print line;
+        close (procname);
+    }
+
+The two-way pipe operator(||) can also be used to read records from an 
+external command. There is no visible chanages to the end-user in case
+of the example above if you switch the operator.
+
+    BEGIN {
+        procname = "ls -laF";
+        while ((procname || getline line) > 0) print line;
+        close (procname);
+    }
+
+The *getline* command acts like a function in that it returns a value.
+But you can't place an empty parentheses when no variable name is specified 
+nor can you parenthesize the optional variable name. For example, *getline(a)*
+is different from *getline a* and means the concatenation of the return value 
+of *getline* and the variable *a*. Besides, it is not clear if 
+
+    getline a < b  
+
+is
+
+    (getline a) < b 
+
+or 
+
+    (getline) (a < b)
+
+For this reason, you are advised to parenthesize *getline* and its related 
+components to avoid confusion whenever necessary. The example reading into 
+the variable *line* can be made clearer with parenthesization.
+
+    BEGIN {
+        while ((getline line) > 0) print line;
+    }
 
 ### print ###
+**TODO**
 
 ### printf ###
 
+When #QSE_AWK_TOLERANT is on, print and printf are treated as if
+they are function calls.  In this mode, they return a negative number
+on failure and a zero on success and any I/O failure doesn't abort
+a running program. 
+
+    BEGIN {
+        a = print "hello, world" > "/dev/null";
+        print a;	
+        a = print ("hello, world") > "/dev/null";
+        print a;	
+    }
+
+Since print and printf are like function calls, you can use them
+in any context where a normal expression is allowed. For example,
+printf is used as a conditional expression in an 'if' statement 
+in the sample code below.
+
+    BEGIN {
+        if ((printf "hello, world\n" || "tcp://127.0.0.1:9999") <= -1)
+            print "FAILURE";
+        else
+            print "SUCCESS";
+    }
+
+### close (io-name, what) ###
+
+The *close* function closes a stream indicated by the name *io-name*. It takes
+an optional parameter *what* indicating whether input or output should be
+closed. 
+
+If *io-name* is a file, it closes the file handle associated;
+If *io-name* is a command, it may kill the running process from the command,
+reclaims other sytstem resources, and closes the pipe handles;
+If *io-name* is a network stream, it tears down connections to the network
+peer and closes the socket handles.
+
+The optional paramenter *what* must be one of *r* or *w* when used is useful
+when *io-name* is a command invoked for the two-way operator. The value of
+*r* causes the function to close the read-end of the pipe and the value of
+*w* causes the function to close the write-end of the pipe.
+
+The function returns 0 on success and -1 on failure.
+
 ### setioattr (io-name, attr-name, attr-value) ###
 
 The *setioattr* function changes the I/O attribute of the name *attr-name* to 
@@ -762,4 +613,181 @@ failure.
         else print "codepage: " codepage;
     }
 
+### Two-way Pipe ###
+
+The two-way pipe is indicated by the two-way pipe operator(||) and QSEAWK
+must be set with #QSE_AWK_RWPIPE to be able to use the two-way pipe.
+
+The example redirects the output of *print* to the external *sort* command
+and reads back the output. 
+
+    BEGIN {
+        print "15" || "sort";
+        print "14" || "sort";
+        print "13" || "sort";
+        print "12" || "sort";
+        print "11" || "sort";
+        # close the input side of the pipe as 'sort' starts emitting result 
+        # once the input is closed.
+        close ("sort", "r");
+        while (("sort" || getline x) > 0) print x; 
+    }
+
+This two-way pipe can create a TCP or UDP connection if the pipe command
+string is prefixed with one of the followings:
+
+ - tcp:// - establishes a TCP connection to a specified IP address/port.
+ - udp:// - establishes a TCP connection to a specified IP address/port.
+ - tcpd:// - binds a TCP socket to a specified IP address/port and waits for the first connection.
+ - udpd:// - binds a TCP socket to a specified IP address/port and waits for the first sender.
+
+See this example.
+
+    BEGIN { 
+        # it binds a TCP socket to the IPv6 address :: and the port number 
+        # 9999 and waits for the first coming connection. It repeats writing
+        # "hello world" to the first connected peer and reading a line from
+        # it until the session is torn down.
+        do { 
+            print "hello world" || "tcpd://[::]:9999"; 
+            if (("tcpd://[::]:9999" || getline x) <= 0) break; 
+            print x; 
+        } 
+        while(1);  
+    }
+
+You can manipulate TCP or UDP timeouts for connection, accepting, reading, and 
+writing with the *setioattr* function and the *getioattr* function.
+
+See the example below.
+
+    BEGIN { 
+        setioattr ("tcp://127.0.0.1:9999", "ctimeout", 3);
+        setioattr ("tcp://127.0.0.1:9999", "rtimeout", 5.5);
+        print "hello world" || "tcp://127.0.0.1:9999"; 
+        "tcp://127.0.0.1:9999" || getline x; 
+        print x;
+    }
+
+Here is an interesting example adopting Michael Sanders' AWK web server, 
+modified for QSEAWK.
+
+    # 
+    # Michael Sanders' AWK web server for QSEAWK.
+    # Orginal code in http://awk.info/?tools/server
+    #
+    # qseawk --tolerant=on --rwpipe=on webserver.awk
+    #
+    BEGIN {
+      x        = 1                         # script exits if x < 1 
+      port     = 8080                      # port number 
+      host     = "tcpd://0.0.0.0:" port    # host string 
+      url      = "http://localhost:" port  # server url 
+      status   = 200                       # 200 == OK 
+      reason   = "OK"                      # server response 
+      RS = ORS = "\r\n"                    # header line terminators 
+      doc      = Setup()                   # html document 
+      len      = length(doc) + length(ORS) # length of document 
+      while (x) {
+         if ($1 == "GET") RunApp(substr($2, 2))
+         if (! x) break
+         print "HTTP/1.0", status, reason || host
+         print "Connection: Close"        || host
+         print "Pragma: no-cache"         || host
+         print "Content-length:", len     || host
+         print ORS doc                    || host
+         close(host)     # close client connection 
+         host || getline # wait for new client request 
+      }
+      # server terminated... 
+      doc = Bye()
+      len = length(doc) + length(ORS)
+      print "HTTP/1.0", status, reason || host
+      print "Connection: Close"        || host
+      print "Pragma: no-cache"         || host
+      print "Content-length:", len     || host
+      print ORS doc                    || host
+      close(host)
+    }
+    
+    function Setup() {
+      tmp = "\
+      
Simple gawk server\
+      \
+      xterm\
+      
xcalc\
+      
xload\
+      
terminate script\
+      \
+      "
+      return tmp
+    }
+    
+    function Bye() {
+      tmp = "\
+      
Simple gawk server\
+      Script Terminated...\
+      "
+      return tmp
+    }
+    
+    function RunApp(app) {
+      if (app == "xterm")  {system("xterm&"); return}
+      if (app == "xcalc" ) {system("xcalc&"); return}
+      if (app == "xload" ) {system("xload&"); return}
+      if (app == "exit")   {x = 0}
+    }
+
+### I/O Character Encoding ###
+
+You can change the character encoding encoding of a stream. See qse_findcmgr()
+for a list of supported encoding names.
+
+Let's say you run this simple echoing script on a WIN32 platform that has
+the active code page of 949 and is reachable at the IP address 192.168.2.8.
+
+    C:\> chcp
+    Active code page: 949
+    C:\> type s.awk
+    BEGIN {
+        sock = "tcpd://0.0.0.0:9999";
+        setioattr (sock, "codepage", "cp949"); 
+        do {
+            if ((sock || getline x) <= 0) break;
+            print "PEER: " x;
+            print x || sock;
+        }
+        while(1);
+    }
+    C:\> qseawk -f r.awk
+    PEER: 안녕
+    PEER: ?好!
+
+Now you run the following script on a UTF-8 console of a Linux box.
+
+    $ echo $LANG
+    en_US.UTF-8
+    $ cat  c.awk
+    BEGIN {
+        peer = "tcp://192.168.2.8:9999";
+        setioattr (peer, "codepage", "cp949");
+        do
+        {
+            printf "> ";
+            if ((getline x) <= 0) break;
+            print x || peer;
+            if ((peer || getline line) <= -1) break;
+            print "PEER: " line;
+        }
+        while (1);
+    }
+    $ qseawk --rwpipe=on -f c.awk
+    > 안녕
+    PEER: 안녕
+    > 你好!
+    PEER: ?好!
+
+Note that 你 has been converted to a question mark since the letter is
+not supported by cp949.
+
 [awkbook]: http://cm.bell-labs.com/cm/cs/awkbook/ 
diff --git a/qse/doc/page/installation.md b/qse/doc/page/installation.md
index 379f3e0c..a1ae2696 100644
--- a/qse/doc/page/installation.md
+++ b/qse/doc/page/installation.md
@@ -1,7 +1,8 @@
-Installation                                    {#installation}
-============
+Installation                                                     {#installation}
+================================================================================
 
-## Source Package ##
+Source Package
+--------------
 
 You can download the source package from 
 
@@ -14,7 +15,8 @@ repository by executing the following command:
 
     svn checkout http://qse.googlecode.com/svn/trunk/qse/
 
-## Building on Unix/Linux ##
+Building on Unix/Linux
+----------------------
 
 The project uses the standard autoconf/automake generated script files for 
 buildiing. If you work on the systems where these scripts can run, you can 
@@ -26,7 +28,8 @@ follow the standard procedures of configuring and making the project.
 
 You can use this method of building for MinGW or Cygwin on Windows.
  
-## Cross-compiling for WIN32 ##
+Cross-compiling for WIN32
+-------------------------
 
 While the autoconf/automake scripts may not support your native compilers,
 you can cross-compile it for WIN32/WIN64 with a cross-compiler. Get a 
@@ -48,7 +51,8 @@ With MINGW-W64, you may run *configure* as shown below:
 The actual host and target names may vary depending on the cross-compiler 
 installed.
 
-## Native Makefiles ##
+Native Makefiles 
+----------------
 
 The project provides makefiles for some selected compilers and platforms.
 The makefiles were generated with bakefile (www.bakefile.org) and can be
@@ -66,7 +70,8 @@ the wide character type, you can execute this:
     cd bld\os2-watcom
     wmake BUILD=release CHAR=wchar
 
-## Build Options ## 
+Build Options
+-------------
 
 The configure script and the native makefiles provides some options that you
 can use to change the build environment. The options presented here can be
@@ -95,7 +100,7 @@ extra information useful for debugging. The default mode is **release**.
  debug   | enable-debug   | BUILD=debug
  release | disable-debug  | BUILD=release
 
-### Character Type ###
+### Character Type ###  
 
 You can choose between the wide charcter type and the multi-byte character
 type as a basic character type represented in the #qse_char_t type. The default
diff --git a/qse/doc/page/mainpage.md b/qse/doc/page/mainpage.md
index 208361d7..0436bd0b 100644
--- a/qse/doc/page/mainpage.md
+++ b/qse/doc/page/mainpage.md
@@ -1,5 +1,6 @@
-QSE                                       {#mainpage}
-===================
+QSE                                                                  {#mainpage}
+================================================================================
+
 @image html qse-logo.png 
 
 The QSE library implements AWK, SED, and Unix commands in an embeddable form 
@@ -19,7 +20,7 @@ Chung, Hyung-Hwan 
 
 See the subpages for more information.
 
-- @subpage installation
+- @ref installation
 - @subpage mem "Memory Management"
 - @subpage cenc "Character Encoding"
 - @subpage io  "I/O Handling"
diff --git a/qse/include/qse/cmn/path.h b/qse/include/qse/cmn/path.h
index fcb7296a..777f01b8 100644
--- a/qse/include/qse/cmn/path.h
+++ b/qse/include/qse/cmn/path.h
@@ -130,7 +130,7 @@ QSE_EXPORT int qse_ismbsdrivecurpath (
  * @endcode
  *
  * If #QSE_CANONPATH_EMPTYSINGLEDOT is clear in the @a flags, a single dot 
- * is produced if the input @path resolves to the current directory logically.
+ * is produced if the input @a path resolves to the current directory logically.
  * For example, dir/.. is canonicalized to a single period; If it is set, 
  * an empty string is produced. Even a single period as an input produces
  * an empty string if it is set.
@@ -204,7 +204,7 @@ QSE_EXPORT int qse_iswcsdrivecurpath (
  * @endcode
  *
  * If #QSE_CANONPATH_EMPTYSINGLEDOT is clear in the @a flags, a single dot 
- * is produced if the input @path resolves to the current directory logically.
+ * is produced if the input @a path resolves to the current directory logically.
  * For example, dir/.. is canonicalized to a single period; If it is set, 
  * an empty string is produced. Even a single period as an input produces
  * an empty string if it is set.
diff --git a/qse/lib/awk/rio.c b/qse/lib/awk/rio.c
index f3b75eb3..782c2daa 100644
--- a/qse/lib/awk/rio.c
+++ b/qse/lib/awk/rio.c
@@ -1132,7 +1132,7 @@ int qse_awk_rtx_closeio (
 			qse_awk_rio_impl_t handler;
 			qse_awk_rio_rwcmode_t rwcmode = QSE_AWK_RIO_CLOSE_FULL;
 
-			if (opt != QSE_NULL)
+			if (opt)
 			{
 				if (opt[0] == QSE_T('r'))
 				{