
+-------+
| v0.33 |
+-------+
 .Wy_RepInfo: 
   Wy_RepInfo(const char*) is removed 
   [hint] change Wy_RepInfo(cstr) to Wy_RepInfo(-1,cstr)

   c_repcode() changed to repcode()
   c_repstr() changed to repstr()

   getmsg(void*.size_t) changed to getmsg(const char*&, void*, size_t)
   setmsg(cont void*, size_t) changed to setmsg(const char*, const void*, size_t)
   [hint] add a const char*

 .WyByteFlow: fsync() fdatasync() changed to _fsync() _fdatasync()
  [hint] f.fsync() --> f._fsync()
         f.fdatasync() --> f._fdatasync()

 .WyIConv::iconv(WyCSeg&,WyStr&,size_t&) changed to append the conversion result
  [hint] add str.reset()

 .throw specification in manpages changed to "_throw_"

 .added example a_dtmf.cpp, a_morse.cpp, q_wrd.cpp, demo_hello, demo_timespec, a_mac

 .file split: Wy_Array.cpp wy_iouty.cpp

+-------+
| v0.32 |
+-------+
 Distributed auxiliary utility upd-31-32 can help locate many of the changes,
 but not all of them. See ../src/upd-31-32.cpp.

 .Name of header files are changed to use captal letters (so manpage file names).
  name of template files changed suffix to .hh
  [hint] #include <wystr.h> -> #include <WyStr.h>
         #include <wyregfile.h> -> #include <WyRegFile.h>
         #include <wy_array.h> -> #include <Wy_Array.hh>
         #include <wyselect.h> -> #include <Wy.select.h>
         ... etc.

 .Header file wy_uty.h is removed
  [hint] Include "WyByteFlow.h"

 .Header files removed unnecessary inclusions
  [hint] Depending on compiler error message, include missing header files

 .Wy_LnkFile::read changed name to Wy_LnkFile::_readlink

 .Wy_DirFile::read changed name to Wy_DirFile::_readdir
  Wy_DirFIle::rewind changed name to Wy_DirFile::_rewinddir

 .WyCSeg::find and WyStr::find members changed protocol
  [hint] See manpage and manual WyStr.3wy WyCSeg.3wy and workaround

 .WyCSeg::rfind.. members and WyStr::rfind.. members changed searching range as [0,idx)
  [hint] Manually inspect each occurrence of rfind.. (see WyStr.3wy, WyCSeg.3wy)

 .WyStr::_strcmp, WyCSeg::_strcmp members are removed
  [hint] Change str._strcmp(t) to Wy::_strcmp(str,t)

 .Wy::_strnum(..) and Wy::_scanum(..) changed function protocol and revised
  [hint] Compiler will generate error, manual update (see Wy.3wy)

 .WyStr:: Removed member copyto(..)
  [hint] Manual inspect and workaround

 .Wy::_catstr(..) are removed
  [hint] See manpage Wy.3wy, Wy::wrd and WyStr::append or Wy::_ntoa may be used instead

 .WyDate::time_zone() changed to return WyCSeg

 .Wy_RepInfo::get_reply(..) changed to getmsg(void*,size_t)
  Wy_RepInfo::set_reply(..) changed to setmsg(const void*,size_t)
  [hint] Modify reimplement functions in accordance

 .WyTermios::iflag(v),oflag(v).. changed to iflag_set(v) oflag_set(v)
  [hint] Just add suffix "_set" to the name

 .WyTerminal::devname() changed to _ttyname()

 .WyMutex initialization bugfix by changing enum argument to class types
  [hint] Change WyMutex::Fast to WyMutex::Normal. trylock may return EDEADLK

 .Definition of Wy::_charnum modified to "int _charnum(char)"
  [hint] use v=Wy::_charnum(ch);
             if((v<0)||(v>=Radix)) {
               // not a defined digit char
             }

 .WyCSeg::_move_begin, _move_end changed from throwing Reply(Wym_EINVAL) to 
  Reply(Wym_ERANGE), and changed name to move_begin and move_end

 .WySockAddrLocal changes are:
  1.PathMaxLen changed name to MaxAddrLen
  2.WySockAddrLocal(const sockaddr_un,size_t) and reset(const sockaddr_un&,size_t)
    are removed
  3.WySockAddrLocal(const char*), reset(const char*), operator=(const char*)
    and operator==(const char*) and function
    operator==(const char*, const WySockAddrLocal&) changed to no throw spec.
  4.Function operator==(const WyStr&,const WySockAddrLocal&) changed throw spec. from
    throw() to throw(WyRet)
