home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 March / PCWorld_2008-03_cd.bin / system / ultradefrag / ultradefrag-1.3.0.bin.i386.exe / $WINDIR / System32 / udreportcnv.lua < prev    next >
Text File  |  2008-01-30  |  7KB  |  259 lines

  1. #!/usr/local/bin/lua
  2. --[[
  3.   udreportcnv.lua - UltraDefrag report converter.
  4.   Converts lua reports to HTML and other formats.
  5.   Copyright (c) 2008 by Dmitri Arkhangelski (dmitriar@gmail.com).
  6.  
  7.   This program is free software; you can redistribute it and/or modify
  8.   it under the terms of the GNU General Public License as published by
  9.   the Free Software Foundation; either version 2 of the License, or
  10.   (at your option) any later version.
  11.  
  12.   This program is distributed in the hope that it will be useful,
  13.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.   GNU General Public License for more details.
  16.  
  17.   You should have received a copy of the GNU General Public License
  18.   along with this program; if not, write to the Free Software
  19.   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. --]]
  21.  
  22. -- USAGE: lua udreportcnv.lua <luar file with full path> <path to system32 directory> [-v]
  23.  
  24. -- parse command line
  25. assert(arg[1],"Lua Report file name must be specified!")
  26. assert(arg[2],"Path to the system32 directory\nmust be specified as second parameter!")
  27.  
  28. -- read options
  29. dofile(arg[2] .. "\\udreportopts.lua")
  30.  
  31. -- source file reading
  32. dofile(arg[1])
  33.  
  34.  
  35. -- common functions
  36.  
  37. function write_ansi(f, ...)
  38.     for i, v in ipairs(arg) do f:write(v) end
  39. end
  40.  
  41. function write_unicode(f, ...)
  42.     local b, j
  43.     for i, v in ipairs(arg) do
  44.         j = 1
  45.         while true do
  46.             b = string.byte(v, j)
  47.             if b == nil then break end
  48.             f:write(string.char(b), "\0")
  49.             j = j + 1
  50.         end
  51.     end
  52. end
  53.  
  54. -- write filename to html table; maximum 50 characters per line
  55. function write_ansi_name(f, name)
  56.     local i, j, k, n, len
  57.     local N = max_chars_per_line
  58.     len = string.len(name)
  59.     i = 1
  60.     while len > 0 do
  61.         if len <= N then f:write(string.sub(name,i,i + len - 1)) ; break end 
  62.         j = string.find(name,"\\",i,true)
  63.         if j == nil or j > (i + N) then
  64.             n = N
  65.         else
  66.             k = j
  67.             while true do
  68.                 k = string.find(name,"\\",k + 1,true)
  69.                 if k == nil then break end
  70.                 if k <= (i + N) then j = k else break end
  71.             end
  72.             n = j - i + 1
  73.         end
  74.         f:write(string.sub(name,i,i + n - 1), "<br />")
  75.         if n == 0 then break end -- erroneous situation
  76.         i = i + n
  77.         len = len - n
  78.     end
  79. end
  80.  
  81. function write_chars(f, chars, i, j)
  82.     local k
  83.     for k=i,j do f:write(chars[k]) end
  84. end
  85.  
  86. function find_char(chars, ch, i)
  87.     local k = i
  88.     local result = nil
  89.     while chars[k] ~= nil do
  90.         if chars[k] == ch and chars[k + 1] == '\0' then
  91.             result = k ; break
  92.         end
  93.         k = k + 1
  94.     end
  95.     return result
  96. end
  97.  
  98. function write_unicode_name(f, chars, len)
  99.     local i, j, k, n
  100.     local N = max_chars_per_line * 2
  101.     i = 1
  102.     while len > 0 do
  103.         if len <= N then write_chars(f,chars,i,i + len - 1) ; break end 
  104.         j = find_char(chars,'\\',i)
  105.         if j == nil or j > (i + N) then
  106.             n = N
  107.         else
  108.             k = j
  109.             while true do
  110.                 k = find_char(chars,'\\',k + 1)
  111.                 if k == nil then break end
  112.                 if k <= (i + N) then j = k else break end
  113.             end
  114.             n = j - i + 1 + 1 -- because unicode backslash is '\\\0'
  115.         end
  116.         write_chars(f,chars,i,i + n - 1)
  117.         write_unicode(f,"<br />")
  118.         if n == 0 then break end -- erroneous situation
  119.         i = i + n
  120.         len = len - n
  121.     end
  122. end
  123.  
  124. -- converters
  125.  
  126. table_head = [[
  127. <tr>
  128. <td class="c"><a href="javascript:sort_items('fragments')" style="color: #0000FF"># fragments</a></td>
  129. <td class="c"><a href="javascript:sort_items('name')" style="color: #0000FF">filename</a></td>
  130. <td class="c"><a href="javascript:sort_items('comment')" style="color: #0000FF">comment</a></td>
  131. </tr>
  132. ]]
  133.  
  134. end_of_page = [[
  135. </center>
  136. <script language="javascript">
  137. init_sorting_engine();
  138. </script>
  139. </body></html>
  140. ]]
  141.  
  142. links_x1 = [[
  143. <table width="100%"><tbody>
  144. <tr>
  145. <td style="text-align: left"><a href="http://ultradefrag.sourceforge.net" style="color: #0000FF">Visit our Homepage</a></td>
  146. <td style="text-align: center"><a 
  147. ]]
  148.  
  149. links_x2 = [[
  150. style="color: #0000FF">View report options</a></td>
  151. <td style="text-align: right">
  152. <a href="http://www.lua.org/" style="color: #0000FF">Powered by Lua</a>
  153. </td>
  154. </tr>
  155. </tbody></table>
  156. ]]
  157.  
  158. function produce_html_output()
  159.     local filename
  160.     local pos = 0
  161.     local js
  162.     local links = links_x1 .. "href=\"file:///" .. arg[2] .. "\\udreportopts.lua\" " .. links_x2
  163.  
  164.     repeat
  165.         pos = string.find(arg[1],"\\",pos + 1,true)
  166.         if pos == nil then filename = "FRAGLIST.HTM" ; break end
  167.     until string.find(arg[1],"\\",pos + 1,true) == nil
  168.     filename = string.sub(arg[1],1,pos) .. "FRAGLIST.HTM"
  169.  
  170.     -- note that 'b' flag is needed for utf-16 files
  171.     local f = assert(io.open(filename,"wb"))
  172.  
  173.     local write_data
  174.     if use_utf16 == 0 then
  175.         write_data = write_ansi
  176.     else
  177.         write_data = write_unicode
  178.     end
  179.  
  180.     if(enable_sorting == 1) then
  181.         -- read udsorting.js file contents
  182.         local f2 = assert(io.open(arg[2] .. "\\udsorting.js", "r"))
  183.         js = f2:read("*all")
  184.         f2:close()
  185.     else
  186.         js = "function init_sorting_engine(){}\nfunction sort_items(criteria){}\n"
  187.     end
  188.     write_data(f,
  189.         "<html><head><title>Fragmented files on ", volume_letter,
  190.         ":</title>\n", style,
  191.         "<script language=\"javascript\">\n", js,
  192.         "</script>\n</head>\n",
  193.         "<body>\n<center>\n", title_tags.open,
  194.         "Fragmented files on ", volume_letter,
  195.         ":", title_tags.close,
  196.         "\n", links, "\n",
  197.         "<div id=\"for_msie\">\n",
  198.         "<table id=\"main_table\" ", table_style, ">\n",
  199.         table_head
  200.         )
  201.     for i, v in ipairs(files) do
  202.         local class
  203.         if v.filtered == 1 then class = "f" else class = "u" end
  204.         write_data(f,
  205.             "<tr class=\"", class, "\"><td class=\"c\">", v.fragments,
  206.             "</td><td>"
  207.             )
  208.         if use_utf16 == 0 then
  209.             -- each <> brackets must be replaced with square brackets
  210.             local tmp = string.gsub(v.name,"<","[")
  211.             tmp = string.gsub(tmp,">","]")
  212.             if split_long_names == 1 then
  213.                 write_ansi_name(f,tmp)
  214.             else
  215.                 f:write(tmp)
  216.             end
  217.         else
  218.             if split_long_names == 1 then
  219.                 local chars = {}
  220.                 local i = 1
  221.                 for j, b in ipairs(v.uname) do
  222.                     chars[i] = string.char(b)
  223.                     i = i + 1
  224.                 end
  225.                 write_unicode_name(f,chars,i - 1)
  226.             else
  227.                 for j, b in ipairs(v.uname) do
  228.                     f:write(string.char(b))
  229.                 end
  230.             end
  231.         end
  232.         write_data(f,
  233.             "</td><td class=\"c\">", v.comment,
  234.             "</td></tr>\n"
  235.             )
  236.     end
  237.     write_data(f,
  238.         "</table>\n</div>\n", links, "\n"
  239.         )
  240.     write_data(f,end_of_page)
  241.     f:close()
  242.     
  243.     -- if option -v is specified, open report in default web browser
  244.     if arg[3] == "-v" then
  245.         if os.shellexec ~= nil then
  246.             os.shellexec(filename,"open")
  247.         else
  248.             os.execute("cmd.exe /C " .. filename)
  249.         end
  250.     end
  251. end
  252.  
  253.  
  254. -- main source code
  255. -- convertion to other (readable) formats
  256. if produce_html == 1 then
  257.     produce_html_output()
  258. end
  259.