text:
Ada Programming/Libraries/GNAT.AWK

-- --                                                                         -- --                         GNAT COMPILER COMPONENTS                         -- --                                                                         -- --                              G N A T. A W K                            -- --                                                                         -- --                                 S p e c                                  -- --                                                                         -- --                     Copyright (C) 2000-2006, AdaCore                     -- --                                                                         -- -- GNAT is free software;  you can  redistribute it  and/or modify it under -- -- terms of the GNU General Public License as published  by the Free Soft- -- -- ware Foundation;  either version 2,  or (at your option) any later ver- -- -- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- -- OUT ANY WARRANTY; without even the  implied warranty of MERCHANTABILITY -- -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- -- for more details. You should have received  a copy of the GNU General -- -- Public License distributed with GNAT;  see file COPYING. If not, write -- -- to the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, -- -- Boston, MA 02110-1301, USA. -- --                                                                         -- -- -- -- -- -- -- -- -- GNAT was originally developed  by the GNAT team at  New York University. -- -- Extensive contributions were provided by Ada Core Technologies Inc.     -- --                                                                         -- --

-- This is an AWK-like unit. It provides an easy interface for parsing one -- or more files containing formatted data. The file can be viewed seen as -- a database where each record is a line and a field is a data element in --  this line. In this implementation an AWK record is a line. This means -- that a record cannot span multiple lines. The operating procedure is to -- read files line by line, with each line being presented to the user of --  the package. The interface provides services to access specific fields -- in the line. Thus it is possible to control actions taken on a line based -- on values of some fields. This can be achieved directly or by registering -- callbacks triggered on programmed conditions. -- -- The state of an AWK run is recorded in an object of type session. -- The following is the procedure for using a session to control an --  AWK run: -- --    1) Specify which session is to be used. It is possible to use the --        default session or to create a new one by declaring an object of --        type Session_Type. For example: -- --           Computers : Session_Type; -- --     2) Specify how to cut a line into fields. There are two modes: using --       character fields separators or column width. This is done by using --       Set_Fields_Separators or Set_Fields_Width. For example by: -- --          AWK.Set_Field_Separators (";,", Computers); -- --       or by using iterators' Separators parameter. -- --    3) Specify which files to parse. This is done with Add_File/Add_Files --        services, or by using the iterators' Filename parameter. For --        example: -- --           AWK.Add_File ("myfile.db", Computers); -- --     4) Run the AWK session using one of the provided iterators. -- --          Parse --             This is the most automated iterator. You can gain control on --             the session only by registering one or more callbacks (see --              Register). -- --          Get_Line/End_Of_Data --             This is a manual iterator to be used with a loop. You have --             complete control on the session. You can use callbacks but --             this is not required. -- --          For_Every_Line --             This provides a mixture of manual/automated iterator action. -- --       Examples of these three approaches appear below -- -- There are many ways to use this package. The following discussion shows -- three approaches to using this package, using the three iterator forms. -- All examples will use the following file (computer.db): -- --    Pluton;Windows-NT;Pentium III --    Mars;Linux;Pentium Pro --    Venus;Solaris;Sparc --    Saturn;OS/2;i486 --    Jupiter;MacOS;PPC -- -- 1) Using Parse iterator -- --     Here the first step is to register some action associated to a pattern --     and then to call the Parse iterator (this is the simplest way to use --    this unit). The default session is used here. For example to output the --     second field (the OS) of computer "Saturn". -- --           procedure Action is --           begin --              Put_Line (AWK.Field (2)); --           end Action; -- --        begin --           AWK.Register (1, "Saturn", Action'Access); --           AWK.Parse (";", "computer.db"); -- -- --  2) Using the Get_Line/End_Of_Data iterator -- --    Here you have full control. For example to do the same as --    above but using a specific session, you could write: -- --          Computer_File : Session_Type; -- --       begin --          AWK.Set_Current (Computer_File); --          AWK.Open (Separators => ";", --                     Filename   => "computer.db"); -- --          --  Display Saturn OS -- --          while not AWK.End_Of_File loop --             AWK.Get_Line; -- --             if AWK.Field (1) = "Saturn" then --                Put_Line (AWK.Field (2)); --             end if; --          end loop; -- --          AWK.Close (Computer_File); -- -- -- 3) Using For_Every_Line iterator -- --     In this case you use a provided iterator and you pass the procedure --     that must be called for each record. You could code the previous --     example could be coded as follows (using the iterator quick interface --    but without using the current session): -- --           Computer_File : Session_Type; -- --           procedure Action (Quit : in out Boolean) is --           begin --              if AWK.Field (1, Computer_File) = "Saturn" then --                 Put_Line (AWK.Field (2, Computer_File)); --              end if; --           end Action; -- --           procedure Look_For_Saturn is --              new AWK.For_Every_Line (Action); -- --        begin --           Look_For_Saturn (Separators => ";", --                           Filename   => "computer.db", --                           Session    => Computer_File); -- --           Integer_Text_IO.Put --             (Integer (AWK.NR (Session => Computer_File))); --           Put_Line (" line(s) have been processed."); -- --  You can also use a regular expression for the pattern. Let us output --  the computer name for all computer for which the OS has a character --  O in its name. -- --           Regexp   : String := ".*O.*"; -- --           Matcher  : Regpat.Pattern_Matcher := Regpat.Compile (Regexp); -- --           procedure Action is --           begin --              Text_IO.Put_Line (AWK.Field (2)); --           end Action; -- --        begin --           AWK.Register (2, Matcher, Action'Unrestricted_Access); --           AWK.Parse (";", "computer.db"); --

with Ada.Finalization; with GNAT.Regpat;

package GNAT.AWK is

Session_Error : exception; -- Raised when a Session is reused but is not closed

File_Error : exception; -- Raised when there is a file problem (see below)

End_Error : exception; -- Raised when an attempt is made to read beyond the end of the last -- file of a session.

Field_Error : exception; -- Raised when accessing a field value which does not exist

Data_Error : exception; -- Raised when it is impossible to convert a field value to a specific type

type Count is new Natural;

type Widths_Set is array (Positive range <>) of Positive; -- Used to store a set of columns widths

Default_Separators : constant String := " " & ASCII.HT;

Use_Current : constant String := ""; -- Value used when no separator or filename is specified in iterators

type Session_Type is limited private; -- This is the main exported type. A session is used to keep the state of  --  a full AWK run. The state comprises a list of files, the current file, -- the number of line processed, the current line, the number of fields in   --  the current line... A default session is provided (see Set_Current,  --  Current_Session and Default_Session above).

-- Package initialization --

-- To be thread safe it is not possible to use the default provided -- session. Each task must used a specific session and specify it  --  explicitly for every services.

procedure Set_Current (Session : Session_Type); -- Set the session to be used by default. This file will be used when the -- Session parameter in following services is not specified.

function Current_Session return Session_Type; -- Returns the session used by default by all services. This is the -- latest session specified by Set_Current service or the session -- provided by default with this implementation.

function Default_Session return Session_Type; -- Returns the default session provided by this package. Note that this is  --  the session return by Current_Session if Set_Current has not been used.

procedure Set_Field_Separators (Separators : String      := Default_Separators;      Session    : Session_Type); procedure Set_Field_Separators (Separators : String      := Default_Separators); -- Set the field separators. Each character in the string is a field -- separator. When a line is read it will be split by field using the -- separators set here. Separators can be changed at any point and in this -- case the current line is split according to the new separators. In the -- special case that Separators is a space and a tabulation -- (Default_Separators), fields are separated by runs of spaces and/or -- tabs.

procedure Set_FS (Separators : String      := Default_Separators;      Session    : Session_Type) renames Set_Field_Separators; procedure Set_FS (Separators : String      := Default_Separators) renames Set_Field_Separators; -- FS is the AWK abbreviation for above service