* 5.Function Wy::wrd(const WySockAddrLocal&) removed throw spec.
  6._path() removed and added members addrname() and addrsize() in stead
    [hint] Refer to addrname() and addrsize() (WySockAddrLocal.3wy), or see if 
           WyCSeg(t.addrname(),t.addrsize()) works

*.Wy::wrd(NumType,.) of integer type removed 3-argument overload
  [hint] Remove the last argument (should had been 0) or add one to specify
         fraction digits

 .WySockAddrINet4::InPortType changed name to PortType

*.WyStr::operator==(const char*) removed throw spec.
  And added function bool operator==(const char*, const WyStr&)

 .WyDirEnt removed members dt_off, dt_reclen
  [hint] Nop, but there is a internal member wy_dent_ref(). see WyDirEnt.h

 .Wy_ThreadID is removed
  [hint] Change Wy_ThreadID to Wy_Thread::_ThreadID, use Wy::_thread_equal maybe

 .WyTimeSpec:: changes:
  Wy_Second -> WyTimeSpec::SecondType
  Wy_Nano -> WyTimeSpec::NanoSecType

 .WyTimeSpec::abs() moved to Wy::abs(const WyTimeSpec&)
  [hint] change "t.abs()" to Wy::abs(t)

*.All reply Wym_EMATHNEG changed to Wym_ERANGE
  [hint] change occurrence of Wym_EMATHNEG to Wym_ERANGE

 .Added Wy::_thread_equal
 .Wy::_mkstr of integer version removed 4-argument overload
  Wy::_mkstr of float version removed 3-argument overload
  Wy::_mkstr has now no 2-argument version
  [hint] Remove the last argument (should had been 0) or add one to specify
         fraction digits

 .WyStr::_setsize changed to return void
   [hint] Check src really uses this function to check for enough space 
          Add pre-check code. e.g. if(n>str._capacity()) {...}

 .WyStr:: members find(..) and rfind(..) changed the first argument to reference type
          Added findc(size_t&,char),rfindc(size_t&,char)

*.Wy_FdSet bugfix
  [hint] change s=t to s.reset(t)

 .Wy_Thread::cancel, wait_not removed Wym_EPERM reply (changed to throw WyRet(Wym_EPERM))
*.WyStr::operator[] changed to check index
  [hint] Change expression "&str[n]" to str.begin()+n
 .Constructors WySockAddrINet4::IPaddr(uint32_t) and WySockAddrINet4::IPaddr(const char*)
  changed to explicit
  [hint] WySockAddrINet(INADDRANY,0) -> WySockAddrINet4( WySockAddrINet4::IPAddr(INADDRANY), 0))
  [hint] WySockAddrINet("192.168.1.1",0) -> WySockAddrINet4( WySockAddrINet4::IPAddr("192.168.1.1"), 0))
 .WyStr:: Added member begin(..) non-const version
 .WyStr:: Added member front() and back()
*.WyStr::reset(const WyStr&), operator=(const WyStr&) removed Wym_ELOOP report
 .WyTermios::setispeed(s)/setospeed(s) changed to return speed_t
  [hint] Test return value against input baudrate, not WyRet
*.WyLock constructor and xlock can throw Wym_EAGAIN (from updating WyMutex)
  Wy_Thread() can throw Wym_EAGAIN
  set_cancelable(bool) changed to no throw spec.
  set_canceltype(CancelType) changed to no throw spec.
 .Added class Wy_Thread::NoCancel
 .WyRet(int) removed explicit
 .WyCond() changed to throw error, signal(), broadcast()
 .Added Wy::gethostname(WyStr&)
 .WyTermios: compatibility bugfix
 .Constructor WySockAddrINet4::IPAddr(in_addr_t) added explicit modifier
   [hint] WySockAddrINet4(1,2) -> WySockAddrINet4(WySockAddrINet4::IPAddr(1),2)
 .Wy_Array: bugfix (double throw)
 .Added Wy::to_double(const WyTimeSpec&)
 .Added Wy::ntoa(..)
 .Number conversion functions are revised Wy::_mkstr/Wy::_strnum
 .WyTimeSpec can be used more as normal number
 .Example files are revised

