12e5b6d6dSopenharmony_ci// Copyright (C) 2016 and later: Unicode, Inc. and others.
22e5b6d6dSopenharmony_ci// License & terms of use: http://www.unicode.org/copyright.html
32e5b6d6dSopenharmony_ci/* Copyright (C) 2011 IBM Corporation and Others. All Rights Reserved */
42e5b6d6dSopenharmony_ci
52e5b6d6dSopenharmony_ci/**
62e5b6d6dSopenharmony_ci   Input:
72e5b6d6dSopenharmony_ci       -o makeconv  makeconv.o ucnvstat.o ../../lib/libicuuc48.so -qOPTION='*DUPPROC *DUPVAR*'
82e5b6d6dSopenharmony_ci
92e5b6d6dSopenharmony_ciCRTPGM PGM(SRLICU/MAKECONV) MODULE(SRLICU/MAKECONV  SRLICU/UCNVSTAT SRLICU/GENMBCS SRLICU/GENCNVEX) BNDSRVPGM(SRLICU/LIBICUUC48 SRLICU/LIBICUTU48 SRLICU/LIBICUIN48) OPTION(*DUPPROC *DUPVAR) REPLACE(*YES)
102e5b6d6dSopenharmony_ci
112e5b6d6dSopenharmony_ciHandles  .o ( modules ), .so ( srvpgm ), .a ( bnddir ).
122e5b6d6dSopenharmony_ci
132e5b6d6dSopenharmony_ciTODO:
142e5b6d6dSopenharmony_ci
152e5b6d6dSopenharmony_ci - cleanup
162e5b6d6dSopenharmony_ci - much better error handling
172e5b6d6dSopenharmony_ci - factor common code
182e5b6d6dSopenharmony_ci - instead of caring about .o vs .so vs .a, just read the link - if it ends in .srvpgm then treat it as a service program, etc.
192e5b6d6dSopenharmony_ci
202e5b6d6dSopenharmony_ci*/
212e5b6d6dSopenharmony_ci
222e5b6d6dSopenharmony_ci#include <stdio.h>
232e5b6d6dSopenharmony_ci#include <stdlib.h>
242e5b6d6dSopenharmony_ci#include <string.h>
252e5b6d6dSopenharmony_ci#include <errno.h>
262e5b6d6dSopenharmony_ci
272e5b6d6dSopenharmony_ci#ifndef TEST_MODE
282e5b6d6dSopenharmony_ci#define TEST_MODE 0
292e5b6d6dSopenharmony_ci#endif
302e5b6d6dSopenharmony_ci
312e5b6d6dSopenharmony_ci
322e5b6d6dSopenharmony_ci#if !TEST_MODE
332e5b6d6dSopenharmony_ci#include <qp0z1170.h>
342e5b6d6dSopenharmony_ci#else
352e5b6d6dSopenharmony_cistatic int Qp0zSystem(const char *cmd) {
362e5b6d6dSopenharmony_ci  printf("CL: %s\n", cmd);
372e5b6d6dSopenharmony_ci  return 0;
382e5b6d6dSopenharmony_ci}
392e5b6d6dSopenharmony_ci#endif
402e5b6d6dSopenharmony_ci
412e5b6d6dSopenharmony_cistatic int runcmd(const char *cmd) {
422e5b6d6dSopenharmony_ci  int rc;
432e5b6d6dSopenharmony_ci  printf("%s\n", cmd);
442e5b6d6dSopenharmony_ci  rc = Qp0zSystem(cmd);
452e5b6d6dSopenharmony_ci  if(rc==0) {
462e5b6d6dSopenharmony_ci    printf("..ok\n");
472e5b6d6dSopenharmony_ci    return 0;
482e5b6d6dSopenharmony_ci  } else if(rc<0){
492e5b6d6dSopenharmony_ci    printf("..Qp0zSystem failed.\n");
502e5b6d6dSopenharmony_ci    return 1;
512e5b6d6dSopenharmony_ci  } else {
522e5b6d6dSopenharmony_ci    printf("..System call failed.\n");
532e5b6d6dSopenharmony_ci    return 1;
542e5b6d6dSopenharmony_ci  }
552e5b6d6dSopenharmony_ci}
562e5b6d6dSopenharmony_ci
572e5b6d6dSopenharmony_ciint main(int argc, const char *argv[]) {
582e5b6d6dSopenharmony_ci  int i;
592e5b6d6dSopenharmony_ci
602e5b6d6dSopenharmony_ci  char buf[8048];
612e5b6d6dSopenharmony_ci  char opt[4100];
622e5b6d6dSopenharmony_ci  char objs[4024];
632e5b6d6dSopenharmony_ci  char libs[4024];
642e5b6d6dSopenharmony_ci  char bnddirs[4024];
652e5b6d6dSopenharmony_ci  const char *prog="";
662e5b6d6dSopenharmony_ci  const char *progshort=prog;
672e5b6d6dSopenharmony_ci  const char *outputdir=getenv("OUTPUTDIR");
682e5b6d6dSopenharmony_ci
692e5b6d6dSopenharmony_ci  printf("# OUTPUTDIR=%s ",outputdir);
702e5b6d6dSopenharmony_ci  for(i=0;i<argc;i++) {
712e5b6d6dSopenharmony_ci    printf("%s ", argv[i]);
722e5b6d6dSopenharmony_ci  }
732e5b6d6dSopenharmony_ci  printf("\n");
742e5b6d6dSopenharmony_ci
752e5b6d6dSopenharmony_ci  buf[0]=0;
762e5b6d6dSopenharmony_ci  opt[0]=0;
772e5b6d6dSopenharmony_ci  objs[0]=0;
782e5b6d6dSopenharmony_ci  libs[0]=0;
792e5b6d6dSopenharmony_ci  bnddirs[0]=0;
802e5b6d6dSopenharmony_ci
812e5b6d6dSopenharmony_ci  for(i=1;i<argc;i++) {
822e5b6d6dSopenharmony_ci    if(argv[i][0]=='-') {
832e5b6d6dSopenharmony_ci      switch(argv[i][1]) {
842e5b6d6dSopenharmony_ci      case 'O':
852e5b6d6dSopenharmony_ci        printf(".. ignoring optimization: %s\n", argv[i]);
862e5b6d6dSopenharmony_ci        break;
872e5b6d6dSopenharmony_ci      case 'g':
882e5b6d6dSopenharmony_ci        printf(".. ignoring debugging: %s\n", argv[i]);
892e5b6d6dSopenharmony_ci        break;
902e5b6d6dSopenharmony_ci      case 'l':
912e5b6d6dSopenharmony_ci        printf(".. ignoring lib: %s\n", argv[i]);
922e5b6d6dSopenharmony_ci        break;
932e5b6d6dSopenharmony_ci      case 'v':
942e5b6d6dSopenharmony_ci        printf(".. already verbose\n");
952e5b6d6dSopenharmony_ci        break;
962e5b6d6dSopenharmony_ci      case 'o':
972e5b6d6dSopenharmony_ci        i++;
982e5b6d6dSopenharmony_ci        prog=argv[i];
992e5b6d6dSopenharmony_ci        progshort=strrchr(prog,'/');
1002e5b6d6dSopenharmony_ci        if(!progshort) {
1012e5b6d6dSopenharmony_ci          progshort=prog;
1022e5b6d6dSopenharmony_ci        } else {
1032e5b6d6dSopenharmony_ci          progshort++; /*  / */
1042e5b6d6dSopenharmony_ci        }
1052e5b6d6dSopenharmony_ci        break;
1062e5b6d6dSopenharmony_ci      case 'q':
1072e5b6d6dSopenharmony_ci        if(!strncmp(argv[i]+2,"OPTION=",7)) {
1082e5b6d6dSopenharmony_ci          strcat(opt,argv[i]+9);
1092e5b6d6dSopenharmony_ci        } else {
1102e5b6d6dSopenharmony_ci          printf("Unknown -q option: %s\n", argv[i]);
1112e5b6d6dSopenharmony_ci          return 1;
1122e5b6d6dSopenharmony_ci        }
1132e5b6d6dSopenharmony_ci        break;
1142e5b6d6dSopenharmony_ci      default:
1152e5b6d6dSopenharmony_ci        printf("Unknown option: %s\n", argv[i]);
1162e5b6d6dSopenharmony_ci        return 1;
1172e5b6d6dSopenharmony_ci      }
1182e5b6d6dSopenharmony_ci    } else {
1192e5b6d6dSopenharmony_ci      int n = strlen(argv[i]);
1202e5b6d6dSopenharmony_ci      if(argv[i][n-1]=='o' &&
1212e5b6d6dSopenharmony_ci         argv[i][n-2]=='.') {
1222e5b6d6dSopenharmony_ci        const char *b = argv[i];
1232e5b6d6dSopenharmony_ci        char linkbuf[200];
1242e5b6d6dSopenharmony_ci        char outbuf[100];
1252e5b6d6dSopenharmony_ci        int nlen = n-2;
1262e5b6d6dSopenharmony_ci
1272e5b6d6dSopenharmony_ci        if(nlen >= 10) {
1282e5b6d6dSopenharmony_ci          nlen = 10;
1292e5b6d6dSopenharmony_ci        }
1302e5b6d6dSopenharmony_ci
1312e5b6d6dSopenharmony_ci        if(readlink(b,linkbuf,200)>0) {
1322e5b6d6dSopenharmony_ci          /* printf("linkbuf %s for %s\n", linkbuf, b); */
1332e5b6d6dSopenharmony_ci          /* /qsys.lib/srlicu.lib/currtest.module */
1342e5b6d6dSopenharmony_ci          char *mend = strrchr(linkbuf,'.');
1352e5b6d6dSopenharmony_ci          if(mend) {
1362e5b6d6dSopenharmony_ci            *mend=0;
1372e5b6d6dSopenharmony_ci            mend = strrchr(linkbuf,'/');
1382e5b6d6dSopenharmony_ci            if(mend) {
1392e5b6d6dSopenharmony_ci              mend++;
1402e5b6d6dSopenharmony_ci              strcpy(outbuf,mend);
1412e5b6d6dSopenharmony_ci              b=outbuf;
1422e5b6d6dSopenharmony_ci              nlen=strlen(b);
1432e5b6d6dSopenharmony_ci            }
1442e5b6d6dSopenharmony_ci          }
1452e5b6d6dSopenharmony_ci        } else {
1462e5b6d6dSopenharmony_ci          /* perror("readlink");
1472e5b6d6dSopenharmony_ci             puts(b); */
1482e5b6d6dSopenharmony_ci        }
1492e5b6d6dSopenharmony_ci
1502e5b6d6dSopenharmony_ci        strcat(objs,outputdir);
1512e5b6d6dSopenharmony_ci        strcat(objs,"/");
1522e5b6d6dSopenharmony_ci        strncat(objs,b,nlen);
1532e5b6d6dSopenharmony_ci        strcat(objs, " ");
1542e5b6d6dSopenharmony_ci      } else if(argv[i][n-1]=='a' &&
1552e5b6d6dSopenharmony_ci         argv[i][n-2]=='.') {
1562e5b6d6dSopenharmony_ci        const char *b = argv[i];
1572e5b6d6dSopenharmony_ci        char linkbuf[200];
1582e5b6d6dSopenharmony_ci        char outbuf[100];
1592e5b6d6dSopenharmony_ci        int nlen = n-2;
1602e5b6d6dSopenharmony_ci
1612e5b6d6dSopenharmony_ci        if(nlen >= 10) {
1622e5b6d6dSopenharmony_ci          nlen = 10;
1632e5b6d6dSopenharmony_ci        }
1642e5b6d6dSopenharmony_ci
1652e5b6d6dSopenharmony_ci        if(readlink(b,linkbuf,200)>0) {
1662e5b6d6dSopenharmony_ci          /* printf("linkbuf %s for %s\n", linkbuf, b); */
1672e5b6d6dSopenharmony_ci          /* /qsys.lib/srlicu.lib/currtest.srvpgm */
1682e5b6d6dSopenharmony_ci          char *mend = strrchr(linkbuf,'.');
1692e5b6d6dSopenharmony_ci          if(mend) {
1702e5b6d6dSopenharmony_ci            *mend=0;
1712e5b6d6dSopenharmony_ci            mend = strrchr(linkbuf,'/');
1722e5b6d6dSopenharmony_ci            if(mend) {
1732e5b6d6dSopenharmony_ci              mend++;
1742e5b6d6dSopenharmony_ci              strcpy(outbuf,mend);
1752e5b6d6dSopenharmony_ci              b=outbuf;
1762e5b6d6dSopenharmony_ci              nlen=strlen(b);
1772e5b6d6dSopenharmony_ci            }
1782e5b6d6dSopenharmony_ci          }
1792e5b6d6dSopenharmony_ci        } else {
1802e5b6d6dSopenharmony_ci          /* perror("readlink");
1812e5b6d6dSopenharmony_ci             puts(b); */
1822e5b6d6dSopenharmony_ci        }
1832e5b6d6dSopenharmony_ci
1842e5b6d6dSopenharmony_ci        strcat(bnddirs,outputdir);
1852e5b6d6dSopenharmony_ci        strcat(bnddirs,"/");
1862e5b6d6dSopenharmony_ci        strncat(bnddirs,b,nlen);
1872e5b6d6dSopenharmony_ci        strcat(bnddirs, " ");
1882e5b6d6dSopenharmony_ci      } else if(argv[i][n-1]=='o' &&
1892e5b6d6dSopenharmony_ci         argv[i][n-2]=='s' &&
1902e5b6d6dSopenharmony_ci         argv[i][n-3]=='.') {
1912e5b6d6dSopenharmony_ci        const char *p = strrchr(argv[i],'/');
1922e5b6d6dSopenharmony_ci        if(!p) {
1932e5b6d6dSopenharmony_ci          printf("Can't find trailing slash in %s\n", argv[i]);
1942e5b6d6dSopenharmony_ci          return 1;
1952e5b6d6dSopenharmony_ci        }
1962e5b6d6dSopenharmony_ci        strcat(libs,outputdir);
1972e5b6d6dSopenharmony_ci        strcat(libs,"/");
1982e5b6d6dSopenharmony_ci        strncat(libs,p+1,strlen(p)-4);
1992e5b6d6dSopenharmony_ci        strcat(libs," ");
2002e5b6d6dSopenharmony_ci      } else {
2012e5b6d6dSopenharmony_ci        printf("Unknown input file: %s\n", argv[i]);
2022e5b6d6dSopenharmony_ci        return 1;
2032e5b6d6dSopenharmony_ci      }
2042e5b6d6dSopenharmony_ci    }
2052e5b6d6dSopenharmony_ci  }
2062e5b6d6dSopenharmony_ci
2072e5b6d6dSopenharmony_ci  if(prog[0]==0) {
2082e5b6d6dSopenharmony_ci    printf("no program (-o) option specified.\n");
2092e5b6d6dSopenharmony_ci    return 1;
2102e5b6d6dSopenharmony_ci  }
2112e5b6d6dSopenharmony_ci
2122e5b6d6dSopenharmony_ci  sprintf(buf,"CRTPGM PGM(%s/%s) MODULE(%s) BNDSRVPGM(%s) BNDDIR(%s) OPTION(%s) REPLACE(*YES)",
2132e5b6d6dSopenharmony_ci          outputdir,progshort,
2142e5b6d6dSopenharmony_ci
2152e5b6d6dSopenharmony_ci          objs,
2162e5b6d6dSopenharmony_ci
2172e5b6d6dSopenharmony_ci          libs,
2182e5b6d6dSopenharmony_ci
2192e5b6d6dSopenharmony_ci          bnddirs,
2202e5b6d6dSopenharmony_ci
2212e5b6d6dSopenharmony_ci          opt);
2222e5b6d6dSopenharmony_ci
2232e5b6d6dSopenharmony_ci
2242e5b6d6dSopenharmony_ci  if(runcmd(buf)) {
2252e5b6d6dSopenharmony_ci    return 1;
2262e5b6d6dSopenharmony_ci  }
2272e5b6d6dSopenharmony_ci
2282e5b6d6dSopenharmony_ci  /* -- OK */
2292e5b6d6dSopenharmony_ci  {
2302e5b6d6dSopenharmony_ci    char path1[1000];
2312e5b6d6dSopenharmony_ci    sprintf(path1,"/qsys.lib/%s.lib/%s.pgm",
2322e5b6d6dSopenharmony_ci            outputdir,
2332e5b6d6dSopenharmony_ci            progshort);
2342e5b6d6dSopenharmony_ci    printf("# ln -s %s %s\n", path1, prog);
2352e5b6d6dSopenharmony_ci    if((!TEST_MODE) && symlink(path1,prog)) {
2362e5b6d6dSopenharmony_ci      perror("symlink");
2372e5b6d6dSopenharmony_ci      if(errno!=EEXIST) { /* ignored */
2382e5b6d6dSopenharmony_ci        return 1;
2392e5b6d6dSopenharmony_ci      }
2402e5b6d6dSopenharmony_ci    }
2412e5b6d6dSopenharmony_ci  }
2422e5b6d6dSopenharmony_ci  return 0;
2432e5b6d6dSopenharmony_ci}
2442e5b6d6dSopenharmony_ci
2452e5b6d6dSopenharmony_ci
2462e5b6d6dSopenharmony_ci
2472e5b6d6dSopenharmony_ci
2482e5b6d6dSopenharmony_ci
2492e5b6d6dSopenharmony_ci
2502e5b6d6dSopenharmony_ci
2512e5b6d6dSopenharmony_ci
252