procedure Set_Field_Widths (Field_Widths : Widths_Set;     Session      : Session_Type); procedure Set_Field_Widths (Field_Widths : Widths_Set); -- This is another way to split a line by giving the length (in number of   --  characters) of each field in a line. Field widths can be changed at any -- point and in this case the current line is split according to the new -- field lengths. A line split with this method must have a length equal or  --  greater to the total of the field widths. All characters remaining on  --  the line after the latest field are added to a new automatically -- created field.

procedure Add_File (Filename : String;     Session  : Session_Type); procedure Add_File (Filename : String); -- Add Filename to the list of file to be processed. There is no limit on  --  the number of files that can be added. Files are processed in the order -- they have been added (i.e. the filename list is FIFO). If Filename does -- not exist or if it is not readable, File_Error is raised.

procedure Add_Files (Directory            : String;      Filenames             : String;      Number_Of_Files_Added : out Natural;      Session               : Session_Type); procedure Add_Files (Directory            : String;      Filenames             : String;      Number_Of_Files_Added : out Natural); -- Add all files matching the regular expression Filenames in the specified -- directory to the list of file to be processed. There is no limit on  --  the number of files that can be added. Each file is processed in  --  the same order they have been added (i.e. the filename list is FIFO). -- The number of files (possibly 0) added is returned in   --  Number_Of_Files_Added.

-  -- Information about current state -- -

function Number_Of_Fields (Session : Session_Type) return Count; function Number_Of_Fields return Count; pragma Inline (Number_Of_Fields); -- Returns the number of fields in the current record. It returns 0 when -- no file is being processed.

function NF    (Session : Session_Type) return Count renames Number_Of_Fields; function NF    return Count renames Number_Of_Fields; -- AWK abbreviation for above service

function Number_Of_File_Lines (Session : Session_Type) return Count; function Number_Of_File_Lines return Count; pragma Inline (Number_Of_File_Lines); -- Returns the current line number in the processed file. It returns 0 when -- no file is being processed.

function FNR (Session : Session_Type) return Count renames Number_Of_File_Lines; function FNR return Count renames Number_Of_File_Lines; -- AWK abbreviation for above service

function Number_Of_Lines (Session : Session_Type) return Count; function Number_Of_Lines return Count; pragma Inline (Number_Of_Lines); -- Returns the number of line processed until now. This is equal to number -- of line in each already processed file plus FNR. It returns 0 when -- no file is being processed.

function NR (Session : Session_Type) return Count renames Number_Of_Lines; function NR return Count renames Number_Of_Lines; -- AWK abbreviation for above service

function Number_Of_Files (Session : Session_Type) return Natural; function Number_Of_Files return Natural; pragma Inline (Number_Of_Files); -- Returns the number of files associated with Session. This is the total -- number of files added with Add_File and Add_Files services.

function File (Session : Session_Type) return String; function File return String; -- Returns the name of the file being processed. It returns the empty -- string when no file is being processed.

-  -- Field accessors -- -

function Field (Rank   : Count;      Session : Session_Type) return String; function Field (Rank   : Count) return String; -- Returns field number Rank value of the current record. If Rank = 0 it  --  returns the current record (i.e. the line as read in the file). It  --  raises Field_Error if Rank > NF or if Session is not open.

function Field (Rank   : Count;      Session : Session_Type) return Integer; function Field (Rank   : Count) return Integer; -- Returns field number Rank value of the current record as an integer. It  --  raises Field_Error if Rank > NF or if Session is not open. It  --  raises Data_Error if the field value cannot be converted to an integer.

function Field (Rank   : Count;      Session : Session_Type) return Float; function Field (Rank   : Count) return Float; -- Returns field number Rank value of the current record as a float. It  --  raises Field_Error if Rank > NF or if Session is not open. It  --  raises Data_Error if the field value cannot be converted to a float.

generic type Discrete is (<>); function Discrete_Field (Rank   : Count;      Session : Session_Type) return Discrete; generic type Discrete is (<>); function Discrete_Field_Current_Session (Rank   : Count) return Discrete; -- Returns field number Rank value of the current record as a type -- Discrete. It raises Field_Error if Rank > NF. It raises Data_Error if  --  the field value cannot be converted to type Discrete.

-- Pattern/Action --

-- AWK defines rules like "PATTERN { ACTION }". Which means that ACTION -- will be executed if PATTERN match. A pattern in this implementation can -- be a simple string (match function is equality), a regular expression, -- a function returning a boolean. An action is associated to a pattern -- using the Register services. --  --  Each procedure Register will add a rule to the set of rules for the -- session. Rules are examined in the order they have been added.

type Pattern_Callback is access function return Boolean; -- This is a pattern function pointer. When it returns True the associated -- action will be called.

type Action_Callback is access procedure; -- A simple action pointer

type Match_Action_Callback is    access procedure (Matches : GNAT.Regpat.Match_Array); -- An advanced action pointer used with a regular expression pattern. It  --  returns an array of all the matches. See GNAT.Regpat for further -- information.

procedure Register (Field  : Count;      Pattern : String;      Action  : Action_Callback;      Session : Session_Type); procedure Register (Field  : Count;      Pattern : String;      Action  : Action_Callback); -- Register an Action associated with a Pattern. The pattern here is a  --  simple string that must match exactly the field number specified.

procedure Register (Field  : Count;      Pattern : GNAT.Regpat.Pattern_Matcher;      Action  : Action_Callback;      Session : Session_Type); procedure Register (Field  : Count;      Pattern : GNAT.Regpat.Pattern_Matcher;      Action  : Action_Callback); -- Register an Action associated with a Pattern. The pattern here is a  --  simple regular expression which must match the field number specified.

procedure Register (Field  : Count;      Pattern : GNAT.Regpat.Pattern_Matcher;      Action  : Match_Action_Callback;      Session : Session_Type); procedure Register (Field  : Count;      Pattern : GNAT.Regpat.Pattern_Matcher;      Action  : Match_Action_Callback); -- Same as above but it pass the set of matches to the action -- procedure. This is useful to analyse further why and where a regular -- expression did match.

procedure Register (Pattern : Pattern_Callback;     Action  : Action_Callback;      Session : Session_Type); procedure Register (Pattern : Pattern_Callback;     Action  : Action_Callback); -- Register an Action associated with a Pattern. The pattern here is a  --  function that must return a boolean. Action callback will be called if  --  the pattern callback returns True and nothing will happen if it is   --  False. This version is more general, the two other register services -- trigger an action based on the value of a single field only.

procedure Register (Action : Action_Callback;      Session : Session_Type); procedure Register (Action : Action_Callback); -- Register an Action that will be called for every line. This is  --  equivalent to a Pattern_Callback function always returning True.

-- Parse iterator --

procedure Parse (Separators : String := Use_Current;     Filename   : String := Use_Current;      Session    : Session_Type); procedure Parse (Separators : String := Use_Current;     Filename   : String := Use_Current); -- Launch the iterator, it will read every line in all specified -- session's files. Registered callbacks are then called if the associated -- pattern match. It is possible to specify a filename and a set of  --  separators directly. This offer a quick way to parse a single -- file. These parameters will override those specified by Set_FS and -- Add_File. The Session will be opened and closed automatically. -- File_Error is raised if there is no file associated with Session, or if   --  a file associated with Session is not longer readable. It raises -- Session_Error is Session is already open.

---  -- Get_Line/End_Of_Data Iterator -- ---

type Callback_Mode is (None, Only, Pass_Through); -- These mode are used for Get_Line/End_Of_Data and For_Every_Line -- iterators. The associated semantic is: --  --    None --      callbacks are not active. This is the default mode for --      Get_Line/End_Of_Data and For_Every_Line iterators. --  --    Only --      callbacks are active, if at least one pattern match, the associated --      action is called and this line will not be passed to the user. In  --       the Get_Line case the next line will be read (if there is some   --       line remaining), in the For_Every_Line case Action will --      not be called for this line. --  --    Pass_Through --      callbacks are active, for patterns which match the associated --      action is called. Then the line is passed to the user. It means --      that Action procedure is called in the For_Every_Line case and --      that Get_Line returns with the current line active. --