+-------+
| v0.31 |
+-------+
 .OK name literal changed to Ok
  [hint] change "OK" to "Ok"  (known exceptions for textual replacement are
         F_OK,R_OK,W_OK)

 .WyFileStat members that access struct stat added prefix sf_, e.g.
  mode(), ino(),.. changed name literal to sf_mode(), sf_ino(),..
  [hint] Compiler would complain. Add the prefix sf_ to the outdated items.

 .WyDirEnt members that access struct dirent added prifix dt_ e.g.
  _reclen, _ino changed name literal to dt_reclen, dt_ino.
  member filename changed name literal to dt_name.
  [hint] Compiler would complain. Add the prefix dt_ to the outdated items.
         change name literal filename to dt_name

 ._xread is removed from WyByteFlow family, and added Wy::full_read for it
  [hint] Change expression "bf._xread(buf,blen,n_rd)"
         to "Wy::full_read(bf,buf,blen,n_rd)". There might be need to include
         wy_uty.h

 .Constructor WyFileHandle(int) changed to explicit
  [hint] 1.Wrap the integer literal by WyFileHanle(..), for instance
           change the form t.set(100) to t.set( WyFileHandle(100) ), etc.
         2.Constructing object considers the form:
           WyByteFlow b( (WyFileHandle(fd)) );    // bracket the argument 

 .Wy_ErrInfo is removed
  [hint] The original usecases are supposed like: Wy_ErrInfo ei(cstr);
         Refer to Wy_RepInfo and WyReply manual, define an application class
         (e.g. AppRepInfo inherits Wy_RepInfo), then change the expression to
         AppRepInfo ei(cstr);

 .WyStr::strcmp removed. WyStr added members _strcmp (different lexic-order)
  [hint] Source program using strcmp(..) may need work around this change.
         Compiler would complain the missing function. Manual inspect.

 .Wy_Thread had bugfixes and revisions:
  1.Member cancel() returning WYm_ENOENT changed to return Wym_ESRCH
  [hint] find(grep) usecase of cancel() and manually inspect for suitability

  2.Destructor of inheriting class should add code to disable cancellability
    first. A member function close_tmain(void) is added for this purpose.
  [hint] find(grep) destructor of Wy_Thread inheriting class, add
         set_cancelable(false) to the destructor, or change codes to using
         close_tmain(), see manpage.

  3.thread_state() changed to non-const function
  
 .Wy_Thread::tmain_id renamed to thread_id
  [hint] Change name literal from "tmain_id" to "thread_id"

 .WyCSeg responsibility modified to represent the pointed string, and added
  find function family, and functions _strcmp, _move_begin/_move_end.
 .Return type of sf_a/m/ctime changed from Wy_Second to time_t
  to reduce use confusion and ease identification, mode(),size(), ino()
 .Bugfix: Wy_Array<T>, when T is built-in types, Reply may not be caught
 .Wy_Array<T>(size_t,const T&) added Wym_EFBIG report

 .Added a class template WySeg
 .Wy_Array added Wy_Array(const WySeg<T>&), Wy_Array(const WySeg<const T>&)
  subseg, reset(const WySeg<T>&),reset(size_t,const T&)
  insert(size_t,const WySeg<T>&),insert(size_t,size_t,const T&)
  operator=(const WySeg<T>&),resize(size_t,const T&)
 .Added class WyIConv for ::iconv character set conversion functions

 .Bugfix: integer number conversion overflow
 .Bugfix: integer number conversion (WyTimeSpec)
 .Bugfix: WySysFile family initialization bugfix
 .Functions added in namespace Wy
  full_read(WyByteFlow&, void*, size_t, size_t&)
  full_read(WyByteFlow&, WyStr&, size_t)
  full_write(WyByteFlow&, const char*  , size_t, size_t&)
  full_write(WyByteFlow&, const WyStr& , size_t&)
  full_write(WyByteFlow&, const WyCSeg&, size_t&)
  _scanum(const WyCSeg&, size_t&, ValueType&, const int=0)
 .Added some program examples: a_printf.cpp ,a_readconf.cpp, a_sort.cpp,
  a_dumphex.cpp, a_iconv.cpp
 .Added functions: WyRet link(const WyStr&, const WyStr&)
                   WyRet link(const char*,const char*)
 .library source (larger ones) subdivided into smaller object files (size of
  final executables should be smaller)
 .Manpage bugfixes and revisions

+-------+
| v0.30 |
+-------+
 Classes for function return report are modified. Compiler should complain
 these changes, so it is easier to spot and update except Wy_RepInfo is now
 an abstract class, which need reimplement.

 .Wy_ErrInfo is obsolete, will be removed in latter version.
  An abstract class Wy_RepInfo is added for the removal.
  [hint] The original usecases are supposed like: Wy_ErrInfo ei(cstr);
         Refer to Wy_RepInfo and WyReply manual, define a application class
         (e.g. AppRepInfo inherits Wy_RepInfo), then change the expression to
         AppRepInfo ei(cstr);

 .WyErrMsg changed to WyReply
  [hint] WyReply is now explicitly a pointer like class. Update primarily
         involves member access(so WyRet, too):
         a) change c_errno() to c_repcode()
         b) change c_errstr() to c_repstr()
         c) updating u_errstr() may need an additional buffer by using the
            get_reply member of Wy_RepInfo to get the reply(error) string
         d) change set_ustr(m,cstr) to m->set_reply(cstr,strlen(cstr)+1)
         e) change set_ustr(m,cstr,len) to m->set_reply(cstr,len)
         f) change WyErrMsg::_max_errno to Wy::_max_errno

 .WYM_E... changed name literal to Wym_E
 .Fault changed name literal to Reply
 .WY_USE_FAULT changed name literal to WY_THROW_REPLY
 .Wy_Thread::Running changed name literal to Active
  member running_thread changed name literal to active_threads

 .added functions: Wy::wrd(const WySockAddrINet4::IPaddr&),
  Wy::wrd(const WySockAddrINet6::IPaddr&), Wy::wrd(const WySockAddrINet4&) and
  Wy::wrd(const WySockAddrINet6&)
 .removed WySockAddrINet4::IPAddr::notation() and WySockAddrINet6::IPAddr::
  notation()
  [hint] change expression 't.notation()' to 'Wy::wrd(t)'

 .virtual version of function swap is renamed to _swap. Involved classes are
  WySysFile, WyByteFlow, WyRegFile, WyChrFile, WyTerminal, WySockFile,
  WyFifoFile, Wy_DirFile, Wy_LnkFile, WySockAddrLocal, WySockAddrINet4,
  WySockAddrINet6)
  [Hint] Rename the 'swap' that causes compilation problem to '_swap'
 .bugfix: ::close(int) is now assumed to return with the given file
  descriptor always closed (freely reusable).
 .bugfix of Wy_Array::replace, in case when source element is in *this
 .WyRet added one constructor, WyRet(int)
  [hint] So expressions like 'WY_RETURN(errno)' can be used
 .manuals of WyMutex/WyLock/WyCond removed WYM_EINVAL report
 .added WyByteFlow& operator >>(WyByteFlow&, unsigned char&) and signed char
  version
 .WyStr added members begin(),end()
 .WyByteFlow added a virtual member, _xread(void*,size_t,size_t&), named from
  an early version max_read.
 .added example programs a_popen,a_urandom,a_tcpecho_svr
 .WySockAddrLocal, WySockAddrINet4, WySockAddrINet6 added a virtual member
  'WyRet notation(WyStr&) const'
 .added functions: Wy::_toupper(WyStr&), Wy::_tolower(WyStr&)

