mirror of
				https://github.com/Ryujinx/GtkSharp.git
				synced 2025-11-04 13:04:53 +00:00 
			
		
		
		
	2002-01-16 Mike Kestner <mkestner@speakeasy.net>
* generator/BoxedGen.cs : New boxed type generatable. * generator/ObjectGen.cs : Add boxed type property generation and stub off interface properties for now. * generator/Parser.cs : Add boxed element parsing. * generator/SymbolTable.cs : Add IsBoxed and IsInterface methods. * glib/Boxed.cs : New base class for deriving boxed types. * glib/Object.cs : Add boxed GetProp/SetProp methods. * parser/gapi2xml.pl : Add boxed type element formatting. * parser/gapi_pp.pl : Add preprocessing of the generated sourcefiles. Handle the builtins and make them identifiable to the xml generator. svn path=/trunk/gtk-sharp/; revision=2012
This commit is contained in:
		
							parent
							
								
									9fcf82d28e
								
							
						
					
					
						commit
						88175147cf
					
				
							
								
								
									
										13
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								ChangeLog
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -1,3 +1,16 @@
 | 
			
		|||
2002-01-16  Mike Kestner <mkestner@speakeasy.net>
 | 
			
		||||
 | 
			
		||||
	* generator/BoxedGen.cs : New boxed type generatable.
 | 
			
		||||
	* generator/ObjectGen.cs : Add boxed type property generation and stub
 | 
			
		||||
	  off interface properties for now.
 | 
			
		||||
	* generator/Parser.cs : Add boxed element parsing.
 | 
			
		||||
	* generator/SymbolTable.cs : Add IsBoxed and IsInterface methods.
 | 
			
		||||
	* glib/Boxed.cs : New base class for deriving boxed types.
 | 
			
		||||
	* glib/Object.cs : Add boxed GetProp/SetProp methods.
 | 
			
		||||
	* parser/gapi2xml.pl : Add boxed type element formatting.
 | 
			
		||||
	* parser/gapi_pp.pl : Add preprocessing of the generated sourcefiles.
 | 
			
		||||
	  Handle the builtins and make them identifiable to the xml generator.
 | 
			
		||||
 | 
			
		||||
2002-01-11  Mike Kestner <mkestner@speakeasy.net>
 | 
			
		||||
 | 
			
		||||
	* generator/ObjectGen.cs : Add property generation.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										109
									
								
								generator/BoxedGen.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								generator/BoxedGen.cs
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,109 @@
 | 
			
		|||
// GtkSharp.Generation.BoxedGen.cs - The Boxed Type Generatable.
 | 
			
		||||
//
 | 
			
		||||
// Author: Mike Kestner <mkestner@speakeasy.net>
 | 
			
		||||
//
 | 
			
		||||
// (c) 2001-2002 Mike Kestner
 | 
			
		||||
 | 
			
		||||
namespace GtkSharp.Generation {
 | 
			
		||||
 | 
			
		||||
	using System;
 | 
			
		||||
	using System.IO;
 | 
			
		||||
	using System.Xml;
 | 
			
		||||
 | 
			
		||||
	public class BoxedGen : StructBase, IGeneratable  {
 | 
			
		||||
		
 | 
			
		||||
		public BoxedGen (String ns, XmlElement elem) : base (ns, elem) {}
 | 
			
		||||
		
 | 
			