procedure Open (Separators : String := Use_Current;     Filename   : String := Use_Current;      Session    : Session_Type); procedure Open (Separators : String := Use_Current;     Filename   : String := Use_Current); -- Open the first file and initialize the unit. This must be called once -- before using Get_Line. It is possible to specify a filename and a set of  --  separators directly. This offer a quick way to parse a single file. -- These parameters will override those specified by Set_FS and Add_File. -- File_Error is raised if there is no file associated with Session, or if   --  the first file associated with Session is no longer readable. It raises -- Session_Error is Session is already open.

procedure Get_Line (Callbacks : Callback_Mode := None;     Session   : Session_Type); procedure Get_Line (Callbacks : Callback_Mode := None); -- Read a line from the current input file. If the file index is at the -- end of the current input file (i.e. End_Of_File is True) then the -- following file is opened. If there is no more file to be processed, -- exception End_Error will be raised. File_Error will be raised if Open -- has not been called. Next call to Get_Line will return the following -- line in the file. By default the registered callbacks are not called by  --  Get_Line, this can activated by setting Callbacks (see Callback_Mode   --  description above). File_Error may be raised if a file associated with -- Session is not readable. --  --  When Callbacks is not None, it is possible to exhaust all the lines -- of all the files associated with Session. In this case, File_Error -- is not raised. --  --  This procedure can be used from a subprogram called by procedure Parse -- or by an instantiation of For_Every_Line (see below).

function End_Of_Data (Session : Session_Type) return Boolean; function End_Of_Data return Boolean; pragma Inline (End_Of_Data); -- Returns True if there is no more data to be processed in Session. It  --  means that the latest session's file is being processed and that -- there is no more data to be read in this file (End_Of_File is True).

function End_Of_File (Session : Session_Type) return Boolean; function End_Of_File return Boolean; pragma Inline (End_Of_File); -- Returns True when there is no more data to be processed on the current -- session's file.

procedure Close (Session : Session_Type); -- Release all associated data with Session. All memory allocated will -- be freed, the current file will be closed if needed, the callbacks -- will be unregistered. Close is convenient in reestablishing a session -- for new use. Get_Line is no longer usable (will raise File_Error) -- except after a successful call to Open, Parse or an instantiation -- of For_Every_Line.

-  -- For_Every_Line iterator -- -

generic with procedure Action (Quit : in out Boolean); procedure For_Every_Line (Separators : String := Use_Current;     Filename   : String := Use_Current;      Callbacks  : Callback_Mode := None;      Session    : Session_Type); generic with procedure Action (Quit : in out Boolean); procedure For_Every_Line_Current_Session (Separators : String := Use_Current;     Filename   : String := Use_Current;      Callbacks  : Callback_Mode := None); -- This is another iterator. Action will be called for each new -- record. The iterator's termination can be controlled by setting Quit -- to True. It is by default set to False. It is possible to specify a  --  filename and a set of separators directly. This offer a quick way to  --  parse a single file. These parameters will override those specified by  --  Set_FS and Add_File. By default the registered callbacks are not called -- by For_Every_Line, this can activated by setting Callbacks (see   --  Callback_Mode description above). The Session will be opened and -- closed automatically. File_Error is raised if there is no file -- associated with Session. It raises Session_Error is Session is already -- open.

private type Session_Data; type Session_Data_Access is access Session_Data;

type Session_Type is new Ada.Finalization.Limited_Controlled with record Data : Session_Data_Access; end record;

procedure Initialize (Session : in out Session_Type); procedure Finalize  (Session : in out Session_Type);

end GNAT.AWK; |GNAT.AWK

title: Ada Programming/Libraries/GNAT.AWK


text:
Ada Programming/Libraries/GNAT.Array Split

-- --                                                                         -- --                         GNAT COMPILER COMPONENTS                         -- --                                                                         -- --                     G N A T. A R R A Y _ S P L I T                     -- --                                                                         -- --                                 S p e c                                  -- --                                                                         -- --          Copyright (C) 2002-2006, Free Software Foundation, Inc.         -- --                                                                         -- -- GNAT is free software;  you can  redistribute it  and/or modify it under -- -- terms of the GNU General Public License as published  by the Free Soft- -- -- ware Foundation;  either version 2,  or (at your option) any later ver- -- -- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- -- OUT ANY WARRANTY; without even the  implied warranty of MERCHANTABILITY -- -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- -- for more details. You should have received  a copy of the GNU General -- -- Public License distributed with GNAT;  see file COPYING. If not, write -- -- to the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, -- -- Boston, MA 02110-1301, USA. -- --                                                                         -- -- -- -- -- -- -- -- -- GNAT was originally developed  by the GNAT team at  New York University. -- -- Extensive contributions were provided by Ada Core Technologies Inc.     -- --                                                                         -- --

-- Useful array-manipulation routines: given a set of separators, split -- an array wherever the separators appear, and provide direct access -- to the resulting slices.

with Ada.Finalization;

generic type Element is (<>); -- Element of the array, this must be a discrete type

type Element_Sequence is array (Positive range <>) of Element; -- The array which is a sequence of element

type Element_Set is private; -- This type represent a set of elements. This set does not defined a  --  specific order of the elements. The conversion of a sequence to a  --  set and membership tests in the set is performed using the routines -- To_Set and Is_In defined below.

with function To_Set (Sequence : Element_Sequence) return Element_Set; -- Returns an Element_Set given an Element_Sequence. Duplicate elements -- can be ignored during this conversion.

with function Is_In (Item : Element; Set : Element_Set) return Boolean; -- Returns True if Item is found in Set, False otherwise

package GNAT.Array_Split is

Index_Error : exception; -- Raised by all operations below if Index > Field_Count (S)

type Separator_Mode is    (Single,      --  In this mode the array is cut at each element in the separator      --  set. If two separators are contiguous the result at that position      --  is an empty slice.

Multiple -- In this mode contiguous separators are handled as a single -- separator and no empty slice is created. );

type Slice_Set is private; -- This type uses by-reference semantics. This is a set of slices as  --  returned by Create or Set routines below. The abstraction represents -- a set of items. Each item is a part of the original string named a  --  Slice. It is possible to access individual slices by using the Slice -- routine below. The first slice in the Set is at the position/index -- 1. The total number of slices in the set is returned by Slice_Count.

procedure Create (S         : out Slice_Set;      From       : Element_Sequence;      Separators : Element_Sequence;      Mode       : Separator_Mode := Single); -- Create a cut array object. From is the source array, and Separators -- is a sequence of Element along which to split the array. The source -- array is sliced at separator boundaries. The separators are not -- included as part of the resulting slices. --  --  Note that if From is terminated by a separator an extra empty element -- is added to the slice set. If From only contains a separator the slice -- set contains two empty elements.

procedure Create (S         : out Slice_Set;      From       : Element_Sequence;      Separators : Element_Set;      Mode       : Separator_Mode := Single); -- Same as above but using a Element_Set

procedure Set (S         : in out Slice_Set;      Separators : Element_Sequence;      Mode       : Separator_Mode := Single); -- Change the set of separators. The source array will be split according -- to this new set of separators.

procedure Set (S         : in out Slice_Set;      Separators : Element_Set;      Mode       : Separator_Mode := Single); -- Same as above but using a Element_Set

type Slice_Number is new Natural; -- Type used to count number of slices

function Slice_Count (S : Slice_Set) return Slice_Number; pragma Inline (Slice_Count); -- Returns the number of slices (fields) in S

function Slice (S    : Slice_Set;      Index : Slice_Number) return Element_Sequence; pragma Inline (Slice); -- Returns the slice at position Index. First slice is 1. If Index is 0 -- the whole array is returned including the separators (this is the   --  original source array).