+-------+
| v0.29 |
+-------+
 .Wy_Array removed operator+=
  [Hint] change Wy_Array::operator+= to 'push_back'

 .Removed WyCSeg::operator= and Wy_FdSet::operator=. For the library
  rule now implies this.
  [Hint] change 't1=t2' to 't1.reset(t2)' and check the return status

 .Bugfix: const Wy_Array& operator=(const Wy_Array& rhs) relies on
  element type having operator= defined
  [Hint] Element type implement operator=, or change instance 'a=b'
         to 'a.reset(b)'

 .WyStr/WyCSeg _SizeType changed to size_type, _ValueType changed to 
  value_type for easy switch with std::string
 .This library rule for the assign operator modified.
 .Wy_Array added constructor Wy_Array(size_t,const T&), and added support
  for element type being the built-in arithmetic types except
  enum types. And added a member replace(size_t,size_t,size_t,const T&)
 .Added WyDirEnt(const struct dirent&) throw(),
  WyFileStat(const struct stat&) throw(). Not documented.
 .Added Wy::_mkstr(WyStr,Num), _catstr(WyStr,Num), Wy::wrd(Num)
 .Bugfix: WyTimeSpec member add/sub/-(negate) error check
 .WyFileHandle added the move constructor
 .WyStr added find/rfind(size_t*,const WyCSeg&)
 .WyTermios added operator==
 .Added two examples, a_httpreq,a_dct

+-------+
| v0.28 |
+-------+
._strnum(NumType&,const char**,const char*,size_t,..) changed to
  _strnum(NumType&,const char**,WyCSeg,..)
  [hint] Search "_strnum". wrap the arguments by WyCSeg(a,b)
         Note: WyCSeg::Fault may throw

 .WyCSeg::operator() changed name to cseg(..)
  [hint] For WyCSeg object s, change s(n1,n2) to s.cseg(n1,n2)

 --- The following changes are not detected by previous check files ---

 ._alloc(..) of Wy::cin/cout/cerr changed to always fail (WYM_ENOSYS)

 .WyCSeg(const char*)/reset/operator=/operator[] removed throw spec.

 .Wy::_strmove/_strcpy removed throw spec.

 ._mkstr(..)'s scientific notation output: 'E' changed to 'e'

 .add template Wy_Array for dynamic array
  hence many classes have added a move constructor

 .added Wy::_strchr(const WyCSeg&, char)
        Wy::_strrchr(const WyCSeg&, char)
        Wy::_strstr(const WyCSeg&, const WyCSeg&)

 .added Wy::select(Wy_FdSet*,Wy_FdSet*,Wy_FdSet*)  (no timeout version)

 .bugfix: compile with WYLIB_CONFIG_NORSLI
 .bugfix for g++ 4.0.2: Wy_SockAddr added a dummy virtual destructor
 .WySysFile/WyByteFlow add missing document for ftype()
 .add WyByteFlow& operator <<(WyByteFlow&, const void*);
 .add WyStr wrd(const WySockAddrINet4::IPAddr&)
      WyStr wrd(const WySockAddrINet6::IPAddr&)
      WyStr wrd(const WySockAddrLocal&)
 .minor bugs: Wy__RdQue had last minute changes causing some examples won't
  run, examples affected only.

+-------+
| v0.27 |
+-------+
.Bugfix/revision in Rationale.txt, README.TXT, manpages.

 .WyChrFile,WySockFile,WyFifoFile,WyRegFile,WyTerminal added static check
  by hiding some invalid use cases.

 .Wy_DirFile added a member: WyFileHandle fh(void) const throw()

 .Wy_Thread::reset() changed to throw WyRet() from terminate if the thread
  tries to reset itself.

 .Class member _alloc added error code(WYM_ENOSYS) if deriving class did not
  reimplement this member.

 .Bugfix: If macro WYLIB_CONFIG_THROWSPC defined, throw specification of many
  functions has fixed to throw()

 .Some minor bugs.

