/* 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.ob2 begins === */
(* public domain, nenies proprajho, free for any use *)
MODULE Str; (* XDS *)
IMPORT S := O2Strings;

PROCEDURE Length*(s:ARRAY OF CHAR):INTEGER;
BEGIN RETURN S.Length(s)
END Length;

PROCEDURE Append*(this:ARRAY OF CHAR; VAR that:ARRAY OF CHAR);
BEGIN S.Append(this,that)
END Append;

PROCEDURE Pos*(findthis,lookhere:ARRAY OF CHAR; start:INTEGER):INTEGER;
BEGIN RETURN S.Pos(findthis,lookhere,start)
END Pos;

PROCEDURE Extract*(src:ARRAY OF CHAR; start,howmany:INTEGER; VAR dest:ARRAY OF CHAR);
BEGIN S.Extract(src,start,howmany,dest)
END Extract;

PROCEDURE Insert*(src:ARRAY OF CHAR; where:INTEGER; VAR dest:ARRAY OF CHAR);
BEGIN S.Insert(src,where,dest)
END Insert;

PROCEDURE Delete*(VAR inhere:ARRAY OF CHAR; where,howmany:INTEGER);
BEGIN S.Delete(inhere,where,howmany)
END Delete;

END Str.
/* === Str.ob2 ends === */

/* === Str.m begins === */
(* public domain, nenies proprajho, free for any use *)
MODULE Str; (* Oxford *)
IMPORT S := Strings;

PROCEDURE Length*(s:ARRAY OF CHAR):INTEGER;
BEGIN RETURN S.Length(s)
END Length;

PROCEDURE Append*(this:ARRAY OF CHAR; VAR that:ARRAY OF CHAR);
BEGIN S.Append(this,that)
END Append;

PROCEDURE Pos*(findthis,lookhere:ARRAY OF CHAR; start:INTEGER):INTEGER;
BEGIN RETURN S.Pos(findthis,lookhere,start)
END Pos;

PROCEDURE Extract*(src:ARRAY OF CHAR; start,howmany:INTEGER; VAR dest:ARRAY OF CHAR);
BEGIN S.Extract(src,start,howmany,dest)
END Extract;

PROCEDURE Insert*(src:ARRAY OF CHAR; where:INTEGER; VAR dest:ARRAY OF CHAR);
BEGIN S.Insert(src,where,dest)
END Insert;

PROCEDURE Delete*(VAR inhere:ARRAY OF CHAR; where,howmany:INTEGER);
BEGIN S.Delete(inhere,where,howmany)
END Delete;

END Str.
/* === Str.m ends === */

/* === Str.mod begins === */
(* public domain, nenies proprajho, free for any use *)
MODULE Str; (* Oberon-M *)

PROCEDURE Length*(s:ARRAY OF CHAR):INTEGER;
VAR i:INTEGER;
BEGIN i := 0; WHILE s[i] # 0X DO INC(i) END;
RETURN i
END Length;

PROCEDURE Insert*(src:ARRAY OF CHAR; where:INTEGER; VAR dest:ARRAY OF CHAR);
VAR slen,i:INTEGER;
BEGIN slen := Length(src); i := Length(dest);
  WHILE i >= where DO dest[i+slen] := dest[i]; DEC(i) END;
  i := 0; WHILE i < slen DO dest[where+i] := src[i]; INC(i) END
END Insert;

PROCEDURE Delete*(VAR src:ARRAY OF CHAR; where,howmany:INTEGER);
VAR i,len:INTEGER;
BEGIN len := Length(src); i := where+howmany;
  WHILE i <= len+1 DO src[i-howmany] := src[i]; INC(i) END
END Delete;

PROCEDURE Extract*(src:ARRAY OF CHAR; where,howmany:INTEGER;
                   VAR dest:ARRAY OF CHAR);
VAR i:INTEGER;
BEGIN i := 0;
  WHILE i < howmany DO dest[i] := src[where+i]; INC(i) END;
  dest[i] := 0X
END Extract;

PROCEDURE Append*(src:ARRAY OF CHAR; VAR dest:ARRAY OF CHAR);
VAR i,len:INTEGER;
BEGIN len := Length(dest); i := 0;
  WHILE i < Length(src) DO dest[len+i] := src[i]; INC(i) END;
  dest[len+i] := 0X
END Append;

PROCEDURE Pos*(this,that:ARRAY OF CHAR; start:INTEGER):INTEGER;
VAR i,slen,len,rc,p:INTEGER; bak,tmp:ARRAY 255 OF CHAR;

  PROCEDURE foundchar(k:CHAR):BOOLEAN;
  VAR n,rc:INTEGER; done:BOOLEAN;
  BEGIN rc := -1;
    IF len > 0 THEN
      n := start; done := FALSE;
      WHILE (n < len) & ~done DO
        IF k = that[n] THEN
          rc := n;
          done := TRUE
        END;
        INC(n)
      END
    END;
    p := rc;
  RETURN rc # -1
  END foundchar;

BEGIN (* Pos *) rc := -1; slen := Length(this); len := Length(that);
  IF len >= slen THEN
    COPY(that,bak);
    REPEAT
      IF foundchar(this[0]) THEN
        IF len+1 < p+slen-1 THEN p := -1
        ELSE
          Extract(that,p,slen,tmp);
          IF tmp = this THEN rc := p; p := -1;
          ELSE that[p] := "$"
          END
        END
      END
    UNTIL p = -1;
    COPY(bak,that)
  END;
RETURN rc
END Pos;

END Str.
/* === Str.mod 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 */