type Position is (Before, After); -- Used to designate position of separator

type Slice_Separators is array (Position) of Element; -- Separators found before and after the slice

Array_End : constant Element; -- This is the separator returned for the start or the end of the array

function Separators (S    : Slice_Set;      Index : Slice_Number) return Slice_Separators; -- Returns the separators used to slice (front and back) the slice at   --  position Index. For slices at start and end of the original array, the -- Array_End value is returned for the corresponding outer bound. In  --  Multiple mode only the element closest to the slice is returned. -- if Index = 0, returns (Array_End, Array_End).

type Separators_Indexes is array (Positive range <>) of Positive;

function Separators (S : Slice_Set) return Separators_Indexes; -- Returns indexes of all separators used to slice original source array S

private

Array_End : constant Element := Element'First;

type Element_Access is access Element_Sequence;

type Counter is access Natural;

type Indexes_Access is access Separators_Indexes;

type Slice_Info is record Start : Positive; Stop : Natural; end record; -- Starting/Ending position of a slice. This does not include separators

type Slices_Indexes is array (Slice_Number range <>) of Slice_Info; type Slices_Access is access Slices_Indexes; -- All indexes for fast access to slices. In the Slice_Set we keep only -- the original array and the indexes where each slice start and stop.

type Slice_Set is new Ada.Finalization.Controlled with record Ref_Counter : Counter;           -- Reference counter, by-address sem Source     : Element_Access; N_Slice    : Slice_Number := 0;  -- Number of slices found Indexes    : Indexes_Access; Slices     : Slices_Access; end record;

procedure Initialize (S : in out Slice_Set); procedure Adjust    (S : in out Slice_Set); procedure Finalize  (S : in out Slice_Set);

end GNAT.Array_Split; |GNAT.Array Split

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/


text:
Ada Programming/Libraries/GNAT.Bounded Buffers

-- --                                                                         -- --                         GNAT LIBRARY COMPONENTS                          -- --                                                                         -- --                  G N A T. B O U N D E D _ B U F F E R S                -- --                                                                         -- --                                 S p e c                                  -- --                                                                         -- --                     Copyright (C) 2003-2006, AdaCore                     -- --                                                                         -- -- GNAT is free software;  you can  redistribute it  and/or modify it under -- -- terms of the GNU General Public License as published  by the Free Soft- -- -- ware Foundation;  either version 2,  or (at your option) any later ver- -- -- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- -- OUT ANY WARRANTY; without even the  implied warranty of MERCHANTABILITY -- -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- -- for more details. You should have received  a copy of the GNU General -- -- Public License distributed with GNAT;  see file COPYING. If not, write -- -- to the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, -- -- Boston, MA 02110-1301, USA. -- --                                                                         -- -- -- -- -- -- -- -- -- GNAT was originally developed  by the GNAT team at  New York University. -- -- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). -- --                                                                         -- --

-- This package provides a thread-safe generic bounded buffer abstraction. -- Instances are useful directly or as parts of the implementations of other -- abstractions, such as mailboxes.

-- Bounded_Buffer is declared explicitly as a protected type, rather than as --  a simple limited private type completed as a protected type, so that -- clients may make calls accordingly (i.e., conditional/timed entry calls).

with System;

generic type Element is private; -- The type of the values contained within buffer objects

package GNAT.Bounded_Buffers is  pragma Pure;

type Content is array (Positive range <>) of Element; -- Content is an internal artefact that cannot be hidden because protected -- types cannot contain type declarations.

Default_Ceiling : constant System.Priority := System.Default_Priority; -- A convenience value for the Ceiling discriminant

protected type Bounded_Buffer (Capacity : Positive;     --  Objects of type Bounded_Buffer specify the maximum number of Element      --  values they can hold via the discriminant Capacity.

Ceiling : System.Priority)     --  Users must specify the ceiling priority for the object. If the      --  Real-Time Systems Annex is not in use this value is not important.   is      pragma Priority (Ceiling);

entry Insert (Item : Element); -- Insert Item into the buffer, blocks caller until space is available

entry Remove (Item : out Element); -- Remove next available Element from buffer. Blocks caller until an     --  Element is available.

function Empty return Boolean; -- Returns whether the instance contains any Elements. -- Note: State may change immediately after call returns.

function Full return Boolean; -- Returns whether any space remains within the instance. -- Note: State may change immediately after call returns.

function Extent return Natural; -- Returns the number of Element values currently held -- within the instance. -- Note: State may change immediately after call returns.

private Values  : Content (1 .. Capacity); -- The container for the values held by the buffer instance

Next_In : Positive := 1; -- The index of the next Element inserted. Wraps around

Next_Out : Positive := 1; -- The index of the next Element removed. Wraps around

Count   : Natural  := 0; -- The number of Elements currently held end Bounded_Buffer;

end GNAT.Bounded_Buffers; |GNAT.Bounded Buffers


text:
Ada Programming/Libraries/GNAT.Bounded Mailboxes

-- --                                                                         -- --                         GNAT LIBRARY COMPONENTS                          -- --                                                                         -- --                 G N A T. B O U N D E D _ M A I L B O X E S             -- --                                                                         -- --                                 S p e c                                  -- --                                                                         -- --                     Copyright (C) 2003-2006, AdaCore                     -- --                                                                         -- -- GNAT is free software;  you can  redistribute it  and/or modify it under -- -- terms of the GNU General Public License as published  by the Free Soft- -- -- ware Foundation;  either version 2,  or (at your option) any later ver- -- -- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- -- OUT ANY WARRANTY; without even the  implied warranty of MERCHANTABILITY -- -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- -- for more details. You should have received  a copy of the GNU General -- -- Public License distributed with GNAT;  see file COPYING. If not, write -- -- to the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, -- -- Boston, MA 02110-1301, USA. -- --                                                                         -- -- -- -- -- -- -- -- -- GNAT was originally developed  by the GNAT team at  New York University. -- -- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). -- --                                                                         -- --

-- This package provides a thread-safe asynchronous communication facility -- in the form of mailboxes. Individual mailbox objects are bounded in size -- to a value specified by their Capacity discriminants.

-- Mailboxes actually hold references to messages, not the message values -- themselves.

-- Type Mailbox is defined explicitly as a protected type (via derivation --  from a protected type) so that clients may treat them accordingly (for --  example, by making conditional/timed entry calls).

with System; with GNAT.Bounded_Buffers;

generic type Message (<>) is limited private; type Message_Reference is access all Message; -- Mailboxes hold references to Message values, of this type

package GNAT.Bounded_Mailboxes is  pragma Preelaborate;

package Message_Refs is     new GNAT.Bounded_Buffers (Message_Reference);

type Mailbox is new Message_Refs.Bounded_Buffer;

-- Type Mailbox has two inherited discriminants:

-- Capacity : Positive; --    Capacity is the maximum number of Message references --    possibly contained at any given instant.

-- Ceiling : System.Priority; --    Users must specify the ceiling priority for the object. --    If the Real-Time Systems Annex is not in use this value --    is not important.

-- Protected type Mailbox has the following inherited interface:

-- entry Insert (Item : Message_Reference); --    Insert Item into the Mailbox. Blocks caller --    until space is available.

-- entry Remove (Item : out Message_Reference); --    Remove next available Message_Reference from Mailbox. --    Blocks caller until a Message_Reference is available.

-- function Empty return Boolean; --    Returns whether the Mailbox contains any Message_References. --    Note: State may change immediately after call returns.

-- function Full return Boolean; --    Returns whether any space remains within the Mailbox. --    Note: State may change immediately after call returns.

-- function Extent return Natural; --    Returns the number of Message_Reference values currently held --    within the Mailbox. --    Note: State may change immediately after call returns.

Default_Ceiling : constant System.Priority := Message_Refs.Default_Ceiling; -- A convenience value for the Ceiling discriminant