+-------+
| v0.26 |
+-------+
 .Bugfix: _strnum added (was not) implemented for float types and several
  other bugs, _mkstr/_catstr for long number (float type)

 .Bugfix: ::ntohl..., and WyCSeg default setting, while compiling with -O2,
 
 .WySysFile added a member ftype(), for querrying file type
 .WyByteFlow removed member drain(), added ftype()/_fsync()/_fdatasync()
            /_tcdrain()/_isatty()
  WyChrFile removed member drain(), added _tcdrain()/_isatty(), removed drain()
  WyRegFile removed member drain(), added fsync()/fdatasync()
  WySockFile removed member drain()
  WyFifokFile removed member drain()
  [Hint] For WyByteFlow object t, use ftype() to detect file type and
         use t._fdatasync() or t._tcdrain()
         For WyChrFile object t, use _isatty() to detect for terminal device
         and call _tcdrain()
         For WyRegFile object t, rename drain() to fdatasync()
  
 .Bugfix: WySockFile::sockpair(..),WyFifoFile::mkpipe(..) added an WYM_EINVAL
  error report

 .Wy::cin/cout/cerr changes to not allow be set to default. reset() throws
  WyRet(WYM_EBADF), other resets return WyRet(WYM_EBADF).
  [Hint] If these standard handlers set to default, succeeding use of file
         descriptor will not be predictable by this library.

+-------+
| v0.25 |
+-------+
 .Implement of throw specification changed to compiler option configurable
  the default is empty. See associated paragraph in Rationale.txt

 .Wy::_strnum(..) added a return code WYM_ENOENT, conversion rule adjusted 
  for better use in scanning a string. See manpage wy(3wy).

 .Wy::_strcpy changed argument type to _strcpy(char*,WyCSeg)

 .WyCSeg had many changed for better use. 
  added members WyCSeg(), WyCSeg(const char*,const char*)
       reset(), reset(const char*,const char*), is_default()
  rename addr() to begin()
  rename trail_addr() to end()
  removed resize(size_t)
  [Hint] Compiler should complain the differences.

 .operator>>(WyByteFlow&,WyStr&) changed not to throw while reading no byte
  and minor implement bugfix.
  [Hint] Manual inspect of each occurrence of reading no byte

 .Added template Wy_AtDestroy and functions Wy::_delete_one, Wy::_delete_array

 .WyStr::_setsize(..) changed to return WyRet instead of void
  [Hint] add return code checking for each occurrence

+-------+
| v0.24 |
+-------+
 Significant changes had done with this version, Updating previous source may
 be very difficuly(or may be easy). No update hint is provided for this releass
 (for the chk.. files also changed a lot)

 Wy_Thread have rewritten to adopt NPTL C++ implement. Many functions removed
 throw specification. (there may still be some to remove in the future)

 .All classes that contain virtual member have added a virtual member 
  T* _alloc(WyRet&).
  System file classes have reimplemented to better support polymorphism.

 .Class WySysFile is added as the base class of system files

 .Removed class WyAutoCancPtr

 .All the file read/write function argument n_read/n_written have changed 
  from pointer type to reference type, for pointer is difficult or error prone
  for function wrappers(reuse). This includes WySockFile::sendto/recvfrom.

 .Funcion what_is(..) renamed to wrd(..)
  added Wy::wrd(const WyTimeSpec& num, int radix, size_t frdig),
        Wy::wrd(NumType,int),
        Wy::wrd(NumType,int,size_t),

 .Added functions:
   1.Wy::lstat(..)
   2.Wy::_strftime(WyStr&,const char*,const WyDate&)
   3.Wy::sleep(WyTimeSpec)
   4.Wy::sleep(WyTimeSpec, WyTimeSpec&)

 .WyDate:
  bugfix: default timezone string changed (back)to "UTC"

 .Wy::sleep_till 
  removed WYM_ERANGE error code
  changed protocol to sleep_till(WyTimeSpec)
 
 .WyCond:
  changed protocol wait(WyLock&,WyTimeSpec)

 .WyRegFile:
  removed _read_till(void*,size_t,size_t*),
          _read_till(WyStr&,size_t,size_t*),
          _read_char(char&).
  changed create(WyRegFile&,const char*,int mode_t),
          create(WyRegFile&,const WyStr&,int mode_t),
          create_tmpfile(WyRegFile&,WyStr&) of the first argument type to
          reference type.
  changed _read_till(WyStr&,size_t,size_t&,char)
          _read_till(const char*,size_t,size_t&,char)
  renamed seek_pos_end() to seek_end()

 .WyStr:
  added _setsize(size_t)

 .Wy_Thread:
  exit_code() renamed to exitcode()
  removed wait_stopped(),wait_notnull(),tmain_enter(),tmain_leave()
  added wait_not(ThreadState)
  tmain() changed to have default implement (no longer pure virtual)

 .added a file wy_uty for operator<<,>> overloads (see wy_uty(3wy))

 .class WyDirFile renamed to Wy_DirFile
 .class WyLnkFile renamed to Wy_LnkFile

