Porting C-Source to OS/400

From Try-AS/400
Jump to navigation Jump to search
Qsicon Fixme.png This article isn't finished yet or needs to be revised. Please keep in mind that thus it may be incomplete.

Reason: Complete with Links to all necessary Books.

Because of the uncommon file handling, name length and character constraints, porting is already a mostly manual task.[1]

Most often, the real challenge is to manually put together a config.h file. Since there's no capable UNIX shell environment, ./configure is no option.[2]

Preparations for QSYS.LIB

Preparations are mostly one on UNIX/Linux side.

  1. Convert Tabs to spaces:[3]
    for FILE in *.c *.h; do cp ${FILE} ${FILE}~; expand -i -t4 < ${FILE}~ > ${FILE}; done
  2. Find out longest line in all C- and H-Files.
    wc -L *.c |sort -rn |head
  3. Eliminate too long lines by wrapping. This is easily done with set colorcolumn=80 in vim, and scrolling through the files with a wide window. [4]
  4. Create (at least) two appropriate SRCPF with matching maximum line lengths through the RCDLEN parameter for CRTSRCPF:
    1. One (or more) for C-Files (may be named QCSRC),[5]
    2. One for H-Files (must be named H).
  5. Upload.
    1. If the file names are already shorter than 10 Characters (excluding file extension), just upload to a SRC PF:
      for FILE in *.c; do echo -n "put ${FILE} MYLIB/QCSRC."; basename ${FILE} .c; done |ftp as400[6][7].
    2. If the file names are longer, you'll have considerable fun to come up with shorter names, possibly grep through and replace in all text files if you needed to shorten a .h name, manually put together a textfile with approopriate put commands, and hope for the best.
  6. Change file type to C:
    for FILE in *.c; do echo "quote rcmd CHGPFM FILE(MYLIB/QCSRC) MBR(`basename ${FILE} .c`) SRCTYPE(C)"; done |ftp as400[8]

The precompiler searches private includes in *LIBL/H, without the .h-Extension.

Compile Cycle

Compile object files as follows:

CRTCMOD MODULE(MYLIB/MAIN) SRCFILE(MYLIB/QCSRC) DEFINE(DEF1 DEF2=1) OPTION(*LOGMSG) OUTPUT(*PRINT)[9]

If compilation fails, output will go into a spooled file in QEZJOBLOG queue. This is the most tedious task. Compile, check output, fix problems, repeat.

Link object files to a program as follows:

CRTPGM PGM(MYLIB/MYPG) MODULE(MYLIB/*ALL) ENTMOD(*PGM) ACTGRP(*NEW) DETAIL(*BASIC)

Footnotes

  1. It's possible to use stream files in IFS as compiler input, but compiled objects have to be put into a QSYS.LIB, library. So, the file name restrictions apply anyway. The line length problem is mostly gone, though.
  2. With V4R5, IBM claims to have implemented the C90 standard in Compiler and C-Library. I did not yet find a readymade config.h with all statements needed for a C90 environment.
  3. Tabs appear in SEU as only one blank. This makes source indentation hardly visible.
  4. Wider than 80 chars, that is.
  5. It could be clever to create one PF per subdirectory.
  6. Automatic login and switching to ASCII mode is done though a ~/.netrc-file.
  7. FTP ASCII takes care to convert ASCII to EBCDIC.
  8. This is a good example how to exploit the ftp server's ability to call CL commands as a replacement for rcmd.
  9. Possibly add SYSIFCOPT(*IFS64IO) if large file support is desired.