end GNAT.Bounded_Mailboxes; |GNAT.Bounded Mailboxes


text:
Ada Programming/Libraries/GNAT.Calendar

-- --                                                                         -- --                         GNAT RUN-TIME COMPONENTS                         -- --                                                                         -- --                         G N A T. C A L E N D A R                       -- --                                                                         -- --                                 S p e c                                  -- --                                                                         -- --          Copyright (C) 1999-2016, Free Software Foundation, Inc.         -- --                                                                         -- -- GNAT is free software;  you can  redistribute it  and/or modify it under -- -- terms of the GNU General Public License as published  by the Free Soft- -- -- ware Foundation;  either version 3,  or (at your option) any later ver- -- -- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- -- OUT ANY WARRANTY; without even the  implied warranty of MERCHANTABILITY -- -- or FITNESS FOR A PARTICULAR PURPOSE. -- --                                                                         -- -- As a special exception under Section 7 of GPL version 3, you are granted -- -- additional permissions described in the GCC Runtime Library Exception,  -- -- version 3.1, as published by the Free Software Foundation. -- --                                                                         -- -- In particular,  you can freely  distribute your programs  built with the -- -- GNAT Pro compiler, including any required library run-time units, using -- -- any licensing terms of your choosing. See the AdaCore Software License -- -- for full details. -- --                                                                         -- -- GNAT was originally developed  by the GNAT team at  New York University. -- -- Extensive contributions were provided by Ada Core Technologies Inc.     -- --                                                                         -- --

-- This package extends Ada.Calendar to handle Hour, Minute, Second, -- Second_Duration and Day_Of_Week and Day_In_Year from Calendar.Time. -- Second_Duration precision depends on the target clock precision. -- -- GNAT.Calendar provides the same kind of abstraction found in Ada.Calendar. -- It provides Split and Time_Of to build and split a Time data. And it -- provides accessor functions to get only one of Hour, Minute, Second, -- Second_Duration. Other functions are to access more advanced values like -- Day_Of_Week, Day_In_Year and Week_In_Year.

with Ada.Calendar.Formatting; with Interfaces.C;

package GNAT.Calendar is

type Day_Name is    (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday); pragma Ordered (Day_Name);

subtype Hour_Number        is Natural range 0 .. 23;  subtype Minute_Number       is Natural range 0 .. 59;  subtype Second_Number       is Natural range 0 .. 59;  subtype Second_Duration     is Ada.Calendar.Day_Duration range 0.0 .. 1.0;  subtype Day_In_Year_Number  is Positive range 1 .. 366;  subtype Week_In_Year_Number is Positive range 1 .. 53;

No_Time : constant Ada.Calendar.Time; -- A constant set to the first date that can be represented by the type -- Time. It can be used to indicate an uninitialized date.

function Hour      (Date : Ada.Calendar.Time) return Hour_Number; function Minute    (Date : Ada.Calendar.Time) return Minute_Number; function Second    (Date : Ada.Calendar.Time) return Second_Number; function Sub_Second (Date : Ada.Calendar.Time) return Second_Duration; -- Hour, Minute, Second and Sub_Second returns the complete time data for -- the Date (H:M:S.SS). See Ada.Calendar for Year, Month, Day accessors. -- Second_Duration precision depends on the target clock precision.

function Day_Of_Week (Date : Ada.Calendar.Time) return Day_Name; -- Return the day name

function Day_In_Year (Date : Ada.Calendar.Time) return Day_In_Year_Number; -- Return the day number in the year. (1st January is day 1 and 31st  --  December is day 365 or 366 for leap year).

procedure Split (Date      : Ada.Calendar.Time;      Year       : out Ada.Calendar.Year_Number;      Month      : out Ada.Calendar.Month_Number;      Day        : out Ada.Calendar.Day_Number;      Hour       : out Hour_Number;      Minute     : out Minute_Number;      Second     : out Second_Number;      Sub_Second : out Second_Duration); -- Split a standard Ada.Calendar.Time value in date data (Year, Month, Day) -- and Time data (Hour, Minute, Second, Sub_Second).

procedure Split_At_Locale (Date      : Ada.Calendar.Time;      Year       : out Ada.Calendar.Year_Number;      Month      : out Ada.Calendar.Month_Number;      Day        : out Ada.Calendar.Day_Number;      Hour       : out Hour_Number;      Minute     : out Minute_Number;      Second     : out Second_Number;      Sub_Second : out Second_Duration); -- Split a standard Ada.Calendar.Time value in date data (Year, Month, Day) -- and Time data (Hour, Minute, Second, Sub_Second). This version of Split -- utilizes the time zone and DST bias of the locale (equivalent to Clock). -- Due to this simplified behavior, the implementation does not require -- expensive system calls on targets such as Windows. -- WARNING: Split_At_Locale is no longer aware of historic events and may -- produce inaccurate results over DST changes which occurred in the past.

function Time_Of (Year      : Ada.Calendar.Year_Number;      Month      : Ada.Calendar.Month_Number;      Day        : Ada.Calendar.Day_Number;      Hour       : Hour_Number;      Minute     : Minute_Number;      Second     : Second_Number;      Sub_Second : Second_Duration := 0.0) return Ada.Calendar.Time; -- Return an Ada.Calendar.Time data built from the date and time values

function Time_Of_At_Locale (Year      : Ada.Calendar.Year_Number;      Month      : Ada.Calendar.Month_Number;      Day        : Ada.Calendar.Day_Number;      Hour       : Hour_Number;      Minute     : Minute_Number;      Second     : Second_Number;      Sub_Second : Second_Duration := 0.0) return Ada.Calendar.Time; -- Return an Ada.Calendar.Time data built from the date and time values. -- This version of Time_Of utilizes the time zone and DST bias of the -- locale (equivalent to Clock). Due to this simplified behavior, the -- implementation does not require expensive system calls on targets such -- as Windows. -- WARNING: Split_At_Locale is no longer aware of historic events and may -- produce inaccurate results over DST changes which occurred in the past.

function Week_In_Year (Date : Ada.Calendar.Time) return Week_In_Year_Number; -- Return the week number as defined in ISO 8601. A week always starts on  --  a Monday and the first week of a particular year is the one containing -- the first Thursday. A year may have 53 weeks when January 1st is a  --  Wednesday and the year is leap or January 1st is a Thursday. Note that -- the last days of December may belong to the first week on the next year -- and conversely, the first days of January may belong to the last week -- of the last year.

procedure Year_Week_In_Year (Date : Ada.Calendar.Time;     Year : out Ada.Calendar.Year_Number;      Week : out Week_In_Year_Number); -- Return the week number as defined in ISO 8601 along with the year in   --  which the week occurs.

-- C timeval conversion

-- C timeval represent a duration (used in Select for example). This -- structure is composed of a number of seconds and a number of micro -- seconds. The timeval structure is not exposed here because its -- definition is target dependent. Interface to C programs is done via a  --  pointer to timeval structure.

type timeval is private;

function To_Duration (T : not null access timeval) return Duration; function To_Timeval (D : Duration) return timeval;

private -- This is a dummy declaration that should be the largest possible timeval -- structure of all supported targets.

type timeval is array (1 .. 3) of Interfaces.C.long;

function Julian_Day (Year : Ada.Calendar.Year_Number;      Month : Ada.Calendar.Month_Number;      Day   : Ada.Calendar.Day_Number) return Integer; -- Compute Julian day number --  --  The code of this function is a modified version of algorithm 199 from -- the Collected Algorithms of the ACM. The author of algorithm 199 is  --  Robert G. Tantzen.