+-------+
| v0.23 |
+-------+
 .WyByteFlow class family (WyRegFile/WyChrFile/WyTerminal/WySockFile/WyFifoFile)
  1.Added: write(WyCSeg,size_t*)

 .WyByteFlow
  1.removed: WyByteFlow(WyFileHandle), reset(WyFileHandle)
    [Hint] No replacement available.
           Modify provious definition code to free function to use.

 .WyByteFlow/WyChrFile/WyTerminal/WySockFile/WyFifoFile/Wy::cin/Wy::cout/Wy::cerr
  1.bugy&removed: read_till(..), read_char(char&)
    [Hint] Provious version probably worked fine for stream socket only.
           No replacement available. Modify and fix previous function definition
           code to free function to use. This library probably is not considering
           providing such functions.

 .WYM_ENDEFAULT removed
  System file class family no more requires object be default before reset
  [Hint] Search for WYM_ENDEFAULT. Non-default object becomes now resetable.

 .Wy::cin/Wy::cout/Wy::cerr
  1.Bugfix: reset(..), swap(..) changed definition
    [Hint] Check and inspect use codes. These members of the previous version
           were incorrect. See wy(3wy).

 .WYM_EBADCAST removed
  libwy is not using this errmsg
  [Hint] See if the following replacement codes fit:
         static Wy_ErrInfo example_EBADCAST("Type cast failure");
         ...
         const WYM_EBADCAST(example_EBADCAST);

 .WYLIB_CONFIG_RSLI changed to WYLIB_CONFIG_NORSLI
  [Hint] Use compiler option to remove SLI in WyRet
         Examine code see if class size is revalent

 .Library removed the requirement wyreqs.h the first included
  [Hint] library now requires _REENTRANT be defined

 .WySockFile
  1.Added: member sendto(..) and recvfrom(..)

 .Wy::local_tzname() reimplemented
  1. Default time zone string changed to ":UTC"
    [Hint] Serach for "UTC", replace with ":UTC"
  2. WYM_ESRCH removed
    Function now returns ":UTC" if the search failed
    [Hint] See if application code can accept

+-------+
| v0.22 |
+-------+
 .WyLock:
  1.Member unlock() removed and added xlock(..)
   [Hint] redesign (updating should not be difficult, see manpage.)

 .WyThreadID renamed to Wy_ThreadID

 .WYM_VFDIS replaced by WYM_EBADTYPE

 .Library added symbol WYLIB_CONFIG_RSLI to configure using SLI in WyRet
  [Hint] symbol is defined in wyret.h

 .WyStr:
  1.Implement optimized: faster than std::string version on RedHat v9.0

  2.Bugfix: rfind(size_t*,size_t,const WyCSeg&)
            document error fix: append+WYM_ELOOP

  3.Removal: substr(..)
    [Hint] str.substr(..) -> WyStr( str.cseg(..) )

  4.Removal: int strcmp(size_type, size_type,const WyStr&)
             int strcmp(size_type, size_type,const WyCSeg&)
    [Hint] s1.strcmp(1,2,s2) -> WyStr(s1.cseg(1,2)).strcmp(s2) or others

 .WyCSeg
  1.Rename: is_joint(..) renamed to is_overlap(..)
  2.Add: swap(..)
  3.Class definition changed

 .WyDirEnt
  1.Rename: _name() renamed to filename()

 .WyByteTape
  1.Class removed
    [Hint] ? ,try using WyRegFile

 .WyByteFlow
  1.max_read(..) renamed to read_till(..)
    read_line(..) renamed to read_till(..)
    [Hint] WyRegFile, WyChrFile/WyTerminal, WySockFile, WyFifoFIle affected
 
  2.Class defined a protected constructor WyByteFlow(int), application function
    argument using type int becomes ambiguous
    [Hint] function argument(int) need to be expressed explicitly for WyFileHandle
           e.g. reset(int) -> reset( WyFileHandle(int) )
                Wy_FdSet::is_set(int) -> is_set( WyFileHandle(int) )
                Wy_FdSet::set(int) -> set( WyFileHandle(int) )
                Wy_FdSet::clr(int) -> clr( WyFileHanlde(int) )

   3.Removal: Removed WYM_E2BIG (read/write functions)

   4.Polymorphism is in general better supported

 .WyRegFile
  1.Rename: get_pos() renamed to pos()

 .WyFifoFile
  1.Bugfix: mkpipe(..)

 ,WySockFile
  1.Bugfix: sockpair(..)

  2.Bugfix: ::getsockname(..)/::getpeername(..) found to return z-string 
            with the trailing 0 counted. This member rescan sun_path

 .WyMath
  1.Rename: _fsci renamed to _scif

 .Wy_Thread
  1.Bugfix: _cancel_point() renamed to cancel_point()

 .Wy
  1.Add: Wy::select(Wy_FdSet*,Wy_FdSet*,Wy_FdSet*,WyTImeSpec&)

 .WyTimeSpec:
  1.Add: added members mul/div(long) for evaluation