		||||
		public String Name {
 | 
			
		||||
			get
 | 
			
		||||
			{
 | 
			
		||||
				return elem.GetAttribute("name");
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public String QualifiedName {
 | 
			
		||||
			get
 | 
			
		||||
			{
 | 
			
		||||
				return ns + "." + elem.GetAttribute("name");
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public String CName {
 | 
			
		||||
			get
 | 
			
		||||
			{
 | 
			
		||||
				return elem.GetAttribute("cname");
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public String MarshalType {
 | 
			
		||||
			get
 | 
			
		||||
			{
 | 
			
		||||
				return QualifiedName;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public String CallByName (String var_name)
 | 
			
		||||
		{
 | 
			
		||||
			return var_name + ".Raw";
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public void Generate (SymbolTable table)
 | 
			
		||||
		{
 | 
			
		||||
			if (!Directory.Exists("..\\" + ns.ToLower() + "\\generated")) {
 | 
			
		||||
				Directory.CreateDirectory("..\\"+ns.ToLower()+"\\generated");
 | 
			
		||||
			}
 | 
			
		||||
			String filename = "..\\" + ns.ToLower() + "\\generated\\" + Name + ".cs";
 | 
			
		||||
			
 | 
			
		||||
			FileStream stream = new FileStream (filename, FileMode.Create, FileAccess.Write);
 | 
			
		||||
			StreamWriter sw = new StreamWriter (stream);
 | 
			
		||||
			
 | 
			
		||||
			sw.WriteLine ("// Generated File.  Do not modify.");
 | 
			
		||||
			sw.WriteLine ("// <c> 2001-2002 Mike Kestner");
 | 
			
		||||
			sw.WriteLine ();
 | 
			
		||||
			
 | 
			
		||||
			sw.WriteLine ("namespace " + ns + " {");
 | 
			
		||||
			sw.WriteLine ();
 | 
			
		||||
				
 | 
			
		||||
			sw.WriteLine ("\tusing System;");
 | 
			
		||||
			sw.WriteLine ("\tusing System.Collections;");
 | 
			
		||||
			sw.WriteLine ("\tusing System.Runtime.InteropServices;");
 | 
			
		||||
			sw.WriteLine ();
 | 
			
		||||
			
 | 
			
		||||
			sw.WriteLine ("\t[StructLayout(LayoutKind.Sequential)]");
 | 
			
		||||
			sw.WriteLine ("\tpublic class " + Name + " : GtkSharp.Boxed {");
 | 
			
		||||
			sw.WriteLine ();
 | 
			
		||||
				
 | 
			
		||||
			foreach (XmlNode node in elem.ChildNodes) {
 | 
			
		||||
				
 | 
			
		||||
				XmlElement member = (XmlElement) node;
 | 
			
		||||
 | 
			
		||||
				switch (node.Name) {
 | 
			
		||||
				case "field":
 | 
			
		||||
					// GenField(member, table, sw);
 | 
			
		||||
					break;
 | 
			
		||||
					
 | 
			
		||||
				case "callback":
 | 
			
		||||
					break;
 | 
			
		||||
					
 | 
			
		||||
				case "constructor":
 | 
			
		||||
					break;
 | 
			
		||||
					
 | 
			
		||||
				case "method":
 | 
			
		||||
					break;
 | 
			
		||||
					
 | 
			
		||||
				default:
 | 
			
		||||
					Console.WriteLine ("Unexpected node");
 | 
			
		||||
					break;
 | 
			
		||||
				}		
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			sw.WriteLine ("\t}");
 | 
			
		||||
			sw.WriteLine ();
 | 
			
		||||
			sw.WriteLine ("}");
 | 
			
		||||
			
 | 
			
		||||
			sw.Flush();
 | 
			
		||||
			sw.Close();
 | 
			
		||||
		}		
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -135,6 +135,12 @@ namespace GtkSharp.Generation {
 | 
			
		|||
			
 | 
			
		||||
			if (table.IsObject(c_type)) {
 | 
			
		||||
				m_type = "GLib.Object";
 | 
			
		||||
			} else if (table.IsBoxed(c_type)) {
 | 
			
		||||
				m_type = "GtkSharp.Boxed";
 | 
			
		||||
			} else if (table.IsInterface(c_type)) {
 | 
			
		||||
				// FIXME: Handle interface props properly.
 | 
			
		||||
				Console.Write("Interface property detected ");
 | 
			
		||||
				return true;
 | 
			
		||||
			} else {
 | 
			
		||||
				m_type = table.GetMarshalType(c_type);
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -72,6 +72,10 @@ namespace GtkSharp.Generation {
 | 
			
		|||
 | 
			
		||||
				case "alias":
 | 
			
		||||
					break;
 | 
			
		||||
					
 | 
			
		||||
				case "boxed":
 | 
			
		||||
					table.AddType (new BoxedGen (ns_name, elem));
 | 
			
		||||
					break;
 | 
			
		||||
 | 
			
		||||
				case "callback":
 | 
			
		||||
					table.AddType (new CallbackGen (ns_name, elem));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -94,10 +94,9 @@ namespace GtkSharp.Generation {
 | 
			
		|||
				default:
 | 
			
		||||
					Console.WriteLine ("Unexpected node");
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				}		
 | 
			
		||||
			}
 | 
			
		||||
				
 | 
			
		||||
			
 | 
			
		||||
			sw.WriteLine ("\t}");
 | 
			
		||||
			sw.WriteLine ();
 | 
			
		||||
			sw.WriteLine ("}");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -105,6 +105,28 @@ namespace GtkSharp.Generation {
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public bool IsBoxed(String c_type)
 | 
			
		||||
		{
 | 
			
		||||
			if (complex_types.ContainsKey(c_type)) {
 | 
			
		||||
				IGeneratable gen = (IGeneratable) complex_types[c_type];
 | 
			
		||||
				if (gen is BoxedGen) {
 | 
			
		||||
					return true;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public bool IsInterface(String c_type)
 | 
			
		||||
		{
 | 
			
		||||
			if (complex_types.ContainsKey(c_type)) {
 | 
			
		||||
				IGeneratable gen = (IGeneratable) complex_types[c_type];
 | 
			
		||||
				if (gen is InterfaceGen) {
 | 
			
		||||
					return true;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		public bool IsObject(String c_type)
 | 
			
		||||
		{
 | 
			
		||||
			if (complex_types.ContainsKey(c_type)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -115,7 +137,6 @@ namespace GtkSharp.Generation {
 | 
			
		|||
			}
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										66
									
								
								glib/Boxed.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								glib/Boxed.cs
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,66 @@
 | 
			
		|||
// GtkSharp.Boxed.cs - Base class for deriving marshallable structures.
 | 
			
		||||
//
 | 
			
		||||
// Author: Mike Kestner <mkestner@speakeasy.net>
 | 
			
		||||
//
 | 
			
		||||
// (c) 2001-2002 Mike Kestner
 | 
			
		||||
 | 
			
		||||
namespace GtkSharp {
 | 
			
		||||
 | 
			
		||||
	using System;
 | 
			
		||||
	using System.Runtime.InteropServices;
 | 
			
		||||
 | 
			
		||||
	/// <summary> 
 | 
			
		||||
	///	Boxed Class
 | 
			
		||||
	/// </summary>
 | 
			
		||||
	///
 | 
			
		||||
	/// <remarks>
 | 
			
		||||
	///	An abstract base class to derive structures and marshal them.
 | 
			
		||||
	/// </remarks>
 | 
			
		||||
 | 
			
		||||
	public abstract class Boxed {
 | 
			
		||||
 | 
			
		||||
		IntPtr	_raw;
 | 
			
		||||
 | 
			
		||||
		// Destructor is required since we are allocating unmanaged
 | 
			
		||||
		// heap resources.
 | 
			
		||||
 | 
			
		||||
		~Boxed ()
 | 
			
		||||
		{
 | 
			
		||||
			Marshal.FreeHGlobal (_raw);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		///	Raw Property
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		/// 
 | 
			
		||||
		/// <remarks>
 | 
			
		||||
		///	Gets a marshallable IntPtr.
 | 
			
		||||
		/// </remarks>
 | 
			
		||||
 | 
			
		||||
		public IntPtr Raw {
 | 
			
		||||
			get {
 | 
			
		||||
				if (_raw == IntPtr.Zero) {
 | 
			
		||||
					// FIXME: Ugly hack.
 | 
			
		||||
					_raw = Marshal.AllocHGlobal (128);
 | 
			
		||||
					Marshal.StructureToPtr (this, _raw, true);
 | 
			
		||||
				}
 | 
			
		||||
				return _raw;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		///	GetBoxed Shared Method
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		/// 
 | 
			
		||||
		/// <remarks>
 | 
			
		||||
		///	Gets a managed class representing a raw ref.
 | 
			
		||||
		/// </remarks>
 | 
			
		||||
 | 
			
		||||
		public static Boxed GetBoxed (IntPtr raw)
 | 
			
		||||
		{
 | 
			
		||||
			// FIXME: Use the type manager to box the raw ref.
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -306,6 +306,26 @@ namespace GLib {
 | 
			
		|||
			val = GLib.Object.GetObject (obj);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		///	GetProperty Method
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		///
 | 
			
		||||
		/// <remarks>
 | 
			
		||||
		///	Accesses a Boxed Property.
 | 
			
		||||
		/// </remarks>
 | 
			
		||||
 | 
			
		||||
		public void GetProperty (String name, out GtkSharp.Boxed val)
 | 
			
		||||
		{
 | 
			
		||||
			IntPtr raw;
 | 
			
		||||
			g_object_get (RawObject, 
 | 
			
		||||
				      Marshal.StringToHGlobalAnsi (name), 
 | 
			
		||||
				      out raw, new IntPtr (0));
 | 
			
		||||
			val = GtkSharp.Boxed.GetBoxed (raw);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		///	GetProperty Method
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		///	GetProperty Method
 | 
			
		||||
		/// </summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -475,6 +495,21 @@ namespace GLib {
 | 
			
		|||
				      val.Handle, new IntPtr (0));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		///	SetProperty Method
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		///
 | 
			
		||||
		/// <remarks>
 | 
			
		||||
		///	Changes the value of a Boxed Property.
 | 
			
		||||
		/// </remarks>
 | 
			
		||||
 | 
			
		||||
		public void SetProperty (String name, GtkSharp.Boxed val)
 | 
			
		||||
		{
 | 
			
		||||
			g_object_set (RawObject, 
 | 
			
		||||
				      Marshal.StringToHGlobalAnsi (name), 
 | 
			
		||||
				      val.Raw, new IntPtr (0));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
		[DllImport("gtk-1.3.dll")]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -89,6 +89,14 @@ while ($line = <STDIN>) {
 | 
			
		|||
			last if ($line =~ /^}/);
 | 
			
		||||
		}
 | 
			
		||||
		$pedefs{$class} = $pedef;
 | 
			
		||||
	} elsif ($line =~ /g_boxed_type_register_static/) {
 | 
			
		||||
		$boxdef = $line;
 | 
			
		||||
		while ($line !~ /;/) {
 | 
			
		||||
			$boxdef .= ($line = <STDIN>);
 | 
			
		||||
		}
 | 
			
		||||
		$boxdef =~ s/\n\s*//g;
 | 
			
		||||
		$boxdef =~ /\(\"(\w+)\"/;
 | 
			
		||||
		$boxdefs{$1} = $boxdef;
 | 
			
		||||
	} elsif ($line =~ /^(const|G_CONST_RETURN)?\s*\w+\s*\**\s*(\w+)\s*\(/) {
 | 
			
		||||
		$fname = $2;
 | 
			
		||||
		$fdef = "";
 | 
			
		||||
| 
						 | 
				
			
			@ -110,6 +118,10 @@ while ($line = <STDIN>) {
 | 
			
		|||
		$objects{$1} .= ":$2";
 | 
			
		||||
	} elsif ($line =~ /INSTANCE_GET_INTERFACE.*,\s*(\w+),\s*(\w+)/) {
 | 
			
		||||
		$ifaces{$1} = $2;
 | 
			
		||||
	} elsif ($line =~ /^BUILTIN\s*\{\s*\"(\w+)\".*GTK_TYPE_BOXED/) {
 | 
			
		||||
		$boxdefs{$1} = $line;
 | 
			
		||||
	} elsif ($line =~ /^BUILTIN\s*\{\s*\"(\w+)\".*GTK_TYPE_(ENUM|FLAGS)/) {
 | 
			
		||||
		# ignoring these for now.
 | 
			
		||||
	} else {
 | 
			
		||||
		print $line;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -275,7 +287,11 @@ foreach $key (sort (keys (%types))) {
 | 
			
		|||
		next;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	$struct_el = addNameElem($ns_elem, 'struct', $key, $ns);
 | 
			
		||||
	if (exists($boxdefs{$key})) {
 | 
			
		||||
		$struct_el = addNameElem($ns_elem, 'boxed', $key, $ns);
 | 
			
		||||
	} else {
 | 
			
		||||
		$struct_el = addNameElem($ns_elem, 'struct', $key, $ns);
 | 
			
		||||
	}
 | 
			
		||||
	$def =~ s/\s+/ /g;
 | 
			
		||||
	$def =~ /\{(.+)\}/;
 | 
			
		||||
	addFieldElems($struct_el, split(/;/, $1));
 | 
			
		||||
| 
						 | 
				
			
			@ -447,7 +463,7 @@ sub addPropElem
 | 
			
		|||
		$type = "g$type";
 | 
			
		||||
	} elsif ($type =~ /string/) {
 | 
			
		||||
		$type = "gchar*";
 | 
			
		||||
	} elsif ($type =~ /enum|flags|object/) {
 | 
			
		||||
	} elsif ($type =~ /boxed|enum|flags|object/) {
 | 
			
		||||
		$type = $params[3];
 | 
			
		||||
		$type =~ s/TYPE_//;
 | 
			
		||||
		$type =~ s/\s+//g;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,7 +8,7 @@
 | 
			
		|||
# <c> 2001 Mike Kestner
 | 
			
		||||
 | 
			
		||||
$eatit_regex = "^#if.*(__cplusplus|DEBUG|DISABLE_(DEPRECATED|COMPAT)|ENABLE_BROKEN|COMPILATION)";
 | 
			
		||||
$ignoreit_regex = '^\s+\*|#\s*include|#\s*else|#\s*endif|#\s*undef|G_(BEGIN|END)_DECLS|extern|GDKVAR|GTKVAR|GTKMAIN_C_VAR|GTKTYPEUTILS_VAR|VARIABLE';
 | 
			
		||||
$ignoreit_regex = '^\s+\*|#\s*include|#\s*else|#\s*endif|#\s*undef|G_(BEGIN|END)_DECLS|extern|GDKVAR|GTKVAR|GTKMAIN_C_VAR|GTKTYPEUTILS_VAR|VARIABLE|GTKTYPEBUILTIN';
 | 
			
		||||
 | 
			
		||||
foreach $dir (@ARGV) {
 | 
			
		||||
	@hdrs = (@hdrs, `ls $dir/*.h`);
 | 
			
		||||
| 
						 | 
				
			
			@ -16,7 +16,7 @@ foreach $dir (@ARGV) {
 | 
			
		|||
 | 
			
		||||
foreach $fname (@hdrs) {
 | 
			
		||||
 | 
			
		||||
	if ($fname =~ /test|private|internals|gtktextlayout/) {
 | 
			
		||||
	if ($fname =~ /test|private|internals|gtktextlayout|gtkmarshalers/) {
 | 
			
		||||
		@privhdrs = (@privhdrs, $fname);
 | 
			
		||||
		next;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -57,12 +57,31 @@ foreach $fname (`ls $ARGV[0]/*.c`, @privhdrs) {
 | 
			
		|||
 | 
			
		||||
	open(INFILE, $fname) || die "Could open $fname\n";
 | 
			
		||||
 | 
			
		||||
	if ($fname =~ /builtins_ids/) {
 | 
			
		||||
		while ($line = <INFILE>) {
 | 
			
		||||
			next if ($line !~ /\{/);
 | 
			
		||||
 | 
			
		||||
			chomp($line);
 | 
			
		||||
			$builtin = "BUILTIN" . $line;
 | 
			
		||||
			$builtin .= <INFILE>;
 | 
			
		||||
			print $builtin;
 | 
			
		||||
		}
 | 
			
		||||
		next;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while ($line = <INFILE>) {
 | 
			
		||||
		next if ($line !~ /^(struct|\w+_class_init)/);
 | 
			
		||||
		next if ($line !~ /^(struct|\w+_class_init)|g_boxed_type_register_static/);
 | 
			
		||||
 | 
			
		||||
		if ($line =~ /^struct/) {
 | 
			
		||||
			# need some of these to parse out parent types
 | 
			
		||||
			print "private";
 | 
			
		||||
		} elsif ($line =~ /g_boxed_type_register_static/) {
 | 
			
		||||
			while ($line !~ /;/) {
 | 
			
		||||
				print $line;
 | 
			
		||||
				$line = <INFILE>;
 | 
			
		||||
			}
 | 
			
		||||
			print $line;
 | 
			
		||||
			next;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		do {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue