xref: /aosp_15_r20/external/icu/icu4c/as_is/os400/iculd.c (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
1*0e209d39SAndroid Build Coastguard Worker // Copyright (C) 2016 and later: Unicode, Inc. and others.
2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html
3*0e209d39SAndroid Build Coastguard Worker /* Copyright (C) 2011 IBM Corporation and Others. All Rights Reserved */
4*0e209d39SAndroid Build Coastguard Worker 
5*0e209d39SAndroid Build Coastguard Worker /**
6*0e209d39SAndroid Build Coastguard Worker    Input:
7*0e209d39SAndroid Build Coastguard Worker        -o makeconv  makeconv.o ucnvstat.o ../../lib/libicuuc48.so -qOPTION='*DUPPROC *DUPVAR*'
8*0e209d39SAndroid Build Coastguard Worker 
9*0e209d39SAndroid Build Coastguard Worker CRTPGM PGM(SRLICU/MAKECONV) MODULE(SRLICU/MAKECONV  SRLICU/UCNVSTAT SRLICU/GENMBCS SRLICU/GENCNVEX) BNDSRVPGM(SRLICU/LIBICUUC48 SRLICU/LIBICUTU48 SRLICU/LIBICUIN48) OPTION(*DUPPROC *DUPVAR) REPLACE(*YES)
10*0e209d39SAndroid Build Coastguard Worker 
11*0e209d39SAndroid Build Coastguard Worker Handles  .o ( modules ), .so ( srvpgm ), .a ( bnddir ).
12*0e209d39SAndroid Build Coastguard Worker 
13*0e209d39SAndroid Build Coastguard Worker TODO:
14*0e209d39SAndroid Build Coastguard Worker 
15*0e209d39SAndroid Build Coastguard Worker  - cleanup
16*0e209d39SAndroid Build Coastguard Worker  - much better error handling
17*0e209d39SAndroid Build Coastguard Worker  - factor common code
18*0e209d39SAndroid Build Coastguard Worker  - 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.
19*0e209d39SAndroid Build Coastguard Worker 
20*0e209d39SAndroid Build Coastguard Worker */
21*0e209d39SAndroid Build Coastguard Worker 
22*0e209d39SAndroid Build Coastguard Worker #include <stdio.h>
23*0e209d39SAndroid Build Coastguard Worker #include <stdlib.h>
24*0e209d39SAndroid Build Coastguard Worker #include <string.h>
25*0e209d39SAndroid Build Coastguard Worker #include <errno.h>
26*0e209d39SAndroid Build Coastguard Worker 
27*0e209d39SAndroid Build Coastguard Worker #ifndef TEST_MODE
28*0e209d39SAndroid Build Coastguard Worker #define TEST_MODE 0
29*0e209d39SAndroid Build Coastguard Worker #endif
30*0e209d39SAndroid Build Coastguard Worker 
31*0e209d39SAndroid Build Coastguard Worker 
32*0e209d39SAndroid Build Coastguard Worker #if !TEST_MODE
33*0e209d39SAndroid Build Coastguard Worker #include <qp0z1170.h>
34*0e209d39SAndroid Build Coastguard Worker #else
Qp0zSystem(const char * cmd)35*0e209d39SAndroid Build Coastguard Worker static int Qp0zSystem(const char *cmd) {
36*0e209d39SAndroid Build Coastguard Worker   printf("CL: %s\n", cmd);
37*0e209d39SAndroid Build Coastguard Worker   return 0;
38*0e209d39SAndroid Build Coastguard Worker }
39*0e209d39SAndroid Build Coastguard Worker #endif
40*0e209d39SAndroid Build Coastguard Worker 
runcmd(const char * cmd)41*0e209d39SAndroid Build Coastguard Worker static int runcmd(const char *cmd) {
42*0e209d39SAndroid Build Coastguard Worker   int rc;
43*0e209d39SAndroid Build Coastguard Worker   printf("%s\n", cmd);
44*0e209d39SAndroid Build Coastguard Worker   rc = Qp0zSystem(cmd);
45*0e209d39SAndroid Build Coastguard Worker   if(rc==0) {
46*0e209d39SAndroid Build Coastguard Worker     printf("..ok\n");
47*0e209d39SAndroid Build Coastguard Worker     return 0;
48*0e209d39SAndroid Build Coastguard Worker   } else if(rc<0){
49*0e209d39SAndroid Build Coastguard Worker     printf("..Qp0zSystem failed.\n");
50*0e209d39SAndroid Build Coastguard Worker     return 1;
51*0e209d39SAndroid Build Coastguard Worker   } else {
52*0e209d39SAndroid Build Coastguard Worker     printf("..System call failed.\n");
53*0e209d39SAndroid Build Coastguard Worker     return 1;
54*0e209d39SAndroid Build Coastguard Worker   }
55*0e209d39SAndroid Build Coastguard Worker }
56*0e209d39SAndroid Build Coastguard Worker 
main(int argc,const char * argv[])57*0e209d39SAndroid Build Coastguard Worker int main(int argc, const char *argv[]) {
58*0e209d39SAndroid Build Coastguard Worker   int i;
59*0e209d39SAndroid Build Coastguard Worker 
60*0e209d39SAndroid Build Coastguard Worker   char buf[8048];
61*0e209d39SAndroid Build Coastguard Worker   char opt[4100];
62*0e209d39SAndroid Build Coastguard Worker   char objs[4024];
63*0e209d39SAndroid Build Coastguard Worker   char libs[4024];
64*0e209d39SAndroid Build Coastguard Worker   char bnddirs[4024];
65*0e209d39SAndroid Build Coastguard Worker   const char *prog="";
66*0e209d39SAndroid Build Coastguard Worker   const char *progshort=prog;
67*0e209d39SAndroid Build Coastguard Worker   const char *outputdir=getenv("OUTPUTDIR");
68*0e209d39SAndroid Build Coastguard Worker 
69*0e209d39SAndroid Build Coastguard Worker   printf("# OUTPUTDIR=%s ",outputdir);
70*0e209d39SAndroid Build Coastguard Worker   for(i=0;i<argc;i++) {
71*0e209d39SAndroid Build Coastguard Worker     printf("%s ", argv[i]);
72*0e209d39SAndroid Build Coastguard Worker   }
73*0e209d39SAndroid Build Coastguard Worker   printf("\n");
74*0e209d39SAndroid Build Coastguard Worker 
75*0e209d39SAndroid Build Coastguard Worker   buf[0]=0;
76*0e209d39SAndroid Build Coastguard Worker   opt[0]=0;
77*0e209d39SAndroid Build Coastguard Worker   objs[0]=0;
78*0e209d39SAndroid Build Coastguard Worker   libs[0]=0;
79*0e209d39SAndroid Build Coastguard Worker   bnddirs[0]=0;
80*0e209d39SAndroid Build Coastguard Worker 
81*0e209d39SAndroid Build Coastguard Worker   for(i=1;i<argc;i++) {
82*0e209d39SAndroid Build Coastguard Worker     if(argv[i][0]=='-') {
83*0e209d39SAndroid Build Coastguard Worker       switch(argv[i][1]) {
84*0e209d39SAndroid Build Coastguard Worker       case 'O':
85*0e209d39SAndroid Build Coastguard Worker         printf(".. ignoring optimization: %s\n", argv[i]);
86*0e209d39SAndroid Build Coastguard Worker         break;
87*0e209d39SAndroid Build Coastguard Worker       case 'g':
88*0e209d39SAndroid Build Coastguard Worker         printf(".. ignoring debugging: %s\n", argv[i]);
89*0e209d39SAndroid Build Coastguard Worker         break;
90*0e209d39SAndroid Build Coastguard Worker       case 'l':
91*0e209d39SAndroid Build Coastguard Worker         printf(".. ignoring lib: %s\n", argv[i]);
92*0e209d39SAndroid Build Coastguard Worker         break;
93*0e209d39SAndroid Build Coastguard Worker       case 'v':
94*0e209d39SAndroid Build Coastguard Worker         printf(".. already verbose\n");
95*0e209d39SAndroid Build Coastguard Worker         break;
96*0e209d39SAndroid Build Coastguard Worker       case 'o':
97*0e209d39SAndroid Build Coastguard Worker         i++;
98*0e209d39SAndroid Build Coastguard Worker         prog=argv[i];
99*0e209d39SAndroid Build Coastguard Worker         progshort=strrchr(prog,'/');
100*0e209d39SAndroid Build Coastguard Worker         if(!progshort) {
101*0e209d39SAndroid Build Coastguard Worker           progshort=prog;
102*0e209d39SAndroid Build Coastguard Worker         } else {
103*0e209d39SAndroid Build Coastguard Worker           progshort++; /*  / */
104*0e209d39SAndroid Build Coastguard Worker         }
105*0e209d39SAndroid Build Coastguard Worker         break;
106*0e209d39SAndroid Build Coastguard Worker       case 'q':
107*0e209d39SAndroid Build Coastguard Worker         if(!strncmp(argv[i]+2,"OPTION=",7)) {
108*0e209d39SAndroid Build Coastguard Worker           strcat(opt,argv[i]+9);
109*0e209d39SAndroid Build Coastguard Worker         } else {
110*0e209d39SAndroid Build Coastguard Worker           printf("Unknown -q option: %s\n", argv[i]);
111*0e209d39SAndroid Build Coastguard Worker           return 1;
112*0e209d39SAndroid Build Coastguard Worker         }
113*0e209d39SAndroid Build Coastguard Worker         break;
114*0e209d39SAndroid Build Coastguard Worker       default:
115*0e209d39SAndroid Build Coastguard Worker         printf("Unknown option: %s\n", argv[i]);
116*0e209d39SAndroid Build Coastguard Worker         return 1;
117*0e209d39SAndroid Build Coastguard Worker       }
118*0e209d39SAndroid Build Coastguard Worker     } else {
119*0e209d39SAndroid Build Coastguard Worker       int n = strlen(argv[i]);
120*0e209d39SAndroid Build Coastguard Worker       if(argv[i][n-1]=='o' &&
121*0e209d39SAndroid Build Coastguard Worker          argv[i][n-2]=='.') {
122*0e209d39SAndroid Build Coastguard Worker         const char *b = argv[i];
123*0e209d39SAndroid Build Coastguard Worker         char linkbuf[200];
124*0e209d39SAndroid Build Coastguard Worker         char outbuf[100];
125*0e209d39SAndroid Build Coastguard Worker         int nlen = n-2;
126*0e209d39SAndroid Build Coastguard Worker 
127*0e209d39SAndroid Build Coastguard Worker         if(nlen >= 10) {
128*0e209d39SAndroid Build Coastguard Worker           nlen = 10;
129*0e209d39SAndroid Build Coastguard Worker         }
130*0e209d39SAndroid Build Coastguard Worker 
131*0e209d39SAndroid Build Coastguard Worker         if(readlink(b,linkbuf,200)>0) {
132*0e209d39SAndroid Build Coastguard Worker           /* printf("linkbuf %s for %s\n", linkbuf, b); */
133*0e209d39SAndroid Build Coastguard Worker           /* /qsys.lib/srlicu.lib/currtest.module */
134*0e209d39SAndroid Build Coastguard Worker           char *mend = strrchr(linkbuf,'.');
135*0e209d39SAndroid Build Coastguard Worker           if(mend) {
136*0e209d39SAndroid Build Coastguard Worker             *mend=0;
137*0e209d39SAndroid Build Coastguard Worker             mend = strrchr(linkbuf,'/');
138*0e209d39SAndroid Build Coastguard Worker             if(mend) {
139*0e209d39SAndroid Build Coastguard Worker               mend++;
140*0e209d39SAndroid Build Coastguard Worker               strcpy(outbuf,mend);
141*0e209d39SAndroid Build Coastguard Worker               b=outbuf;
142*0e209d39SAndroid Build Coastguard Worker               nlen=strlen(b);
143*0e209d39SAndroid Build Coastguard Worker             }
144*0e209d39SAndroid Build Coastguard Worker           }
145*0e209d39SAndroid Build Coastguard Worker         } else {
146*0e209d39SAndroid Build Coastguard Worker           /* perror("readlink");
147*0e209d39SAndroid Build Coastguard Worker              puts(b); */
148*0e209d39SAndroid Build Coastguard Worker         }
149*0e209d39SAndroid Build Coastguard Worker 
150*0e209d39SAndroid Build Coastguard Worker         strcat(objs,outputdir);
151*0e209d39SAndroid Build Coastguard Worker         strcat(objs,"/");
152*0e209d39SAndroid Build Coastguard Worker         strncat(objs,b,nlen);
153*0e209d39SAndroid Build Coastguard Worker         strcat(objs, " ");
154*0e209d39SAndroid Build Coastguard Worker       } else if(argv[i][n-1]=='a' &&
155*0e209d39SAndroid Build Coastguard Worker          argv[i][n-2]=='.') {
156*0e209d39SAndroid Build Coastguard Worker         const char *b = argv[i];
157*0e209d39SAndroid Build Coastguard Worker         char linkbuf[200];
158*0e209d39SAndroid Build Coastguard Worker         char outbuf[100];
159*0e209d39SAndroid Build Coastguard Worker         int nlen = n-2;
160*0e209d39SAndroid Build Coastguard Worker 
161*0e209d39SAndroid Build Coastguard Worker         if(nlen >= 10) {
162*0e209d39SAndroid Build Coastguard Worker           nlen = 10;
163*0e209d39SAndroid Build Coastguard Worker         }
164*0e209d39SAndroid Build Coastguard Worker 
165*0e209d39SAndroid Build Coastguard Worker         if(readlink(b,linkbuf,200)>0) {
166*0e209d39SAndroid Build Coastguard Worker           /* printf("linkbuf %s for %s\n", linkbuf, b); */
167*0e209d39SAndroid Build Coastguard Worker           /* /qsys.lib/srlicu.lib/currtest.srvpgm */
168*0e209d39SAndroid Build Coastguard Worker           char *mend = strrchr(linkbuf,'.');
169*0e209d39SAndroid Build Coastguard Worker           if(mend) {
170*0e209d39SAndroid Build Coastguard Worker             *mend=0;
171*0e209d39SAndroid Build Coastguard Worker             mend = strrchr(linkbuf,'/');
172*0e209d39SAndroid Build Coastguard Worker             if(mend) {
173*0e209d39SAndroid Build Coastguard Worker               mend++;
174*0e209d39SAndroid Build Coastguard Worker               strcpy(outbuf,mend);
175*0e209d39SAndroid Build Coastguard Worker               b=outbuf;
176*0e209d39SAndroid Build Coastguard Worker               nlen=strlen(b);
177*0e209d39SAndroid Build Coastguard Worker             }
178*0e209d39SAndroid Build Coastguard Worker           }
179*0e209d39SAndroid Build Coastguard Worker         } else {
180*0e209d39SAndroid Build Coastguard Worker           /* perror("readlink");
181*0e209d39SAndroid Build Coastguard Worker              puts(b); */
182*0e209d39SAndroid Build Coastguard Worker         }
183*0e209d39SAndroid Build Coastguard Worker 
184*0e209d39SAndroid Build Coastguard Worker         strcat(bnddirs,outputdir);
185*0e209d39SAndroid Build Coastguard Worker         strcat(bnddirs,"/");
186*0e209d39SAndroid Build Coastguard Worker         strncat(bnddirs,b,nlen);
187*0e209d39SAndroid Build Coastguard Worker         strcat(bnddirs, " ");
188*0e209d39SAndroid Build Coastguard Worker       } else if(argv[i][n-1]=='o' &&
189*0e209d39SAndroid Build Coastguard Worker          argv[i][n-2]=='s' &&
190*0e209d39SAndroid Build Coastguard Worker          argv[i][n-3]=='.') {
191*0e209d39SAndroid Build Coastguard Worker         const char *p = strrchr(argv[i],'/');
192*0e209d39SAndroid Build Coastguard Worker         if(!p) {
193*0e209d39SAndroid Build Coastguard Worker           printf("Can't find trailing slash in %s\n", argv[i]);
194*0e209d39SAndroid Build Coastguard Worker           return 1;
195*0e209d39SAndroid Build Coastguard Worker         }
196*0e209d39SAndroid Build Coastguard Worker         strcat(libs,outputdir);
197*0e209d39SAndroid Build Coastguard Worker         strcat(libs,"/");
198*0e209d39SAndroid Build Coastguard Worker         strncat(libs,p+1,strlen(p)-4);
199*0e209d39SAndroid Build Coastguard Worker         strcat(libs," ");
200*0e209d39SAndroid Build Coastguard Worker       } else {
201*0e209d39SAndroid Build Coastguard Worker         printf("Unknown input file: %s\n", argv[i]);
202*0e209d39SAndroid Build Coastguard Worker         return 1;
203*0e209d39SAndroid Build Coastguard Worker       }
204*0e209d39SAndroid Build Coastguard Worker     }
205*0e209d39SAndroid Build Coastguard Worker   }
206*0e209d39SAndroid Build Coastguard Worker 
207*0e209d39SAndroid Build Coastguard Worker   if(prog[0]==0) {
208*0e209d39SAndroid Build Coastguard Worker     printf("no program (-o) option specified.\n");
209*0e209d39SAndroid Build Coastguard Worker     return 1;
210*0e209d39SAndroid Build Coastguard Worker   }
211*0e209d39SAndroid Build Coastguard Worker 
212*0e209d39SAndroid Build Coastguard Worker   sprintf(buf,"CRTPGM PGM(%s/%s) MODULE(%s) BNDSRVPGM(%s) BNDDIR(%s) OPTION(%s) REPLACE(*YES)",
213*0e209d39SAndroid Build Coastguard Worker           outputdir,progshort,
214*0e209d39SAndroid Build Coastguard Worker 
215*0e209d39SAndroid Build Coastguard Worker           objs,
216*0e209d39SAndroid Build Coastguard Worker 
217*0e209d39SAndroid Build Coastguard Worker           libs,
218*0e209d39SAndroid Build Coastguard Worker 
219*0e209d39SAndroid Build Coastguard Worker           bnddirs,
220*0e209d39SAndroid Build Coastguard Worker 
221*0e209d39SAndroid Build Coastguard Worker           opt);
222*0e209d39SAndroid Build Coastguard Worker 
223*0e209d39SAndroid Build Coastguard Worker 
224*0e209d39SAndroid Build Coastguard Worker   if(runcmd(buf)) {
225*0e209d39SAndroid Build Coastguard Worker     return 1;
226*0e209d39SAndroid Build Coastguard Worker   }
227*0e209d39SAndroid Build Coastguard Worker 
228*0e209d39SAndroid Build Coastguard Worker   /* -- OK */
229*0e209d39SAndroid Build Coastguard Worker   {
230*0e209d39SAndroid Build Coastguard Worker     char path1[1000];
231*0e209d39SAndroid Build Coastguard Worker     sprintf(path1,"/qsys.lib/%s.lib/%s.pgm",
232*0e209d39SAndroid Build Coastguard Worker             outputdir,
233*0e209d39SAndroid Build Coastguard Worker             progshort);
234*0e209d39SAndroid Build Coastguard Worker     printf("# ln -s %s %s\n", path1, prog);
235*0e209d39SAndroid Build Coastguard Worker     if((!TEST_MODE) && symlink(path1,prog)) {
236*0e209d39SAndroid Build Coastguard Worker       perror("symlink");
237*0e209d39SAndroid Build Coastguard Worker       if(errno!=EEXIST) { /* ignored */
238*0e209d39SAndroid Build Coastguard Worker         return 1;
239*0e209d39SAndroid Build Coastguard Worker       }
240*0e209d39SAndroid Build Coastguard Worker     }
241*0e209d39SAndroid Build Coastguard Worker   }
242*0e209d39SAndroid Build Coastguard Worker   return 0;
243*0e209d39SAndroid Build Coastguard Worker }
244*0e209d39SAndroid Build Coastguard Worker 
245*0e209d39SAndroid Build Coastguard Worker 
246*0e209d39SAndroid Build Coastguard Worker 
247*0e209d39SAndroid Build Coastguard Worker 
248*0e209d39SAndroid Build Coastguard Worker 
249*0e209d39SAndroid Build Coastguard Worker 
250*0e209d39SAndroid Build Coastguard Worker 
251*0e209d39SAndroid Build Coastguard Worker 
252