Description:
============
program_name.txt - Holds the actual executable code.
    This file is main file where you start recovering process.

program_name_Head.txt - in this file is some information about Procedures names,
    Function declaration ... (Only if minimize rcode size = NO by compilation)
    This file has only information character.

program_name_Text.txt - Holds all literal character strings for the r-code file.
    There is one text segment for the default language and one for each language
    specified in the COMPILE statement. Duplicate literals are removed.
    This file has only information character. Can help in case that rcode has 
    striped information and you can find here variable names (not referenced, 
    just names without any assignment)

program_name_Initial.txt - Contains information required to initialize an 
    r-code file for execution, including database and table references, variable
    definitions, TEMP-TABLE definitions, a list of defined frames.
    Information from this file can help rebuild e.g. TEMP-TABLE definition

program_name_Frame.txt - Contains layout information for a frame, including frame
    fields, attributes, and all RPN expression code from the frame phrase. There
    is one frame segment for each named and unnamed frame in the r-code file.
    Information from this file can help rebuild GUI layout of the application

program_name_Class.txt - Contains class definitions for OOABL code.


Explanations:
=============
- In some cases are variable names not recovered, then you can see:

  Var1.Dec_2 : Variable defined in Definition section (*.w) or at the 
               beginning of normal program (*.p) with type Decimal.
               Global variable is visible in all procedures of program,
               local variable only in procedure ...
  Loc1.Log_2 : Variable defined in procedures (*.w) with type Logical

if you read program_name.r_Text 1.txt you can also find here original
names for these variables

- If you don't provide dump with database details then database fields will 
  not have names, only numbers and types e.g.:
  DATABASE.TABLE.Chr_2 - it's character field number 2.
  (for database Fields you must dump all used database with script
  that i provide)


Limitations:
============
- FOR EACH, REPEAT and DO blocks are shown as DO: block, here are some clues e.g.

    FOR EACH some_tbl BY some_tbl.field_1:
    recovered as:
        /* record-phrase used in next block/query statement */ <- not in original code, just use info for next FOR:
            SAVE CACHE some_tbl
                USE-INDEX z_ndx
                NO-LOCK NO-ERROR
            FIND NEXT some_tbl
                USE-INDEX z_ndx
                NO-LOCK
        FOR: 
            ....
        END.

    DO i = 1 TO 5 BY 2:
    recovered as:
        /* VAR, FROM */ 
            i = (1 - 2)         <- From
        /* TO, BY */ 
            i = (i + 2)         <- By
            (i <= 5)            <- To
        DO:
            ....
        END.

    DO WHILE i > 3:
    recovered as:
        /* WHILE */ 
            (i > 3)
        DO:
            ....
        END.

- OPEN QUERY Statements: ignore table/fields names written in record-phrase, correct is from OPEN QUERY

    OPEN QUERY myQRY2 FOR EACH customer WHERE customer.name = "xxx" OR customer.city BEGINS "yyy" AND discount > 123.
    recovered as:
        /* record-phrase used in next block/query statement */  <- not in original code, just use info for next OPEN QUERY:
            SAVE CACHE COMPLETE some_tbl  /* bad table, correct is DEMO.CUSTOMER */
                WHERE ((some_tbl.Meno = "xxx") OR ((LocVar_0.Chr_6 BEGINS "yyy") AND (LocVar_0.Int_11 > 123))) /* also bad field names */
                SHARE-LOCK NO-ERROR
            FIND NEXT some_tbl
                WHERE ((some_tbl.Meno = "xxx") OR ((LocVar_0.Chr_6 BEGINS "yyy") AND (LocVar_0.Int_11 > 123)))
                SHARE-LOCK
        OPEN QUERY myQRY2 FOR EACH demo.customer

