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