home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / xwplascr.zip / XWPL0208.ZIP / tools / xbin2obj.cmd < prev   
OS/2 REXX Batch file  |  2000-06-17  |  9KB  |  311 lines

  1. /*
  2.  *      XBIN2OBJ.CMD - V1.0 C.Langanke 1997,1999 - bugfree clone of Peter Kobaks BIN2OBJ
  3.  *
  4.  *    Usage: XBIN2OBJ [options] binfile symbolname [objfile]
  5.  *
  6.  *       binfile    = name of the existing binary file.
  7.  *       symbolname = symbolic name used in the object file.
  8.  *       objfile    = name of the new object file; if not present.
  9.  *                      the object file name will be same as the
  10.  *                      binfile with an .obj extenstion.
  11.  *       options    = any of the following:
  12.  *         -n       = size of the binfile, as 32-bit value, will be put in front
  13.  *                      of the binary block so it's size can be queried.
  14.  *         -sName   = name of the segment; by default it is 'DATA32'.
  15.  *         -cClass  = class of the segment; by default it is 'DATA'.
  16.  *                      The recommended classes are 'DATA', 'CONST', or 'CODE'.
  17.  *
  18.  */
  19. /* first comment is used as help text */
  20.  
  21.  SIGNAL ON HALT
  22.  
  23.  TitleLine = STRIP(SUBSTR(SourceLine(2), 3));
  24.  PARSE VAR TitleLine CmdName'.CMD 'Info
  25.  Title     = CmdName Info
  26.  
  27.  env          = 'OS2ENVIRONMENT';
  28.  TRUE         = (1 = 1);
  29.  FALSE        = (0 = 1);
  30.  Redirection  = '> NUL 2>&1';
  31.  '@ECHO OFF'
  32.  
  33.  /* OS/2 errorcodes */
  34.  ERROR.NO_ERROR           =  0;
  35.  ERROR.INVALID_FUNCTION   =  1;
  36.  ERROR.FILE_NOT_FOUND     =  2;
  37.  ERROR.PATH_NOT_FOUND     =  3;
  38.  ERROR.ACCESS_DENIED      =  5;
  39.  ERROR.NOT_ENOUGH_MEMORY  =  8;
  40.  ERROR.INVALID_FORMAT     = 11;
  41.  ERROR.INVALID_DATA       = 13;
  42.  ERROR.NO_MORE_FILES      = 18;
  43.  ERROR.WRITE_FAULT        = 29;
  44.  ERROR.READ_FAULT         = 30;
  45.  ERROR.GEN_FAILURE        = 31;
  46.  ERROR.INVALID_PARAMETER  = 87;
  47.  
  48.  GlobalVars = 'Title CmdName env TRUE FALSE Redirection ERROR.';
  49.  SAY;
  50.  
  51.  /* show help */
  52.  ARG Parm .
  53.  IF ((Parm = '') | (POS('?', Parm) > 0)) THEN
  54.  DO
  55.     rc = ShowHelp();
  56.     EXIT(ERROR.INVALID_PARAMETER);
  57.  END;
  58.  
  59.  /* Defaults */
  60.  GlobalVars = GlobalVars 'Seg.';
  61.  Seg.ClassName   = 'DATA';
  62.  Seg.SegmentName = 'DATA32';
  63.  Seg.TypeName    = 'FLAT';
  64.  Seg.WriteSize   = FALSE;
  65.  BinFile         = '';
  66.  SymbolName      = '';
  67.  ObjFile         = '';
  68.  
  69.  /* get parms */
  70.  
  71.  PARSE ARG Parms
  72.  DO i = 1 TO WORDS( Parms)
  73.     ThisParm = WORD( Parms, i);
  74.     PARSE VAR ThisParm ThisTag +2 ThisValue;
  75.     ThisTag   = TRANSLATE( ThisTag);
  76.     SELECT
  77.        WHEN (ThisTag = '-N') THEN Seg.WriteSize   = TRUE;
  78.        WHEN (ThisTag = '-S') THEN Seg.SegmentName = ThisValue;
  79.        WHEN (ThisTag = '-C') THEN Seg.ClassName   = ThisValue;
  80.        OTHERWISE
  81.        DO
  82.           /**/ IF (BinFile = '') THEN
  83.              BinFile = ThisParm;
  84.           ELSE IF (SymbolName = '') THEN
  85.              SymbolName = ThisParm;
  86.           ELSE IF (ObjFile = '') THEN
  87.              ObjFile = ThisParm;
  88.           ELSE
  89.           DO
  90.              SAY CmdName': error: Invalid parameter «'ThisParm'» specified.';
  91.              EXIT( ERROR.INVALID_PARAMETER);
  92.           END;
  93.        END;
  94.     END;
  95.  END;
  96.  
  97.  IF (SymbolName = '') THEN
  98.  DO
  99.     rc = ShowHelp();
  100.     EXIT(ERROR.INVALID_PARAMETER);
  101.  END;
  102.  
  103.  /* determine object file name */
  104.  IF (ObjFile = '') THEN
  105.  DO
  106.     ObjFile = FILESPEC('N', BinFile);
  107.     ExtPos = LASTPOS( '.', ObjFile);
  108.     IF (ExtPos \= 0) THEN
  109.        ObjFile = LEFT( BinFile, ExtPos - 1);
  110.     ELSE
  111.        ObjFile = BinFile;
  112.     ObjFile = ObjFile'.obj';
  113.  END;
  114.  
  115.  /* check source file */
  116.  IF (\FileExist( BinFile)) THEN
  117.  DO
  118.     SAY CmdName': Error: File «'BinFile'» not found.';
  119.     EXIT( ERROR.FILE_NO_FOUND);
  120.  END;
  121.  
  122.  /* delete target file */
  123.  'IF EXIST' ObjFile 'DEL' ObjFile Redirection;
  124.  IF (FileExist( ObjFile)) THEN
  125.  DO
  126.     SAY CmdName': Error: File «'ObjFile'» cannot be written.';
  127.     EXIT( ERROR.WRITE_FAULT);
  128.  END;
  129.  
  130.  /* generate object code */
  131.  rc = GenerateObj( BinFile, SymbolName, ObjFile);
  132.  
  133.  
  134.  EXIT(ERROR.NO_ERROR);
  135.  
  136. /* ------------------------------------------------------------------------- */
  137. HALT:
  138.  SAY 'Interrupted by User.';
  139.  EXIT(ERROR.GEN_FAILURE);
  140.  
  141. /* ------------------------------------------------------------------------- */
  142. ShowHelp: PROCEDURE EXPOSE (GlobalVars)
  143.  
  144.  SAY Title;
  145.  SAY;
  146.  
  147.  PARSE SOURCE . . ThisFile
  148.  
  149.  DO i = 1 TO 3
  150.     rc = LINEIN(ThisFile);
  151.  END;
  152.  
  153.  ThisLine = LINEIN(Thisfile);
  154.  DO WHILE (ThisLine \= ' */')
  155.     SAY SUBSTR(ThisLine, 7);
  156.     ThisLine = LINEIN(Thisfile);
  157.  END;
  158.  
  159.  /* Datei wieder schließen */
  160.  rc = LINEOUT(Thisfile);
  161.  
  162.  RETURN('');
  163.  
  164. /* ------------------------------------------------------------------------- */
  165. FileExist: PROCEDURE
  166.  PARSE ARG FileName
  167.  
  168.  RETURN(STREAM(Filename, 'C', 'QUERY EXISTS') > '');
  169.  
  170. /* ========================================================================= */
  171. GenerateObj: PROCEDURE EXPOSE (GlobalVars)
  172.  PARSE ARG BinFile, SymbolName, ObjFile;
  173.  
  174.  rc = ERROR.NO_ERROR;
  175.  SegmentAttr = X2D(69);
  176.  DataOffset = 0;
  177.  
  178.  /* determine module name */
  179.  ModuleName = FILESPEC( 'N', BinFile);
  180.  
  181.  /* query filesize of file */
  182.  BinSize = STREAM( BinFile, 'C', 'QUERY SIZE');
  183.  
  184.  /* determine seg size */
  185.  SegSize = BinSize;
  186.  IF (Seg.WriteSize) THEN
  187.     SegSize = SegSize + 4;
  188.  
  189.  /* write Translator Header */
  190.  StringLen = LENGTH( ModuleName);
  191.  HeaderLen = StringLen + 2;
  192.  rc = CHAROUT( ObjFile, D2C(X2D(80)));
  193.  rc = CHAROUT( ObjFile, REVERSE(D2C(HeaderLen, 2)));
  194.  
  195.  rc = CHAROUT( ObjFile, D2C(StringLen));
  196.  rc = CHAROUT( ObjFile, ModuleName);
  197.  
  198.  rc = CHAROUT( ObjFile, D2C(0));
  199.  
  200.  /* write Name list */
  201.  StringLen = LENGTH( Seg.SegmentName''Seg.ClassName''Seg.TypeName);
  202.  HeaderLen = StringLen + 4;
  203.  rc = CHAROUT( ObjFile, D2C(X2D(96)));
  204.  rc = CHAROUT( ObjFile, REVERSE(D2C(HeaderLen, 2)));
  205.  
  206.  rc = CHAROUT( ObjFile, D2C(LENGTH(Seg.SegmentName)));
  207.  rc = CHAROUT( ObjFile, Seg.SegmentName);
  208.  
  209.  rc = CHAROUT( ObjFile, D2C(LENGTH(Seg.ClassName)));
  210.  rc = CHAROUT( ObjFile, Seg.ClassName);
  211.  
  212.  rc = CHAROUT( ObjFile, D2C(LENGTH(Seg.TypeName)));
  213.  rc = CHAROUT( ObjFile, Seg.TypeName);
  214.  
  215.  rc = CHAROUT( ObjFile, D2C(0));
  216.  
  217.  /* write segment definition */
  218.  HeaderLen = 9;
  219.  rc = CHAROUT( ObjFile, D2C(X2D(99)));
  220.  rc = CHAROUT( ObjFile, REVERSE(D2C(HeaderLen, 2)));
  221.  
  222.  rc = CHAROUT( ObjFile, D2C(SegmentAttr));
  223.  
  224.  rc = CHAROUT( ObjFile, REVERSE(D2C(SegSize, 2))); /* size of all data */
  225.  
  226.  rc = CHAROUT( ObjFile, REVERSE(D2C(0, 2)));    /* DW: Segm Name Index    */
  227.  rc = CHAROUT( ObjFile, D2C(1));                /* DB: Class Name Index   */
  228.  rc = CHAROUT( ObjFile, REVERSE(D2C(2, 2)));    /* DW: Overlay name index */
  229.  
  230.  rc = CHAROUT( ObjFile, D2C(0));
  231.  
  232.  /* write group name definition */
  233.  HeaderLen = 2;
  234.  rc = CHAROUT( ObjFile, D2C(X2D(9A)));
  235.  rc = CHAROUT( ObjFile, REVERSE(D2C(HeaderLen, 2)));
  236.  
  237.  rc = CHAROUT( ObjFile, D2C(3));       /* DB: group name index */
  238.  
  239.  rc = CHAROUT( ObjFile, D2C(0));
  240.  
  241.  /* write Public Names Definition */
  242.  HeaderLen = LENGTH(SymbolName) + 9;
  243.  rc = CHAROUT( ObjFile, D2C(X2D(91)));
  244.  rc = CHAROUT( ObjFile, REVERSE(D2C(HeaderLen, 2)));
  245.  
  246.  rc = CHAROUT( ObjFile, D2C(0));       /* DB: base group index */
  247.  rc = CHAROUT( ObjFile, D2C(1));       /* DB: base segment index */
  248.  
  249.  rc = CHAROUT( ObjFile, D2C(LENGTH(SymbolName)));
  250.  rc = CHAROUT( ObjFile, SymbolName);
  251.  
  252.  rc = CHAROUT( ObjFile, REVERSE(D2C(0, 4))); /* data offset */
  253.  rc = CHAROUT( ObjFile, D2C(0));             /* type index */
  254.  
  255.  rc = CHAROUT( ObjFile, D2C(0));
  256.  
  257.  /* write comment */
  258.  HeaderLen = 4;
  259.  rc = CHAROUT( ObjFile, D2C(X2D(88)));
  260.  rc = CHAROUT( ObjFile, REVERSE(D2C(HeaderLen, 2)));
  261.  
  262.  rc = CHAROUT( ObjFile, D2C(X2D(40)));
  263.  rc = CHAROUT( ObjFile, D2C(X2D(A2)));
  264.  rc = CHAROUT( ObjFile, D2C(1));
  265.  
  266.  rc = CHAROUT( ObjFile, D2C(0));
  267.  
  268.  IF (Seg.WriteSize) THEN
  269.  DO
  270.     /* write data item: size file */
  271.     DataSize   = 4;
  272.     HeaderLen  = DataSize + 6;
  273.     rc = CHAROUT( ObjFile, D2C(X2D(A1)));
  274.     rc = CHAROUT( ObjFile, REVERSE(D2C(HeaderLen, 2)));
  275.     rc = CHAROUT( ObjFile, D2C(1));                      /* segment index */
  276.     rc = CHAROUT( ObjFile, REVERSE(D2C(DataOffset, 4))); /* data offset */
  277.     rc = CHAROUT( ObjFile, REVERSE(D2C(BinSize, 4)));    /* this is the data */
  278.     rc = CHAROUT( ObjFile, D2C(0));
  279.     DataOffset = DataOffset + DataSize;
  280.  END;
  281.  
  282.  /* make data records for each 1024 bytes ! */
  283.  DataToWrite = BinSize;
  284.  DO WHILE (DataToWrite  \= 0)
  285.     /* write data item */
  286.     DataSize   = MIN( 1024, DataToWrite);
  287.     Data = CHARIN(BinFile,, DataSize);
  288.     HeaderLen  = DataSize + 6;
  289.     rc = CHAROUT( ObjFile, D2C(X2D(A1)));
  290.     rc = CHAROUT( ObjFile, REVERSE(D2C(HeaderLen, 2)));
  291.     rc = CHAROUT( ObjFile, D2C(1));                      /* segment index */
  292.     rc = CHAROUT( ObjFile, REVERSE(D2C(DataOffset, 4))); /* data offset */
  293.     rc = CHAROUT( ObjFile, data);
  294.     rc = CHAROUT( ObjFile, D2C(0));
  295.     DataOffset  = DataOffset + DataSize;
  296.     DataToWrite = DataToWrite - DataSize;
  297.  END;
  298.  
  299.  /* write end-of-module */
  300.  HeaderLen  = 2
  301.  rc = CHAROUT( ObjFile, D2C(X2D(8B)));
  302.  rc = CHAROUT( ObjFile, REVERSE(D2C(HeaderLen, 2)));
  303.  rc = CHAROUT( ObjFile, D2C(1));
  304.  rc = CHAROUT( ObjFile, D2C(0));
  305.  
  306.  /* close file */
  307.  rc = STREAM( BinFile, 'C', 'CLOSE');
  308.  rc = LINEOUT( ObjFile);
  309.  
  310.  RETURN rc;
  311.