******************************************************************************** * * Program to convert PI/open GCI definition file to uniVerse format * * Module %M% Version %I% Date %H% * * (c) Copyright 1998 Ardent Software Inc. - All Rights Reserved * This is unpublished proprietary source code of Ardent Software Inc. * The copyright notice above does not evidence any actual or intended * publication of such source code. * ******************************************************************************* * * Maintenence log - insert most recent change descriptions at top * * Date.... GTAR# WHO Description......................................... * 10/14/98 23801 SAP Change copyrights. * 09/06/96 19192 ALC Corrected use of OS.TYPE * 04/03/96 18026 PGW For Windows NT, allow GCI file name on command line * 03/25/94 12300 LA Changed to handle all PI/open variable types. * 02/17/94 12300 LA Initial implementation. * ******************************************************************************* * * Program Description: * * Called from the GCI administration menu to take a PI/open GCI * definition file and put the subroutine definitions contained therein * into the (or a) uniVerse GCI definition file. * * NOTE: The PI/open GCI definition file must have been converted to * a uniVerse format file by the account conversion tools before * it can be read by this program. * * Calling Sequence: * * Unix: RUN APP.PROGS GCI.CONVPI.B * * NT: RUN APP.PROGS GCI.CONVPI.B file.name * * where file.name is the name of the GCI Definition File into which * the converted definitions will be written. * * The program prompts for the pathname of the PI/open GCI definition file. * ******************************************************************************* PROGRAM GCI.CONVPI.B ID = "@(#)%M% %I%" $INCLUDE UNIVERSE.INCLUDE MACHINE.NAME EQUATE PI.EXT TO 1 EQUATE PI.LANG TO 2 EQUATE PI.TYPE TO 4 EQUATE PI.DIRECTION TO 5 EQUATE PI.LENGTH TO 6 EQUATE PI.ROWS TO 7 EQUATE PI.COLS TO 8 EQUATE PI.ARG.DESC TO 9 EQUATE PI.SUB.DESC TO 10 EQUATE PI.RET.VAL TO 12 EQUATE UV.LANG TO 1 EQUATE UV.EXT TO 2 EQUATE UV.RET.VAL TO 3 EQUATE UV.NO.ARGS TO 4 EQUATE UV.TYPE TO 5 EQUATE UV.DIRECTION TO 6 EQUATE UV.MODULE TO 7 EQUATE UV.SUB.DESC TO 8 EQUATE UV.LENGTH TO 9 EQUATE UV.ROWS TO 10 EQUATE UV.COLS TO 11 EQUATE UV.ARG.DESC TO 12 pi.fvar = '' ;* File variable for PI/open GCI defn. file voc.fvar = '' gci.fvar = '' eof = 0 vocrec.id = 'PIOPEN.GCI' pi.mark.chars = char(26):char(28):char(29):char(30):char(31) verify.mark = char(26) verify.chars = str(verify.mark, len(pi.mark.chars)) * Open GCI file if OS.TYPE = "UNIX" then def.file.name = 'GCI' end else * Windows NT: * You can specify the definition file by putting its name on the * command line, otherwise it defaults to 'GCI' cmd = convert(" ", @fm, trim(@sentence)) def.file.name = cmd<4> if def.file.name = "" then def.file.name = 'GCI' end open def.file.name TO gci.fvar else print 'Failed to open uniVerse file "':def.file.name:'"' stop end prompt "" print "Enter pathname of PI/open definition file: ": input pathname * Create a VOC entry for the PI/open file so that we can access it open "VOC" to voc.fvar else stop "Cannot open voc" vocrec = 'F':@FM:pathname write vocrec to voc.fvar, vocrec.id else stop "Cannot write record to VOC" * Now open the file and do a select on it so we have a list of the record * id's to access open vocrec.id to pi.fvar else stop "Cannot open PI/open definition file" ftype = status() select pi.fvar loop readnext recid then * Check subroutine with same name doesn't already exist read tmp from gci.fvar, recid then print "Subroutine '":recid:"' already exists." continue end read pi.defn from pi.fvar, recid then print "Processing subroutine '":recid:"'" * Check for PI/open mark characters if this is a type 1/19 file if ftype = 1 or ftype = 19 then mark.found = 0 tmp.rec = pi.defn convert pi.mark.chars to verify.chars in tmp.rec mark.found = index(tmp.rec, verify.mark, 1) if mark.found then no.fields = dcount(pi.defn, @FM) tmp.rec = '' for i = 1 to no.fields tmp.rec = iconv(pi.defn, 'ECS') next i pi.defn = tmp.rec end end uv.defn = "" begin case case pi.defn[1,1] = "C" uv.defn = "c" case pi.defn = "F77" uv.defn = "f77" case 1 print "Unsupported language: ":pi.defn stop end case uv.defn = pi.defn uv.defn = downcase(pi.defn) if uv.defn = "" then uv.defn = "void" end * Map PI/open definition data to its corresponding uniVerse values. uv.defn = pi.defn uv.defn = dcount(pi.defn, @VM) for i = 1 to uv.defn dir = uv.defn * Map "IO" to "B" for direction if dir = "IO" then dir = "B" end type = pi.defn * Now convert data types by language begin case case uv.defn = "f77" begin case case type = "INTEGER*2" type = "integer2" case type = "INTEGER*4" type = "integer4" case type = "REAL*4" type = "real4" case type = "REAL*8" type = "real8" case type = "LOGICAL" type = "logical" case type = "CHARACTER" type = "character" case 1 print "Invalid data type found: ":type end case case uv.defn = "c" begin case case type = "CHAR[N]" if dir = "I" then type = "char*" else type = "lchar*" case type = "CHAR*" if dir ne "I" then type = "lchar*" else type = "char*" case type = "CHAR-VAR*" type = "charvar*" case type[1,3] = "INT" pos = index(type, "*", 1) ;* check for input pointer if pos and dir = "I" then dir = "B" type = "int" case type[1,9] = "SHORT-INT" pos = index(type, "*", 1) ;* check for input pointer if pos and dir = "I" then dir = "B" type = "short" case type[1,8] = "LONG-INT" pos = index(type, "*", 1) ;* check for input pointer if pos and dir = "I" then dir = "B" type = "long" case type[1,5] = "FLOAT" pos = index(type, "*", 1) ;* check for input pointer if pos and dir = "I" then dir = "B" type = "float" case type[1,6] = "DOUBLE" pos = index(type, "*", 1) ;* check for input pointer if pos and dir = "I" then dir = "B" type = "double" case 1 print "Invalid data type found: "type end case end case uv.defn = type uv.defn = dir next i uv.defn = pi.defn uv.defn = pi.defn uv.defn = pi.defn uv.defn = pi.defn uv.defn = pi.defn uv.defn = pi.defn uv.recid = "$":recid write uv.defn to gci.fvar, uv.recid else print "Failed to write '":uv.recid:"' to GCI file" end else print "Failed to read record: ":recid end end else eof = 1 until eof repeat close pi.fvar delete voc.fvar, vocrec.id END