Write('<!doctype html>\r\n')
Write('<title>redbean</title>\r\n')
Write('<style>\r\n')
Write('td,th { padding: 2px 5px; }\r\n')
Write('td { white-space: nowrap; }\r\n')
Write('.l { text-align: left; }\r\n')
Write('.r { text-align: right; }\r\n')
Write('</style>\r\n')

Write('<h3>UNIX Directory Stream Demo</h3>\r\n')
Write('<table>\r\n')
Write('<thead>\r\n')
Write('<tr>\r\n')
Write('<th class=l>name\r\n')
Write('<th>type\r\n')
Write('<th class=r>ino\r\n')
Write('<th class=r>off\r\n')
Write('<th class=r>size\r\n')
Write('<th class=r>blocks\r\n')
Write('<th class=r>mode\r\n')
Write('<th class=r>uid\r\n')
Write('<th class=r>gid\r\n')
Write('<th class=r>dev\r\n')
Write('<th class=r>rdev\r\n')
Write('<th class=r>nlink\r\n')
Write('<th class=r>blksize\r\n')
Write('<th class=r>gen\r\n')
Write('<th class=r>flags\r\n')
Write('<th class=r>birthtim\r\n')
Write('<th class=r>mtim\r\n')
Write('<th class=r>atim\r\n')
Write('<th class=r>ctim\r\n')
Write('<tbody>\r\n')

dir = '.'
for name, kind, ino, off in assert(unix.opendir(dir)) do
   Write('<tr>\r\n')

   Write('<td>')
   Write(EscapeHtml(name))
   if kind == unix.DT_DIR then
      Write('/')
   end
   Write('\r\n')

   Write('<td>')
   if kind == unix.DT_REG then      Write('DT_REG')
   elseif kind == unix.DT_DIR then  Write('DT_DIR')
   elseif kind == unix.DT_FIFO then Write('DT_FIFO')
   elseif kind == unix.DT_CHR then  Write('DT_CHR')
   elseif kind == unix.DT_BLK then  Write('DT_BLK')
   elseif kind == unix.DT_LNK then  Write('DT_LNK')
   elseif kind == unix.DT_SOCK then Write('DT_SOCK')
   else                             Write('DT_UNKNOWN')
   end
   Write('\r\n')

   Write('<td class=r>%d\r\n' % {ino})
   Write('<td class=r>%d\r\n' % {off})

   st,err = unix.stat(dir..'/'..name, unix.AT_SYMLINK_NOFOLLOW)
   if st then

      Write('<td class=r>%d\r\n' % {st:size()})
      Write('<td class=r>%d\r\n' % {st:blocks()})
      Write('<td class=r>%.7o\r\n' % {st:mode()})
      Write('<td class=r>%d\r\n' % {st:uid()})
      Write('<td class=r>%d\r\n' % {st:gid()})
      Write('<td class=r>%d\r\n' % {st:dev()})
      Write('<td class=r>%d,%d\r\n' % {unix.major(st:rdev()), unix.minor(st:rdev())})
      Write('<td class=r>%d\r\n' % {st:nlink()})
      Write('<td class=r>%d\r\n' % {st:blksize()})
      Write('<td class=r>%d\r\n' % {st:gen()})
      Write('<td class=r>%#x\r\n' % {st:flags()})

      function WriteTime(unixsec,nanos)
         year,mon,mday,hour,min,sec,gmtoffsec = unix.localtime(unixsec)
         Write('<td class=r>%.4d-%.2d-%.2dT%.2d:%.2d:%.2d.%.9d%+.2d%.2d\r\n' % {
                  year, mon, mday, hour, min, sec, nanos,
                  gmtoffsec / (60 * 60), math.abs(gmtoffsec) % 60})
      end

      WriteTime(st:birthtim())
      WriteTime(st:mtim())
      WriteTime(st:atim())
      WriteTime(st:ctim())

   else
      Write('<td class=l colspan=15>%s\r\n' % {err})
   end

end
Write('</table>\r\n')