/* REXX */

/*
-----------------------------------------------------------------
  unpacker (v0.1) = public domain : free for any use

  AUTHOR: rugxulo _AT_ gmail

  TESTED: Regina 3.7, BRexx 2.1.9, r4 4.00, ooREXX 4.1.3

  BUG:    Can't use literal '*'+'/' pair in embedded data files.
-----------------------------------------------------------------
*/

/* --- UNPACKER BEGINS --- */

if arg() \= 0 then parse arg onlyfile . ; else onlyfile=''
parse source . . srcfile . ; lineno=0 ; writeln=0

bar = '===' ; prefix='/*' bar ; postfix = bar '*/'
headpost=' begins' postfix ; footpost=' ends' postfix
headlen=length(headpost) ; footlen=length(footpost)

if lines(srcfile)=1 then do while lines(srcfile) \= 0
  call grab
end
else do lines(srcfile)
  call grab
end

exit

grab:
  line=linein(srcfile) ; lineno=lineno+1
  if pos(headpost,line) \= 0 then do
    parse var line ' ' (bar) ' ' outfile (headpost) .
    if onlyfile='' then say outfile
    writeln=1
  end
  else if pos(footpost,line) \= 0 then writeln=0
  if pos(headpost,line)=0 & pos(footpost,line)=0 & writeln then ,
    if onlyfile='' | onlyfile=outfile then ,
      call lineout outfile, line
return

/* --- UNPACKER ENDS --- */

/*
------------------------------------------------------------
*** DATA BEGINS DATA BEGINS DATA BEGINS DATA BEGINS ***

/* these data files = public domain : free for any use */
------------------------------------------------------------

/* === Str.def begins === */
DEFINITION MODULE Str;

PROCEDURE FindNext(this,that:ARRAY OF CHAR; start:CARDINAL;
                   VAR isfound:BOOLEAN; VAR wherefound:CARDINAL);
PROCEDURE Extract(src:ARRAY OF CHAR; start,count:CARDINAL;
                  VAR dest:ARRAY OF CHAR);
PROCEDURE Append(src:ARRAY OF CHAR; VAR dest:ARRAY OF CHAR);
PROCEDURE Assign(src:ARRAY OF CHAR; VAR dest:ARRAY OF CHAR);
PROCEDURE Length(s:ARRAY OF CHAR):CARDINAL;
PROCEDURE CompareStr(s1,s2:ARRAY OF CHAR):INTEGER;
PROCEDURE Insert(this:ARRAY OF CHAR; at:CARDINAL; VAR that:ARRAY OF CHAR);
PROCEDURE Delete(VAR inhere:ARRAY OF CHAR; start,count:CARDINAL);

END Str.
/* === Str.def ends === */

/* === Str.fst begins === */
(* public domain, nenies proprajho, free for any use *)
IMPLEMENTATION MODULE Str; (* FST *)
IMPORT Strings;

PROCEDURE FindNext(this,that:ARRAY OF CHAR; start:CARDINAL;
                   VAR isfound:BOOLEAN; VAR wherefound:CARDINAL);
BEGIN
  wherefound := Strings.Pos(this,that);
  isfound := wherefound <= HIGH(that)
END FindNext;

PROCEDURE Extract(src:ARRAY OF CHAR; start,count:CARDINAL;
                  VAR dest:ARRAY OF CHAR);
BEGIN Strings.Copy(src,start,count,dest)
END Extract;

PROCEDURE Append(src:ARRAY OF CHAR; VAR dest:ARRAY OF CHAR);
BEGIN Strings.Append(dest,src)
END Append;

PROCEDURE Assign(src:ARRAY OF CHAR; VAR dest:ARRAY OF CHAR);
BEGIN Strings.Assign(src,dest)
END Assign;

PROCEDURE Length(s:ARRAY OF CHAR):CARDINAL;
BEGIN RETURN Strings.Length(s)
END Length;

PROCEDURE CompareStr(s1,s2:ARRAY OF CHAR):INTEGER;
BEGIN RETURN Strings.CompareStr(s1,s2)
END CompareStr;

PROCEDURE Insert(this:ARRAY OF CHAR; at:CARDINAL; VAR that:ARRAY OF CHAR);
BEGIN Strings.Insert(this,that,at)
END Insert;

PROCEDURE Delete(VAR here:ARRAY OF CHAR; start,count:CARDINAL);
BEGIN Strings.Delete(here,start,count)
END Delete;

END Str.
/* === Str.fst ends === */

/* === Str.gpm begins === */
(* public domain, nenies proprajho, free for any use *)
IMPLEMENTATION MODULE Str; (* GPM *)
IMPORT StdStrings;

PROCEDURE FindNext(this,that:ARRAY OF CHAR; start:CARDINAL;
                   VAR isfound:BOOLEAN; VAR wherefound:CARDINAL);
BEGIN StdStrings.FindNext(this,that,start,isfound,wherefound)
END FindNext;

PROCEDURE Extract(src:ARRAY OF CHAR; start,count:CARDINAL;
                  VAR dest:ARRAY OF CHAR);
BEGIN StdStrings.Extract(src,start,count,dest)
END Extract;