+-------+
| v0.21 |
+-------+
 .Removed std::ostream& operator<< (std::ostream& os, const WyStr& str)
  (note: this is an undocumented internal function)
  1. source file may need to add include <iostream> or others missed
  2. change 'cout<< str' to 'cout<< str.c_str()'
     change 'cout<< Wy::what_is(e)' to 'cout<< Wy::what_is(e).c_str()'
     
 .WyReply member modified
  1. u_errstr(size_t*) changed to u_errstr(size_t&)
     [Hint] change em(*x) to em(x)
            change em(0) to em()

 .WySockAddrLocal members modified
  1. WYM_ENOMEM removed, default/copy constructor become nothrow
  2. family() changed to static function
  3. get_notation(WyStr&) changed to _path()
     [Hint] change a.get_notation(x) to x.reset(a._path())

 .WySockAddrINet renamed to WySockAddrINet4
  [Hint] change WySockAddrINet to WySockAddrINet4
         change include 'wysockaddrinet.h' to 'wysockaddrinet4.h'
  1. family() changed to static function
  2. ip() changed to return WySockAddrINet4::IPAddr
     [Hint] catch type may need change to WySockAddrINet4::IPAddr
            see wyipaddr4(3wy) and wysockaddrinet4(3wy)
  3. WySockAddrINet(unsigned long,unsigned short) changed to 
     WySockAddrInet4(uint32_t,uint16_t) and constructors changed to nothrow
  4. get_notation(WyStr&) removed
     [Hint] change ff.get_notation(str) to ff.ip().notation(str)
  
 .Add WySockAddrINet6 for IPv6 support

 .WySockFile member changes
  1. get_addr(..) renamed to sockname(..)
  2. get_peer_addr(..) renamed to peername(..)
  3. added static function sockpair(..)

 .WyDirEnt member changes
  1.filename() changed to 'const char* _name(void) throw()'
    [Hint] change f.filename() to f._name()
           change f1._name()!=f2._name() to Wy::_strcmp(f1._name(),f2._name())!=0
                  (there may be more to update)
           change f._name().is_default() to f._name()[0]==0
  2.constructor changed to nothrow

 .Wy_FdSet added WyFileHandle support

 .WyStr added function overload
   operator==(const char*)
   operator!=(const char*)
   bool operator==(const char*,const WyStr&)
   bool operator!=(const char*,const WyStr&)

 .WyFileStat constructor changed to nothrow

 .Wy_Thread::begin() added failure WYM_ENFILE

 .WyCond changed to nothrow
  1. return code of wait functions WY_EFAULT changed to WY_EINVAL
  2. return code of wait(WyLock&) WY_EINTR changed to OK

 .WyMutex changed member's throw type to Fault
  [Hint] examine catch type

 .WyLock constructor throw type changed to Fault, other members to nothrow
  [Hint] examine catch type