No_Time : constant Ada.Calendar.Time := Ada.Calendar.Formatting.Time_Of (Ada.Calendar.Year_Number'First,                 Ada.Calendar.Month_Number'First,                  Ada.Calendar.Day_Number'First,                  Time_Zone => 0); -- Use Time_Zone => 0 to be the same binary representation in any timezone

end GNAT.Calendar; |GNAT.Calendar

title: Ada Programming/Libraries/GNAT.Calendar


text:
Ada Programming/Libraries/GNAT.Calendar.Time IO

-- --                                                                         -- --                         GNAT RUN-TIME COMPONENTS                         -- --                                                                         -- --                G N A T. C A L E N D A R. T I M E _ I O                -- --                                                                         -- --                                 S p e c                                  -- --                                                                         -- --                     Copyright (C) 1999-2006, AdaCore                     -- --                                                                         -- -- This specification is derived from the Ada Reference Manual for use with -- -- GNAT. The copyright notice above, and the license provisions that follow -- -- apply solely to the contents of the part following the private keyword. -- --                                                                         -- -- GNAT is free software;  you can  redistribute it  and/or modify it under -- -- terms of the GNU General Public License as published  by the Free Soft- -- -- ware Foundation;  either version 2,  or (at your option) any later ver- -- -- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- -- OUT ANY WARRANTY; without even the  implied warranty of MERCHANTABILITY -- -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- -- for more details. You should have received  a copy of the GNU General -- -- Public License distributed with GNAT;  see file COPYING. If not, write -- -- to the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, -- -- Boston, MA 02110-1301, USA. -- --                                                                         -- -- -- -- -- -- -- -- -- GNAT was originally developed  by the GNAT team at  New York University. -- -- Extensive contributions were provided by Ada Core Technologies Inc.     -- --                                                                         -- --

-- This package augments standard Ada.Text_IO with facilities for input -- and output of time values in standardized format.

package GNAT.Calendar.Time_IO is

Picture_Error : exception; -- Exception raised for incorrect picture

type Picture_String is new String; -- This is a string to describe date and time output format. The string is  --  a set of standard character and special tag that are replaced by the -- corresponding values. It follows the GNU Date specification. Here are -- the recognized directives : --  --          %    a literal % --         n    a newline --         t    a horizontal tab --  --          Time fields: --  --          %H   hour (00..23) --         %I   hour (01..12) --         %k   hour ( 0..23) --         %l   hour ( 1..12) --         %M   minute (00..59) --         %p   locale's AM or PM   --          %r   time, 12-hour (hh:mm:ss [AP]M) --         %s   seconds  since 1970-01-01  00:00:00 UTC --               (a nonstandard extension) --         %S   second (00..59) --         %T   time, 24-hour (hh:mm:ss) --  --          Date fields: --  --          %a   locale's abbreviated weekday name (Sun..Sat) --         %A   locale's    full   weekday   name,    variable   length --                 (Sunday..Saturday) --         %b   locale's abbreviated month name (Jan..Dec) --         %B   locale's    full    month    name,   variable    length --                 (January..December) --         %c   locale's date and time (Sat Nov 04 12:02:33 EST 1989) --         %d   day of month (01..31) --         %D   date (mm/dd/yy) --         %h   same as %b --         %j   day of year (001..366) --         %m   month (01..12) --         %U   week number  of year with  Sunday as first day  of week --                 (00..53)   --          %w   day of week (0..6) with 0 corresponding to Sunday --         %W   week number  of year with  Monday as first day  of week --                 (00..53)   --          %x   locale's date representation (mm/dd/yy) --         %y   last two digits of year (00..99) --         %Y   year (1970...) --  --          By default,  date pads numeric fields with zeroes. GNU date --         recognizes the following nonstandard numeric modifiers: --  --          -    (hyphen) do not pad the field --         _    (underscore) pad the field with spaces --  --  Here are some GNAT extensions to the GNU Date specification: --  --          %i   milliseconds (3 digits) --         %e   microseconds (6 digits) --         %o   nanoseconds  (9 digits)

ISO_Date : constant Picture_String; -- This format follow the ISO 8601 standard. The format is "YYYY-MM-DD", -- four digits year, month and day number separated by minus.

US_Date : constant Picture_String; -- This format is the common US date format: "MM/DD/YY", -- month and day number, two digits year separated by slashes.

European_Date : constant Picture_String; -- This format is the common European date format: "DD/MM/YY", -- day and month number, two digits year separated by slashes.

function Image (Date   : Ada.Calendar.Time;      Picture : Picture_String) return String; -- Return Date as a string with format Picture. Raise Picture_Error if  --  picture string is wrong.

function Value (Date : String) return Ada.Calendar.Time; -- Parse the string Date and return its equivalent as a Time value. The -- following formats are supported: --  --     yyyy*mm*dd hh:mm:ss  - Delimiter '*' is either '-' or '/' --    yyyy*mm*dd           - The time of day is set to 00:00:00 --  --     yy*mm*dd hh:mm:ss    - Year is assumend to be 20YY --    yy*mm*dd             - The time of day is set to 00:00:00 --  --     hh:mm:ss             - Date is the current date --  --  Constraint_Error is raised if the input string is malformatted or   --  the resulting time is not valid.

procedure Put_Time (Date   : Ada.Calendar.Time;      Picture : Picture_String); -- Put Date with format Picture. Raise Picture_Error if picture string is  --  wrong

private ISO_Date     : constant Picture_String := "%Y-%m-%d"; US_Date      : constant Picture_String := "%m/%d/%y"; European_Date : constant Picture_String := "%d/%m/%y";

end GNAT.Calendar.Time_IO; |GNAT.Calendar.Time IO


text:
XForms/CSS tables

This is an example of using CSS to format a table without actually using the HTML table element. This is critical since some browsers do not support dynamic tabular layout. The Firefox 0.6 extension also does not support the repeat-nodeset attribute, so you can not yet display repeating data inside HTML tables.

The biggest drawback to this solution is that the width of the tables must be predefined in a stylesheet and can not adjust the width of the columns based on the width of the data in each row.

title: XForms/CSS tables


text:
User:Werdan7/sb

Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User:Werdan7/sb


text:
User talk:Euni~enwikibooks

Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

Your account will be renamed
Hello,

The developer team at Wikimedia is making some changes to how accounts work, as part of our on-going efforts to provide new and better tools for our users like cross-wiki notifications. These changes will mean you have the same account name everywhere. This will let us give you new features that will help you edit and discuss better, and allow more flexible user permissions for tools. One of the side-effects of this is that user accounts will now have to be unique across all 900 Wikimedia wikis. See the announcement for more information.

Unfortunately, your account clashes with another account also called Euni. To make sure that both of you can use all Wikimedia projects in future, we have reserved the name Euni~enwikibooks that only you will have. If you like it, you don't have to do anything. If you do not like it, you can pick out a different name.

Your account will still work as before, and you will be credited for all your edits made so far, but you will have to use the new account name when you log in.

Sorry for the inconvenience.

Yours, Keegan Peterzell Community Liaison, Wikimedia Foundation 23:11, 17 March 2015 (UTC)

Renamed
 This account has been renamed as part of single-user login finalisation. If you own this account you can |log in using your previous username and password for more information. If you do not like this account's new name, you can choose your own using this form after logging in: . -- Keegan (WMF) (talk) 04:57, 19 April 2015 (UTC)

title: User talk:Euni~enwikibooks


text:
User talk:Nitruth

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User talk:Nitruth


text:
User talk:DakotaJ

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User talk:DakotaJ


text:
User talk:PastorCraig~enwikibooks

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

Your account will be renamed
Hello,

The developer team at Wikimedia is making some changes to how accounts work, as part of our on-going efforts to provide new and better tools for our users like cross-wiki notifications. These changes will mean you have the same account name everywhere. This will let us give you new features that will help you edit and discuss better, and allow more flexible user permissions for tools. One of the side-effects of this is that user accounts will now have to be unique across all 900 Wikimedia wikis. See the announcement for more information.

Unfortunately, your account clashes with another account also called PastorCraig. To make sure that both of you can use all Wikimedia projects in future, we have reserved the name PastorCraig~enwikibooks that only you will have. If you like it, you don't have to do anything. If you do not like it, you can pick out a different name.

Your account will still work as before, and you will be credited for all your edits made so far, but you will have to use the new account name when you log in.

Sorry for the inconvenience.

Yours, Keegan Peterzell Community Liaison, Wikimedia Foundation 23:35, 17 March 2015 (UTC)

Renamed
 This account has been renamed as part of single-user login finalisation. If you own this account you can |log in using your previous username and password for more information. If you do not like this account's new name, you can choose your own using this form after logging in: . -- Keegan (WMF) (talk) 05:21, 19 April 2015 (UTC)

title: User talk:PastorCraig~enwikibooks


text:
User talk:Harbhan singh

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User talk:Harbhan singh


text:
User talk:Jlstrine

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User talk:Jlstrine


text:
User talk:Hugh~enwikibooks

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

Your account will be renamed
Hello,

The developer team at Wikimedia is making some changes to how accounts work, as part of our on-going efforts to provide new and better tools for our users like cross-wiki notifications. These changes will mean you have the same account name everywhere. This will let us give you new features that will help you edit and discuss better, and allow more flexible user permissions for tools. One of the side-effects of this is that user accounts will now have to be unique across all 900 Wikimedia wikis. See the announcement for more information.

Unfortunately, your account clashes with another account also called Hugh. To make sure that both of you can use all Wikimedia projects in future, we have reserved the name Hugh~enwikibooks that only you will have. If you like it, you don't have to do anything. If you do not like it, you can pick out a different name.

Your account will still work as before, and you will be credited for all your edits made so far, but you will have to use the new account name when you log in.

Sorry for the inconvenience.

Yours, Keegan Peterzell Community Liaison, Wikimedia Foundation 23:17, 17 March 2015 (UTC)

Renamed
 This account has been renamed as part of single-user login finalisation. If you own this account you can |log in using your previous username and password for more information. If you do not like this account's new name, you can choose your own using this form after logging in: . -- Keegan (WMF) (talk) 05:02, 19 April 2015 (UTC)

title: User talk:Hugh~enwikibooks


text:
User talk:Irishboy0

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User talk:Irishboy0


text:
User talk:Bassam jr~enwikibooks

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

Your account will be renamed
Hello,

The developer team at Wikimedia is making some changes to how accounts work, as part of our on-going efforts to provide new and better tools for our users like cross-wiki notifications. These changes will mean you have the same account name everywhere. This will let us give you new features that will help you edit and discuss better, and allow more flexible user permissions for tools. One of the side-effects of this is that user accounts will now have to be unique across all 900 Wikimedia wikis. See the announcement for more information.

Unfortunately, your account clashes with another account also called Bassam jr. To make sure that both of you can use all Wikimedia projects in future, we have reserved the name Bassam jr~enwikibooks that only you will have. If you like it, you don't have to do anything. If you do not like it, you can pick out a different name.

Your account will still work as before, and you will be credited for all your edits made so far, but you will have to use the new account name when you log in.

Sorry for the inconvenience.

Yours, Keegan Peterzell Community Liaison, Wikimedia Foundation 23:01, 17 March 2015 (UTC)

Renamed
 This account has been renamed as part of single-user login finalisation. If you own this account you can |log in using your previous username and password for more information. If you do not like this account's new name, you can choose your own using this form after logging in: . -- Keegan (WMF) (talk) 04:37, 19 April 2015 (UTC)

title: User talk:Bassam jr~enwikibooks


text:
User talk:Bvishal106

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User talk:Bvishal106


text:
User talk:VillemtheVillain!

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User talk:VillemtheVillain!


text:
User talk:Mikeg~enwikibooks

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

Your account will be renamed
Hello,

The developer team at Wikimedia is making some changes to how accounts work, as part of our on-going efforts to provide new and better tools for our users like cross-wiki notifications. These changes will mean you have the same account name everywhere. This will let us give you new features that will help you edit and discuss better, and allow more flexible user permissions for tools. One of the side-effects of this is that user accounts will now have to be unique across all 900 Wikimedia wikis. See the announcement for more information.

Unfortunately, your account clashes with another account also called Mikeg. To make sure that both of you can use all Wikimedia projects in future, we have reserved the name Mikeg~enwikibooks that only you will have. If you like it, you don't have to do anything. If you do not like it, you can pick out a different name.

Your account will still work as before, and you will be credited for all your edits made so far, but you will have to use the new account name when you log in.

Sorry for the inconvenience.

Yours, Keegan Peterzell Community Liaison, Wikimedia Foundation 23:27, 17 March 2015 (UTC)

Renamed
 This account has been renamed as part of single-user login finalisation. If you own this account you can |log in using your previous username and password for more information. If you do not like this account's new name, you can choose your own using this form after logging in: . -- Keegan (WMF) (talk) 05:15, 19 April 2015 (UTC)

title: User talk:Mikeg~enwikibooks


text:
User talk:Troisrosesjaunes

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User talk:Troisrosesjaunes


text:
User talk:Njurok

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User talk:Njurok


text:
User talk:Jmmossholder

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User talk:Jmmossholder


text:
User talk:Slippingout

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User talk:Slippingout


text:
User talk:B2DR

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User talk:B2DR


text:
User talk:Cmasuda

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User talk:Cmasuda


text:
User talk:Wgsuresh

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User talk:Wgsuresh


text:
User talk:Lissie~enwikibooks

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

Your account will be renamed
Hello,

The developer team at Wikimedia is making some changes to how accounts work, as part of our on-going efforts to provide new and better tools for our users like cross-wiki notifications. These changes will mean you have the same account name everywhere. This will let us give you new features that will help you edit and discuss better, and allow more flexible user permissions for tools. One of the side-effects of this is that user accounts will now have to be unique across all 900 Wikimedia wikis. See the announcement for more information.

Unfortunately, your account clashes with another account also called Lissie. To make sure that both of you can use all Wikimedia projects in future, we have reserved the name Lissie~enwikibooks that only you will have. If you like it, you don't have to do anything. If you do not like it, you can pick out a different name.

Your account will still work as before, and you will be credited for all your edits made so far, but you will have to use the new account name when you log in.

Sorry for the inconvenience.

Yours, Keegan Peterzell Community Liaison, Wikimedia Foundation 23:25, 17 March 2015 (UTC)

Renamed
 This account has been renamed as part of single-user login finalisation. If you own this account you can |log in using your previous username and password for more information. If you do not like this account's new name, you can choose your own using this form after logging in: . -- Keegan (WMF) (talk) 05:12, 19 April 2015 (UTC)

title: User talk:Lissie~enwikibooks


text:
User talk:Clarafm

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User talk:Clarafm


text:
User talk:Susanr9999

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User talk:Susanr9999


text:
User talk:Amhashir

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

title: User talk:Amhashir


text:
User talk:Spikespeigel42~enwikibooks

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

Your account will be renamed
Hello,

The developer team at Wikimedia is making some changes to how accounts work, as part of our on-going efforts to provide new and better tools for our users like cross-wiki notifications. These changes will mean you have the same account name everywhere. This will let us give you new features that will help you edit and discuss better, and allow more flexible user permissions for tools. One of the side-effects of this is that user accounts will now have to be unique across all 900 Wikimedia wikis. See the announcement for more information.

Unfortunately, your account clashes with another account also called Spikespeigel42. To make sure that both of you can use all Wikimedia projects in future, we have reserved the name Spikespeigel42~enwikibooks that only you will have. If you like it, you don't have to do anything. If you do not like it, you can pick out a different name.

Your account will still work as before, and you will be credited for all your edits made so far, but you will have to use the new account name when you log in.

Sorry for the inconvenience.

Yours, Keegan Peterzell Community Liaison, Wikimedia Foundation 23:43, 17 March 2015 (UTC)

Renamed
 This account has been renamed as part of single-user login finalisation. If you own this account you can |log in using your previous username and password for more information. If you do not like this account's new name, you can choose your own using this form after logging in: . -- Keegan (WMF) (talk) 05:32, 19 April 2015 (UTC)

title: User talk:Spikespeigel42~enwikibooks


text:
User talk:Ruchi jain~enwikibooks

WELCOME!
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! Werdan7

Your account will be renamed
Hello,

The developer team at Wikimedia is making some changes to how accounts work, as part of our on-going efforts to provide new and better tools for our users like cross-wiki notifications. These changes will mean you have the same account name everywhere. This will let us give you new features that will help you edit and discuss better, and allow more flexible user permissions for tools. One of the side-effects of this is that user accounts will now have to be unique across all 900 Wikimedia wikis. See the announcement for more information.

Unfortunately, your account clashes with another account also called Ruchi jain. To make sure that both of you can use all Wikimedia projects in future, we have reserved the name Ruchi jain~enwikibooks that only you will have. If you like it, you don't have to do anything. If you do not like it, you can pick out a different name.

Your account will still work as before, and you will be credited for all your edits made so far, but you will have to use the new account name when you log in.

Sorry for the inconvenience.

Yours, Keegan Peterzell Community Liaison, Wikimedia Foundation 23:41, 17 March 2015 (UTC)

Renamed
 This account has been renamed as part of single-user login finalisation. If you own this account you can |log in using your previous username and password for more information. If you do not like this account's new name, you can choose your own using this form after logging in: . -- Keegan (WMF) (talk) 05:26, 19 April 2015 (UTC)

title: User talk:Ruchi jain~enwikibooks


text:
User:Jtise001

This is a christian sight

title: User:Jtise001


text:
Cookbook:Ground Tofu

Many commercial vegetarian ground beef replacements are sold. They all probably taste better than this recipe, but this one has the advantage of customization, and is also gluten-free. You always know exactly what goes into what you cook yourself.

All ingredient amounts in this recipe are approximate and can be adjusted to taste.

Ingredients

 * 2 tablespoons wheat-free low-sodium tamari
 * ¼ teaspoon yeast extract
 * ½ teaspoon beet juice (for example, from canned beets)
 * ¼ teaspoon powdered shiitake mushroom (see notes)
 * ¼ onion powder
 * 4 ounces (110 g) extra-firm tofu
 * Canola oil

Procedure

 * 1) Make the marinade by mixing together tamari, yeast extract, beet juice, shiitake powder, and onion powder in a small mixing bowl. Make sure the mushroom powder and yeast extract are evenly incorporated with no lumps.
 * 2) Drain the tofu, pressing it to get rid of as much moisture as possible. Combine marinade with tofu, crushing the tofu into small pieces and allowing it to absorb the liquid evenly. Placing the tofu in a zip-top bag, pouring the marinade over it, sealing it, and then crushing the tofu with the fingers works well. You want no pieces of tofu larger than a fingernail.
 * 3) Allow sufficient time for the marinade to soak completely into the tofu, such as several hours or overnight.
 * 4) Heat a medium-sized non-stick skillet over medium heat. Using a small amount of canola oil—just enough to coat the cooking surface—sauté the tofu, browning it to a golden color. Between the marinade and heat, it will achieve a medium-brown, but won't achieve the deep brown of ground beef or commercial ground beef substitute.
 * 5) Once the tofu is browned, it will still be quite soft. You can improve its texture by spreading it out in the hot pan and allowing it to cool for some time.
 * 6) Store the ground tofu in the refrigerator. It can be reheated by heating it through in a skillet for whatever application you desire. It can be used as a filling for tacos, sloppy joes, meat sauces for pasta, and the like.