PROCEDURE Append(src:ARRAY OF CHAR; VAR dest:ARRAY OF CHAR);
BEGIN StdStrings.Append(src,dest)
END Append;

PROCEDURE Assign(src:ARRAY OF CHAR; VAR dest:ARRAY OF CHAR);
BEGIN StdStrings.Assign(src,dest)
END Assign;

PROCEDURE Length(s:ARRAY OF CHAR):CARDINAL;
BEGIN RETURN StdStrings.Length(s)
END Length;

PROCEDURE CompareStr(s1,s2:ARRAY OF CHAR):INTEGER;
BEGIN
  IF StdStrings.Compare(s1,s2) = StdStrings.equal THEN RETURN 0
  ELSE RETURN -1
  END
END CompareStr;

PROCEDURE Insert(this:ARRAY OF CHAR; at:CARDINAL; VAR that:ARRAY OF CHAR);
BEGIN StdStrings.Insert(this,at,that)
END Insert;

PROCEDURE Delete(VAR here:ARRAY OF CHAR; start,count:CARDINAL);
BEGIN StdStrings.Delete(here,start,count)
END Delete;

END Str.
/* === Str.gpm ends === */

/* === Str.xds begins === */
(* public domain, nenies proprajho, free for any use *)
IMPLEMENTATION MODULE Str; (* XDS *)
IMPORT Strings;

PROCEDURE FindNext(this,that:ARRAY OF CHAR; start:CARDINAL;
                   VAR isfound:BOOLEAN; VAR wherefound:CARDINAL);
BEGIN Strings.FindNext(this,that,start,isfound,wherefound)
END FindNext;

PROCEDURE Extract(src:ARRAY OF CHAR; start,count:CARDINAL;
                  VAR dest:ARRAY OF CHAR);
BEGIN Strings.Extract(src,start,count,dest)
END Extract;

PROCEDURE Append(src:ARRAY OF CHAR; VAR dest:ARRAY OF CHAR);
BEGIN Strings.Append(src,dest)
END Append;

PROCEDURE Assign(src:ARRAY OF CHAR; VAR dest:ARRAY OF CHAR);
BEGIN Strings.Assign(src,dest)
END Assign;

PROCEDURE Length(s:ARRAY OF CHAR):CARDINAL;
BEGIN RETURN Strings.Length(s)
END Length;

PROCEDURE Insert(this:ARRAY OF CHAR; at:CARDINAL; VAR that:ARRAY OF CHAR);
BEGIN Strings.Insert(this,at,that)
END Insert;

PROCEDURE Delete(VAR inhere:ARRAY OF CHAR; start,count:CARDINAL);
BEGIN Strings.Delete(inhere,start,count)
END Delete;

PROCEDURE CompareStr(s1,s2:ARRAY OF CHAR):INTEGER;
BEGIN
  IF Strings.Compare(s1,s2) = Strings.equal THEN RETURN 0
  ELSE RETURN -1
  END
END CompareStr;

END Str.
/* === Str.xds ends === */

/* === Str.m2c begins === */
(* public domain, nenies proprajho, free for any use *)
IMPLEMENTATION MODULE Str; (* M2C *)
IMPORT String;

PROCEDURE FindNext(this,that:ARRAY OF CHAR; start:CARDINAL;
                   VAR isfound:BOOLEAN; VAR wherefound:CARDINAL);
VAR here:INTEGER;
BEGIN here := String.Pos(that,this);
  isfound := here # -1;
  IF isfound THEN wherefound := here END
END FindNext;

PROCEDURE Extract(src:ARRAY OF CHAR; start,count:CARDINAL;
                  VAR dest:ARRAY OF CHAR);
BEGIN String.Extract(dest,src,start,count)
END Extract;

PROCEDURE Append(src:ARRAY OF CHAR; VAR dest:ARRAY OF CHAR);
BEGIN String.Append(dest,src)
END Append;

PROCEDURE Assign(src:ARRAY OF CHAR; VAR dest:ARRAY OF CHAR);
BEGIN String.Copy(dest,src)
END Assign;

PROCEDURE Length(s:ARRAY OF CHAR):CARDINAL;
BEGIN RETURN String.Length(s)
END Length;

PROCEDURE CompareStr(s1,s2:ARRAY OF CHAR):INTEGER;
BEGIN RETURN String.Compare(s1,s2)
END CompareStr;

PROCEDURE Insert(this:ARRAY OF CHAR; at:CARDINAL; VAR that:ARRAY OF CHAR);
BEGIN String.Insert(this,that,at)
END Insert;

PROCEDURE Delete(VAR here:ARRAY OF CHAR; start,count:CARDINAL);
BEGIN String.Delete(here,start,count)
END Delete;

END Str.
/* === Str.m2c ends === */


# --- extract.awk begins ---
#!/usr/bin/awk -f

/[b]egins ===/{
  fname=$3 ; print fname
  while (getline > 0) {
    if ($0 !~ / [e]nds ===/) {
      print > fname
    }
    else {
      close(fname)
      break
    }
  }
}
# --- extract.awk ends ---

------------------------------------------------------------
*** DATA ENDS DATA ENDS DATA ENDS DATA ENDS ***
------------------------------------------------------------
*/

/* EOF */
