home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / usr / share / YaST2 / modules / AsciiFile.ycp < prev    next >
Text File  |  2006-11-29  |  8KB  |  334 lines

  1. /**
  2.  * Module:         AsciiFile.ycp
  3.  *
  4.  * Authors:        Thomas Fehr (fehr@suse.de)
  5.  *
  6.  * Purpose:         Handle reading and modifying of ascii files.
  7.  *
  8.  * $Id: AsciiFile.ycp 29706 2006-04-05 09:37:17Z fehr $
  9.  */
  10. {
  11. module "AsciiFile";
  12.  
  13. textdomain "base";
  14.  
  15. string blanks = "                                                             ";
  16.  
  17. /**
  18.  * Sets the string how the comment starts
  19.  *
  20.  * @param map        file content
  21.  * @param string    comment delimiter
  22.  */
  23. global define void SetComment( map& file, string comment )
  24.     ``{
  25.     file["comment"] = comment + ".*";
  26.     };
  27.  
  28. /**
  29.  * Sets the widths of records on one line
  30.  *
  31.  * @param map        file content
  32.  * @param list        of widths
  33.  */
  34. global define void SetListWidth( map& file, list widths )
  35.     ``{
  36.     file["widths"] = widths;
  37.     };
  38.  
  39. /**
  40.  * Sets the delimiter between the records on one line
  41.  *
  42.  * @param map        file content
  43.  * @param string    delimiter
  44.  */
  45. global define void SetDelimiter( map& file, string delim )
  46.     ``{
  47.     file["delim"] = delim;
  48.     };
  49.  
  50. /**
  51.  * Private function
  52.  */
  53. define string AssertLineValid( map& file, integer line )
  54.     ``{
  55.     if( haskey( file["l"]:$[], line ) && file["l",line,"buildline"]:false )
  56.     {
  57.     string delim = substring( file["delim"]:" ", 0, 1 );
  58.     string lstr = "";
  59.     integer num = 0;
  60.     foreach( string text, file["l",line,"fields"]:[],
  61.         ``{
  62.         if( num>0 )
  63.         lstr = lstr + delim;
  64.         lstr = lstr + text;
  65.         if( size(text)<file["widths",num]:0 )
  66.         {
  67.         lstr = lstr + substring( blanks, 0,
  68.                                  file["widths",num]:0-size(text) );
  69.         }
  70.         num = num+1;
  71.         });
  72.     file["l",line,"line"] = lstr;
  73.     file["l",line,"buildline"] = false;
  74.     
  75.     return lstr;
  76.     }
  77.     return file["l",line,"line"]:"";
  78.     }
  79.  
  80. /**
  81.  * Reads the file from the disk
  82.  *
  83.  * @param map        file content
  84.  * @param string    file name
  85.  */
  86. global define void ReadFile( map& file, string pathname )
  87.     ``{
  88.     y2milestone( "path=%1", pathname );
  89.     list<string> lines = [];
  90.     if( SCR::Read( .target.size, pathname ) > 0 )
  91.     {
  92.     string value = (string)SCR::Read( .target.string, pathname );
  93.     lines = splitstring( value, "\n" );
  94.     }
  95.     integer lineno = 1;
  96.     map lmap = $[];
  97.     foreach( string line, lines,
  98.     ``{
  99.     map l = $[];
  100.     l["line"] = line;
  101.     if( size(file["comment"]:"")>0 && regexpmatch( line, file["comment"]:"" ) )
  102.         {
  103.         l["comment"] = true;
  104.         }
  105.     if( !l["comment"]:false && size(file["delim"]:"")>0 )
  106.         {
  107.         integer pos = 0;
  108.         list fields = [];
  109.         while( size(line)>0 )
  110.         {
  111.         pos = findfirstnotof( line, file["delim"]:"" );
  112.         if( pos != nil && pos>0 )
  113.             {
  114.             line = substring( line, pos );
  115.             }
  116.         pos = findfirstof( line, file["delim"]:"" );
  117.         if( pos != nil && pos>0 )
  118.             {
  119.             fields = add( fields, substring( line, 0, pos ) );
  120.             line = substring( line, pos );
  121.             }
  122.         else
  123.             {
  124.             fields = add( fields, line );
  125.             line = "";
  126.             }
  127.         }
  128.         l["fields"] = fields;
  129.         }
  130.     lmap[lineno] = l;
  131.     lineno = lineno + 1;
  132.     });
  133.     if( size(lmap)>0 && size(lmap[lineno-1,"line"]:"")==0 )
  134.     lmap = remove( lmap, lineno-1 );
  135.     file["l"] = lmap;
  136.     };
  137.  
  138. /**
  139.  * Returns the list of rows where matches searched string in the defined column
  140.  *
  141.  * @param map            file content
  142.  * @param integer        column (counted from 0 to n)
  143.  * @param string        searched string
  144.  * @return list<integer>    matching rows
  145.  */
  146. global define list<integer> FindLineField( map file, integer field, string content )
  147.     ``{
  148.     list<integer> ret = [];
  149.     foreach( integer num, map line, file["l"]:$[],
  150.     ``{
  151.     if( !line["comment"]:false && line["fields",field]:"" == content )
  152.         {
  153.         ret = add( ret, num );
  154.         }
  155.     });
  156.     y2milestone( "field %1 content %2 ret %3", field, content, ret );
  157.     return( ret );
  158.     }
  159.  
  160. /**
  161.  * Returns map of wanted lines
  162.  *
  163.  * @param map            file content
  164.  * @param list<integer>        rows (counted from 1 to n)
  165.  * @return map<integer, map>    with wanted lines
  166.  */
  167. global define map<integer, map>  GetLines( map& file, list<integer> lines )
  168.     ``{
  169.     map<integer, map> ret = $[];
  170.     foreach( integer num, lines,
  171.     ``{
  172.     if( haskey( file["l"]:$[], num ) )
  173.         {
  174.         AssertLineValid( file, num );
  175.         ret[num] = file["l",num]:$[];
  176.         }
  177.     });
  178.     y2milestone( "lines %1 ret %2", lines, ret );
  179.     return( ret );
  180.     };
  181.  
  182. /**
  183.  * Returns map of wanted line
  184.  *
  185.  * @param map        file content
  186.  * @param integer    row number (counted from 1 to n)
  187.  * @return map        of wanted line
  188.  */
  189. global define map GetLine( map& file, integer line )
  190.     ``{
  191.     map ret = $[];
  192.     if( haskey( file["l"]:$[], line ) )
  193.     {
  194.     AssertLineValid( file, line );
  195.     ret = file["l",line]:$[];
  196.     }
  197.     y2milestone( "line %1 ret %2", line, ret );
  198.     return( ret );
  199.     };
  200.  
  201.  
  202. /**
  203.  * Returns count of lines in file
  204.  *
  205.  * @param map        file content
  206.  * @return integer    count of lines
  207.  */
  208. global define integer NumLines( map file )
  209.     ``{
  210.     return( size(file["l"]:$[]) );
  211.     }
  212.  
  213. /**
  214.  * Changes the record in the file defined by row and column
  215.  *
  216.  * @param map        file content
  217.  * @param integer    row number (counted from 1 to n)
  218.  * @param integer    column number (counted from 0 to n)
  219.  */
  220. global define void ChangeLineField( map& file, integer line, integer field,
  221.                                     string entry )
  222.     ``{
  223.     y2debug( "line %1 field %2 entry %3", line, field, entry );
  224.     boolean changed = false;
  225.     if( !haskey( file["l"]:$[], line ))
  226.     {
  227.     file["l",line] = $[];
  228.     file["l",line,"fields"] = [];
  229.     }
  230.     if( size(file["l",line,"fields"]:[])<field )
  231.     {
  232.     changed = true;
  233.     integer i = 0;
  234.     while( i<field )
  235.         {
  236.         if( size(file["l",line,"fields",i]:"")==0 )
  237.         file["l",line,"fields",i] = "";
  238.         i = i + 1;
  239.         }
  240.     }
  241.     if( file["l",line,"fields",field]:"" != entry )
  242.     {
  243.     file["l",line,"fields",field] = entry;
  244.     changed = true;
  245.     }
  246.     if( changed )
  247.     {
  248.     file["l",line,"changed"] = true;
  249.     file["l",line,"buildline"] = true;
  250.     }
  251.     }
  252.  
  253. /**
  254.  * Changes a complete line 
  255.  *
  256.  * @param map        file content
  257.  * @param integer    row number (counted from 1 to n)
  258.  * @param list            of new entries on the line
  259.  */
  260. global define void ReplaceLine( map& file, integer line,
  261.                 list<string> entry )
  262.     ``{
  263.     y2debug( "line %1 entry %2", line, entry );
  264.     boolean changed = false;
  265.     if( !haskey( file["l"]:$[], line ))
  266.     {
  267.     file["l",line] = $[];
  268.     }
  269.     file["l",line,"fields"] = entry;
  270.     file["l",line,"changed"] = true;
  271.     file["l",line,"buildline"] = true;
  272.     }
  273.  
  274. /**
  275.  * Appends a new line at the bottom
  276.  *
  277.  * @param map    file content
  278.  * @param list    of new entries on one line
  279.  */
  280. global define void AppendLine( map& file, list entry )
  281.     ``{
  282.     integer line = size(file["l"]:$[]) + 1;
  283.     y2debug( "new line %1 entry %2", line, entry );
  284.     file["l",line] = $[];
  285.     file["l",line,"fields"] = entry;
  286.     file["l",line,"changed"] = true;
  287.     file["l",line,"buildline"] = true;
  288.     }
  289.  
  290. /**
  291.  * Removes lines
  292.  *
  293.  * @param map        file content
  294.  * @param list<integer>    lines to remove (counted from 1 to n)
  295.  */
  296. global define void RemoveLines( map& file, list<integer> lines )
  297.     ``{
  298.     y2debug( "lines %1", lines );
  299.     foreach( integer num, lines,
  300.     ``{
  301.     if( haskey( file["l"]:$[], num ))
  302.         {
  303.         file["l"] = remove( file["l"]:$[], num );
  304.         }
  305.     });
  306.     }
  307.  
  308. /**
  309.  * Writes a content into the file
  310.  *
  311.  * @param map        file content
  312.  * @param string    file name
  313.  */
  314. global define void RewriteFile( map& file, string fpath )
  315.     ``{
  316.     y2milestone( "path %1", fpath );
  317.     y2debug( "out: %1", file );
  318.     string out = "";
  319.     foreach( integer num, map entry, file["l"]:$[],
  320.     ``{
  321.     out = out + AssertLineValid( file, num ) + "\n";
  322.     });
  323.     y2debug ("Out text: %1", out );
  324.     if( size(out)==0 )
  325.     {
  326.     if( SCR::Read( .target.size, fpath ) >= 0 )
  327.         SCR::Execute( .target.remove, fpath );
  328.     }
  329.     else
  330.     SCR::Write( .target.string, fpath, out );
  331.     }
  332.  
  333. }
  334.