Notes, tips, and variations

 * Regular soy sauce or even tamari can be too salty in the end. Wheat-free is only needed if a gluten-free result is desired.
 * Some vendors sell products containing a significant amount of yeast extract (such as rice cakes with yeast extract) as gluten-free; this source recommends avoiding yeast extract as containing barley. If you want to avoid the yeast extract, you might try increasing the amount of mushroom powder and beet juice.
 * Make mushroom powder by grinding dried shitake mushroom with a mortar and pestle until no large pieces remain. This takes some time, as the dried mushroom is slightly leathery.

title: Cookbook:Ground Tofu


text:
Talk:Announcing/On Being a Broadcast Journalist

Hey Ashlie!!! I enjoyed your insight into the world of broadcast journalism! I hope that everything works out for you and I will definitely be taking everything you mentioned into consideration when I begin to apply for a job!!!


text:
User:Oxford88~enwikibooks

I have quit wikibooks

title: User:Oxford88~enwikibooks


text:
User talk:Oxford88~enwikibooks

My name is User:Oxford88 could you please give me some pointers!

The Problem
I don't know what I'm suspost to could you please help me.

Your account will be renamed
Hello,

The developer team at Wikimedia is making some changes to how accounts work, as part of our on-going efforts to provide new and better tools for our users like cross-wiki notifications. These changes will mean you have the same account name everywhere. This will let us give you new features that will help you edit and discuss better, and allow more flexible user permissions for tools. One of the side-effects of this is that user accounts will now have to be unique across all 900 Wikimedia wikis. See the announcement for more information.