- CAN-FIND, before each command you find some stuf that belongs to it

    CAN-FIND(ORDER).
    recovered as:
        /* CAN-FIND STUFF */
          FIND FIRST DEMO.ORDER
            USE-INDEX order-num
            NO-LOCK
        L = CAN-FIND(^ see above ^)
        
    CAN-FIND(LAST ORDER).
    recovered as:
        /* CAN-FIND STUFF */
          FIND LAST DEMO.ORDER
            USE-INDEX order-num
            NO-LOCK
        L = CAN-FIND(^ see above ^)

- SUBSTRING, OVERLAY, ENTRY, PUT-STRING and RAW are displayed wrong so you must 
  correct it manually, remove N parameter and put it on the other side e.g. :
    C = <- Ignore, SUBSTRING(C,1,"X3")                   =>     SUBSTRING(C, 1) = "X3".
    C = <- Ignore, SUBSTRING(C,1,"X2",3)                 =>     SUBSTRING(C, 1, 3) = "X2".
    C = <- Ignore, SUBSTRING(C,1,"X1",3,"CHARACTER")     =>     SUBSTRING(C, 1, 3, "CHARACTER") = "X1".
    C = <- Ignore, OVERLAY(C,1,"X3")                     =>     OVERLAY(C, 1) = "X3".
    C = <- Ignore, OVERLAY(C,1,"X2",3)                   =>     OVERLAY(C, 1, 3) = "X2".
    C = <- Ignore, OVERLAY(C,1,"X1",3,"CHARACTER")       =>     OVERLAY(C, 1, 3, "CHARACTER") = "X1".
    ORDER.Name = <- Ignore, RAW(ORDER.Name,RA)           =>     RAW ( ORDER.Name) = RA.
    ORDER.Name = <- Ignore, RAW(ORDER.Name,RA,1)         =>     RAW ( ORDER.Name , 1) = RA.
    ORDER.Name = <- Ignore, RAW(ORDER.Name,RA,1,2)       =>     RAW ( ORDER.Name , 1 , 2 ) = RA.
    C2 = <- Ignore, ENTRY(C2,1,C)                        =>     ENTRY(1, c2) = C.
    C2 = <- Ignore, ENTRY(C2,2,C,"divider")              =>     ENTRY(2, c2,"divider") = C.
    Mem = <- Ignore, PUT-STRING(Mem,200,C)               =>     PUT-STRING ( Mem ,200 ) = C.
    Mem = <- Ignore, PUT-STRING(Mem,200,C,7)             =>     PUT-STRING ( Mem ,200, 7) = C.

- Single ASSIGN object can be written: e.g.  ASSIGN buExit => ASSIGN {&SELF-NAME}.

- Single ASSIGN variable after MESSAGE UPDATE you can ignore e.g.
    MESSAGE
      "Some question?"
      VIEW-AS ALERT-BOX QUESTION BUTTONS YES-NO-CANCEL
      UPDATE lvRet
    ASSIGN lvRet  <= you can ignore this statement

- PUT PROC-HANDLE FORMAT "->,>>>,>>9"                    =>     PUT CURSOR. 

- DELETE VALIDATE TABLE - in some cases is VALIDATE inserted automatically by PROGRESS
  with text defined in TABLE properties. Ignore it if it's used from properties.

- if are in program used some includes (*.i) they are joined to main *.p
  before compiling as a part of program, so it's impossible extract it after
  recovery. If you have two or more files that use the same include, you
  can compare recovered source and select the same part that they use it,
  and build from this same part your include ...

- There can be some UNKNOWN strings, it's because recovery is still
  in development status and not all is supported now

- Attributes after "::" like Object::("Some_Attr") => Object::Some_Attr

- Not identified objects on frame, example: ON CHOOSE OF UNKNOWN_OBJECT_2_6
  If you look to output file Source_Frames.txt at the end is /*** Summary ***/
  section. Here you have all objects with numbers and their frames.
  Mostly are wrong identified frames but numbers are OK so UNKNOWN_OBJECT_2_6
  is represented as Object_6 on Frame_2. Try you look for correct frame and 
  change 2 (bad) for some other frame with correct object number 6 (always ok).
  If you have big object number then frames with low numbers can be excluded.
