This and the next two TechTips will provide valuable information and guidance on how to successfully convert your fixed-format code, covering several different aspects of the process, from manual code "refitting" to op code conversion/replacement.
There are tools that "automagically" convert your code from fixed- to free-format, such as RDi (Rational Developer for Power Systems, formerly WDSC Web Studio Development Client) and other IDEs. However, you can do it manually. In most situations, converting code to free-format manually consists of the following:
- Include the /FREE directive before the first line of code to convert.
- Remove the Cs from the left side of the lines of code.
- Whenever a Factor 1 position is filled, swap it with the operation code.
- Append the semicolon character (;) to the end of all lines of code.
- Replace the asterisk (*) with two slashes (//) in all lines of comments. Just make sure you indent the comments to the same alignment as the lines of code they correspond to.
- Include the /END-FREE directive after the last line of code to convert.
Whichever method you use, there are situations in which this is not possible, because some fixed-format operation codes didn't make the cut to free-format. The next section lists them and presents alternative solutions.
The Operation Codes Free-Format Left Behind
As I mentioned, quite a few operation codes didn't make it to free-format. Let's go over most of them, starting with the easy ones.
The Quick Wins
I explained in two TechTips how you can strip your source code of all the MOVE and MOVEL operation codes, but there are other quick wins. Let's start with ADD, SUB, DIV, MULT, Z-ADD, and Z-SUB. These are perfect candidates for replacement by an EVAL operation.
Here's an example of the MULT operation code:
C W_SliPPizza MULT W_Pizzas W_TotSlices
Here's its free-format EVAL equivalent:
W_Total_Slices = W_Slices_Per_Pizza * W_Pizzas;
The same goes for all the aforementioned operation codes; this was something you could do in fixed-format (well, with shorter variable names).
Moving Toward a More Structured Programming Syntax
Something else you could already do in fixed-format was get rid of those confusing IFXX, ANDXX, and ORXX operation codes. The XX stands for LT (lesser than), LE (lesser than or equal to), EQ (equal to), GT (greater than), or GE (greater than or equal to). These variations of operation codes are a peculiarity of RPG. IBM decided that they do more harm than good (quite rightfully, in my opinion), so they were left out of free-format for the sake of readability and likeness to other languages. This change also contributes to a more structured programming syntax, because it facilitates the use of composed conditions while maintaining readability and maintainability.
Let's look at an example of the increased readability. Consider this fixed-format code:
C P_Age IFGE 20
C P_Sex ANDEQ 'F'
It becomes more readable in free-format:
IF Age >= 20 And Sex = 'F';
The same goes for the DOUXX and DOWXX operations. This ugly DOWXX operation:
C W_Number DOWGT 1
is transformed into this:
DOW W_Number > 1;
Better, right? You can also include parentheses for additional control over operator precedence during the evaluation of the expressions. This syntax is also applicable to WHENXX, as you probably noticed in the example I presented in the previous TechTip.
Operation Codes That Became BIFs
Some operation codes were simply replaced by BIFs with the same name. I mentioned in an earlier TechTip that SCAN became the %SCAN BIF with similar functionality. There are others, as well, like %ALLOC, %CHECK, %CHECKR, %DIV, %OCCUR, %REALLOC, %SHTDN, %SQRT, %SUBST, %XFOOT, and %XLATE. There are very few differences between the op codes and BIFs. You just need to use an EVAL statement (which you can do implicitly if you don't need extenders) and assign the result of the operation to a target variable.
Here's an example for converting SCAN to %SCAN:
C 'ABC' SCAN 'XCABCD' W_RESULT
This translates to the following piece of code in free-format:
W_Result = %Scan('ABC' : 'XCABCD');
Other Operation Codes (Kind of) Replaced by BIFs
There are other operation codes that were also replaced by BIFs but that have different names and require a little tweaking:
- ADDDUR, SUBDUR, EXTRCT, and TIME are easily replaced by the date/time BIFs discussed in earlier TechTips.
- MVR is replaced by %REM.
- BITOFF is replaced by %BITAND or %BITOR.
- BITON is replaced by %BITOR.
There are also more exotic replacements (at least for me—I've never actually used them):
- MHHZO, MHLZO, MLHZO, and MLLZO are replaced by %BITAND and %BITOR.
- TESTB and TESTZ are replaced by %BITAND.
This concludes the conversion of the "easy" operation codes. The next TechTip will discuss how to replace COMP, CASXX, and the terrible trio of CABXX, TAG, and GOTO. That's certainly going to be an interesting article, because there's no direct replacement for these operation codes!