Unfortunately, your account clashes with another account also called Oxford88. To make sure that both of you can use all Wikimedia projects in future, we have reserved the name Oxford88~enwikibooks that only you will have. If you like it, you don't have to do anything. If you do not like it, you can pick out a different name.

Your account will still work as before, and you will be credited for all your edits made so far, but you will have to use the new account name when you log in.

Sorry for the inconvenience.

Yours, Keegan Peterzell Community Liaison, Wikimedia Foundation 23:33, 17 March 2015 (UTC)

Renamed
 This account has been renamed as part of single-user login finalisation. If you own this account you can |log in using your previous username and password for more information. If you do not like this account's new name, you can choose your own using this form after logging in: . -- Keegan (WMF) (talk) 05:20, 19 April 2015 (UTC)

title: User talk:Oxford88~enwikibooks


text:
User talk:Believer~enwikibooks

I tried to answer some of your concerns on WB:VFD. I don't necessarily want to see your book be deleted, but if it violates the NPOV policy, then it must be deleted. If you say that you can fix the problem, I will certainly give you time to do so, but if you can't, your book will be deleted. Good luck with your effort! --Whiteknight (talk) (projects) 01:08, 21 September 2006 (UTC)
 * The main goal of Wikibooks is to create books with Netural Point of View - so that anyone could use them, regardless of his religion, nationality and so on. I see two ways for your text - leaving current point of view and moving it to another place (perhaps there is a muslim wiki?) or re-writing it so that it will use neutral point of view and be understandable also to these people, who don't know much about islam. --Derbeth talk 07:17, 21 September 2006 (UTC)

Your account will be renamed
Hello,

The developer team at Wikimedia is making some changes to how accounts work, as part of our on-going efforts to provide new and better tools for our users like cross-wiki notifications. These changes will mean you have the same account name everywhere. This will let us give you new features that will help you edit and discuss better, and allow more flexible user permissions for tools. One of the side-effects of this is that user accounts will now have to be unique across all 900 Wikimedia wikis. See the announcement for more information.

Unfortunately, your account clashes with another account also called Believer. To make sure that both of you can use all Wikimedia projects in future, we have reserved the name Believer~enwikibooks that only you will have. If you like it, you don't have to do anything. If you do not like it, you can pick out a different name.

Your account will still work as before, and you will be credited for all your edits made so far, but you will have to use the new account name when you log in.

Sorry for the inconvenience.

Yours, Keegan Peterzell Community Liaison, Wikimedia Foundation 22:58, 17 March 2015 (UTC)

Renamed
 This account has been renamed as part of single-user login finalisation. If you own this account you can |log in using your previous username and password for more information. If you do not like this account's new name, you can choose your own using this form after logging in: . -- Keegan (WMF) (talk) 04:37, 19 April 2015 (UTC)

title: User talk:Believer~enwikibooks