Open64 (mfef90, whirl2f, and IR tools)
TAG: version-openad; SVN changeset: 916
|
00001 /* 00002 00003 Copyright (C) 2000, 2001 Silicon Graphics, Inc. All Rights Reserved. 00004 00005 This program is free software; you can redistribute it and/or modify it 00006 under the terms of version 2.1 of the GNU Lesser General Public License 00007 as published by the Free Software Foundation. 00008 00009 This program is distributed in the hope that it would be useful, but 00010 WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00012 00013 Further, this software is distributed without any warranty that it is 00014 free of the rightful claim of any third person regarding infringement 00015 or the like. Any license provided herein, whether implied or 00016 otherwise, applies only to this software file. Patent licenses, if 00017 any, provided herein do not apply to combinations of this program with 00018 other software, or any other product whatsoever. 00019 00020 You should have received a copy of the GNU Lesser General Public 00021 License along with this program; if not, write the Free Software 00022 Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, 00023 USA. 00024 00025 Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pky, 00026 Mountain View, CA 94043, or: 00027 00028 http://www.sgi.com 00029 00030 For further information regarding this notice, see: 00031 00032 http://oss.sgi.com/projects/GenInfo/NoticeExplan 00033 00034 */ 00035 00036 00037 00038 #include "cmplrs/host.h" 00039 #include "comargs.h" 00040 typedef uint32 *adresse; 00041 00042 int32 num_father_args, num_son_args; 00043 uint32 *father_addr[34], father_len[34]; 00044 uint32 *son_addr[32], son_len[32]; 00045 00046 int32 ctrace_[81]; 00047 #define PAQUOT -1 00048 #define QUOT '\\' 00049 #define DER_CAR 127 00050 #define MAX_CAR 125 00051 00052 #define nb_arg_moi num_son_args 00053 #define nb_arg_pere num_father_args 00054 #define list_arg_pere father_addr 00055 #define list_arg_moi son_addr 00056 #define list_len_pere father_len 00057 #define list_len_moi son_len 00058 00059 char *source, *destin; 00060 extern void set_args(uint32 *, uint32 *); 00061 00062 #ifdef sgi 00063 #define COPY_MOT(SRC,DEST) \ 00064 if (((ulong_t)DEST)&3 == 0) \ 00065 *(uint32 *)(DEST) = *(uint32 *)(SRC); \ 00066 else { \ 00067 register char *source = (char *) SRC, \ 00068 *destin = (char *) DEST; \ 00069 destin[0] = source[0]; \ 00070 destin[1] = source[1]; \ 00071 destin[2] = source[2]; \ 00072 destin[3] = source[3]; \ 00073 } 00074 #else 00075 #define COPY_MOT(SRC,DEST) \ 00076 source = (char *) SRC; \ 00077 destin = (char *) DEST; \ 00078 destin[0] = source[0]; \ 00079 destin[1] = source[1]; \ 00080 destin[2] = source[2]; \ 00081 destin[3] = source[3]; 00082 #endif 00083 00084 int32 *init_arg_() 00085 { 00086 return(comargs__); 00087 } 00088 00089 00090 int32 nargum_(uint32 *father_frame, int32 dum1, int32 dum2, int32 dum3) 00091 { 00092 adresse *pere, *moi; 00093 int32 i, max; 00094 00095 set_args(father_frame, (uint32 *) comargs__); 00096 00097 max = num_father_args<num_son_args ? num_father_args : num_son_args - 1; 00098 00099 pere = list_arg_pere; 00100 moi = &list_arg_moi[1]; 00101 00102 for (i=0; i<max; i++) { 00103 COPY_MOT(*pere, *moi) 00104 pere++; 00105 moi++; 00106 } 00107 00108 return(nb_arg_pere); 00109 } 00110 00111 00112 int32 nartab_(uint32 *father_frame, int32 dum1, int32 dum2, int32 dum3) 00113 { 00114 adresse *pere; 00115 int32 *imax; 00116 int32 *tab; 00117 int32 i, max; 00118 00119 set_args(father_frame, (uint32 *) comargs__); 00120 00121 imax = (int *)list_arg_moi[1]; 00122 tab = (int *)list_arg_moi[2]; 00123 00124 max = *imax; 00125 if (max > nb_arg_pere) 00126 max = nb_arg_pere; 00127 00128 pere = list_arg_pere; 00129 00130 for (i=0; i<max; i++) { 00131 COPY_MOT(*pere, tab) 00132 pere++; 00133 tab++; 00134 } 00135 return(nb_arg_pere); 00136 } 00137 00138 00139 void 00140 tabarg_(uint32 *father_frame, int32 dum1, int32 dum2, int32 dum3) 00141 { 00142 adresse tab_pere; 00143 int32 *num; 00144 int32 *nbr; 00145 int32 *tab; 00146 int32 i, max; 00147 00148 set_args(father_frame, (uint32 *) comargs__); 00149 00150 num = (int *)list_arg_moi[1]; 00151 nbr = (int *)list_arg_moi[2]; 00152 tab = (int *)list_arg_moi[3]; 00153 00154 if (*num > nb_arg_pere || *num <= 0) return; 00155 00156 max = *nbr; 00157 tab_pere = list_arg_pere[*num-1]; 00158 for (i=0; i<max; i++) { 00159 COPY_MOT(tab_pere, tab); 00160 tab_pere++; tab++; 00161 } 00162 } 00163 00164 00165 void 00166 rretrg_(uint32 *father_frame, int32 dum1, int32 dum2, int32 dum3) 00167 { 00168 int32 num, nbr; 00169 adresse tab, tab_pere; 00170 int32 i; 00171 00172 set_args(father_frame, (uint32 *) comargs__); 00173 00174 if (nb_arg_moi > 4 || nb_arg_moi < 3) return; 00175 00176 num = *(list_arg_moi[1]); 00177 00178 if (num<=0 || num>nb_arg_pere) return; 00179 00180 if (nb_arg_moi ==3) { 00181 COPY_MOT(list_arg_moi[2], list_arg_pere[num-1]) 00182 } else { 00183 nbr = *(list_arg_moi[2]); 00184 tab = list_arg_moi[3]; 00185 tab_pere = list_arg_pere[num-1]; 00186 for (i=0; i<nbr; i++) { 00187 COPY_MOT(tab,tab_pere) 00188 tab_pere++; tab++; 00189 } 00190 } 00191 } 00192 00193 00194 uint32 00195 rretvr_(uint32 *father_frame, int32 dum1, int32 dum2, int32 dum3) 00196 { 00197 int32 nbr, nini; 00198 adresse tab, *pere; 00199 int32 i, max; 00200 extern uint32 risc_return_ (uint32 *); 00201 00202 set_args(father_frame, (uint32 *) comargs__); 00203 00204 ctrace_[0]--; 00205 00206 if (nb_arg_moi > 4 || nb_arg_moi < 3) 00207 return 0; 00208 00209 if (nb_arg_moi==3) { 00210 risc_return_(list_arg_moi[2]); 00211 return(*list_arg_moi[2]); 00212 } else { 00213 nbr = *list_arg_moi[1]; 00214 nini = *list_arg_moi[2] - 1; 00215 if (nini<0) 00216 return 0; 00217 00218 tab = list_arg_moi[3]; 00219 pere = &list_arg_pere[nini]; 00220 00221 max = nb_arg_pere - nini; 00222 if (max > nbr) max = nbr; 00223 00224 for (i=0; i<max; i++) { 00225 COPY_MOT(tab,*pere) 00226 pere++; tab++; 00227 } 00228 } 00229 return 0; 00230 } 00231 00232 00233 void 00234 rretur_(uint32 *father_frame, int32 dum1, int32 dum2, int32 dum3) 00235 { 00236 ctrace_[0]--; 00237 } 00238 00239 00240 00241 /*DBA le 16/12/89 modification pour transmission father_stack */ 00242 00243 /*---------------------------------------------------------------------- 00244 ; 00245 ; INTERFACES DE GESTIONS D'APPEL DE ROUTINES FORTRAN COMPORTANT 00246 ; UN NOMBRE D'ARGUMENTS VARIABLE DE TYPE CARACTERE 00247 ;----------------------------------------------------------------------- 00248 ; 00249 ; REFERENCE DES TESTS : TSTCAR.FOR 00250 ; REFERENCE DES FICHIERS RESULTAT : TSTCAR.DAT 00251 ; PROGRAMME A ADAPTER : NARCAR.MAR 00252 ;----------------------------------------------------------------------*/ 00253 00254 /******************************************************************** 00255 * Principe: 00256 * 00257 * - Une partie de programme qui est tres machine dependant "recup_arg" 00258 * a pour role de recuperer les argument d'appele et d'appelant. 00259 * 00260 * - Les argument sont range de maniere suivant: 00261 * 00262 * *) nb_arg_moi: Nombre d'argument d'appele. 00263 * *) nb_arg_pere: Nombre d'argument d'appelant. 00264 * 00265 * *) list_arg_moi : Un tableau qui contien les argument d'appele. 00266 * *) list_arg_pere: Un tableau qui contien les argument d'appelant. 00267 * 00268 * *) list_len_moi : Un tableau qui contien la lengueur de chaque argument. 00269 * *) list_len_pere: Un tableau qui contien la lengueur de chaque argument. 00270 * 00271 * 00272 * - Si une variable est de type chaine de caractere: Sa lengueur > 0. 00273 * - Si une variable n'est pas de type chaine de caractere: Sa lengueur = 0. 00274 * 00275 * - Le nombre des argument est limite a 32. 00276 * 00277 * | 1er-arg | | Len 1er-arg | 00278 * |---------| |-------------| 00279 * | Dernier | | Len Dernier | 00280 * / arg / / arg / 00281 * |---------| |-------------| 00282 * | 0 | | | 00283 * |---------| / / 00284 * | Status | | | 00285 * |---------| ------------- 00286 * | | 00287 * / / 00288 * | | 00289 * --------- 00290 * 00291 * Status: 00292 * - Un mot de 32 bit. 00293 * Bit = 1 Type caractere. 00294 * Bit = 0 Type different de caractere. 00295 * Le Status commance a gauche. 00296 * 00297 * 31 0 00298 * --------------//----- 00299 * | | | | | | 00300 * --------------//----- 00301 * ^ ^ 00302 * | | 00303 * Statu de dernier Statu de 1er argument 00304 * 00305 * 00306 ************************************************************************/ 00307 00308 #ifndef sgi 00309 #define FALSE 0 00310 #define TRUE 1 00311 00312 #define PAQUOT -1 00313 #define QUOT '\\' 00314 #define DER_CAR 127 00315 #define MAX_CAR 125 00316 00317 typedef int32 * adresse; /* Les arguments sont passe par adresse en FORTRAN */ 00318 00319 /*Adresse du nargum du pere pour transmission a recup_arg */ 00320 int32 father_stack; 00321 00322 adresse list_arg_moi[34]; 00323 int32 list_len_moi[32]; 00324 int32 nb_arg_moi; 00325 00326 adresse list_arg_pere[34]; 00327 int32 list_len_pere[32]; 00328 int32 nb_arg_pere; 00329 00330 char *source, *destin; 00331 00332 /**************************************************************** 00333 * Titre: COPY_MOT 00334 * Role : Fonction On_ligne. 00335 * Specifique au machine RISC, qui ont des probleme d'allignement 00336 * Donc ne peuvent copier un mot non alligne, on copie 4 octets. 00337 * Octet par Octet. 00338 *****************************************************************/ 00339 #define COPY_MOT(CONTENU_A,CONTENU_B) \ 00340 source = (char *) CONTENU_A; \ 00341 destin = (char *) CONTENU_B; \ 00342 destin[0] = source[0]; \ 00343 destin[1] = source[1]; \ 00344 destin[2] = source[2]; \ 00345 destin[3] = source[3]; 00346 #endif 00347 00348 /*---------------------------------------------------------------------- 00349 ; ROUTINE INTERFACE DE RECUPERATION DE VALEUR D'ARGUMENT POUR UNE CHAINE DE 00350 ; CARACTERES. 00351 ; 00352 ; A CAUSE DE LA COMPATIBILITE CHARACTER <--> INTEGER/REAL*4/REAL*8, IL EST 00353 ; POSSIBLE D'OBTENIR UNE CHAINE DE CARACTERES ALORS QUE CE N'EST PAS 00354 ; UNE CHAINE DE CARACTERE QUI A ETE TRANSMISE S'IL SE TROUVE QU'ON 00355 ; TROUVE DES "\" AVEC DES CARACTERES IMPRIMABLES ENTRE LES "\". 00356 ; LE CONTROLE DE IMPRIM PAR FORMAT PERMET D'EVITER CELA MAIS EN MODE 00357 ; FORMAT PAR DEFAUT, CELA PEUT ARRIVER. 00358 ; 00359 ; CETTE COMPATIBILITE EST INDISPENSABLE DANS UNE PHASE TRANSITOIRE. 00360 ; 00361 ; 00362 ; DANS LE CAS D'UN NOMBRE FIXE D'ARGUMENTS, IL PEUT Y AVOIR DES ARGUMENTS 00363 ; QUI PEUVENT ETRE DES CHAINES DE CARACTERES DE TYPE CHARACTER OU NON 00364 ; DANS LE "PROGRAMME APPELANT". 00365 ; PAR SUITE DE LA COMPATIBILITE QUE L'ON DOIT ASSURER DANS UNE PHASE 00366 ; TRANSITOIRE, LES ARGUMENTS FORMELS DE TYPE CHARACTER NE PEUVENT ETRE UTILISES ; DANS LE PROGRAMME APPELE; 00367 ; EN EFFET, SI L'ON AVAIT UN TYPE CHARACTER DANS LE "PROGRAMME APPELANT", 00368 ; ON POURRAIT MANIPULER DIRECTEMENT LA CHAINE DE CARACTERES TRANSMISE 00369 ; MAIS SI L'ON N'AVAIT PAS UN TYPE CHARACTER (UN GEOMETRIQUE PAR EXEMPLE), 00370 ; ON NE POURRAIT ACCEDER A SA VALEUR. POUR CETTE RAISON, 00371 ; NARCAR PEUT RENDRE LA VALEUR DES QUATRE PREMIERS OCTETS (32 BITS). ON PEUT 00372 ; AINSI MANIPULER ET TESTER LA VALEUR DE L'ARGUMENT NON CHARACTER. 00373 ; 00374 ; SI ON APPELLE NARCAR AVEC UNE VARIABLE DE TYPE CHARACTER (SYNTAXE A 3/4 ARG.) 00375 ; ON COPIE AU MAXIMUM LE NOMBRE DE CARACTERES CORRESPONDANT A LA LONGUEUR DE 00376 ; CETTE VARIABLE (COMPLEMENT A BLANC OU TRONCATION EVENTUELLE) 00377 ; 00378 ; SI ON APPELLE NARCAR AVEC UN TABLEAU NON CHARACTER (SYNTAXE A 4/5 ARG.) 00379 ; ON PREND POUR LONGUEUR (EN CARACTERES) LA VALEUR FOURNIE DANS MAX ET ON 00380 ; COMPLETE A BLANC OU ON TRONQUE. 00381 ; 00382 ; LA CHAINE DE CARACTERES DU "PROGRAMME APPELANT" DOIT ETRE COMPRISE ENTRE 00383 ; BACKSLASH ET ETRE DE LONGUEUR INFERIEURE A 128 ("\" Y COMPRIS). 00384 ; 00385 ; SI L'ON N'A PAS DE "\" OU BIEN, SI L'ON N'A PAS UNE CONSTANTE/VARIABLE/ 00386 ; TABLEAU DE TYPE CHARACTER DANS LE "PROGRAMME APPELANT" ET S'IL Y A DES 00387 ; CARACTERES INVALIDES ENTRE LES "\", NBR VAUDRA -1 ( <==> PAQUOT) . 00388 ; 00389 ; SI NBR > MAX , C'EST QU'IL Y A EU TRONCATION. 00390 ; 00391 ; SI ON A UNE CHAINE DE CARACTERES DE LA FORME "\\" , NBR SERA NUL. 00392 ; DES BLANCS SERONT MIS DANS LA CHAINE OU LE TABLEAU RECEPTEUR. 00393 ; 00394 ; NARCAR : 00395 ; ======== 00396 ; 00397 ; 00398 ; NBR = NARCAR(LLL999,NUM,MAX,TAB[,VALARG]) 00399 ; 00400 ; NUM : NUMERO DE L'ARGUMENT DANS LE PROGRAMME APPELANT. 00401 ; MAX : NOMBRE MAXIMUM DE CARACTERES A RECUPERER. 00402 ; TAB : TABLEAU NON CHARACTER OU SERONT RECOPIES LES CARACTERES. 00403 ; NBR : NOMBRE DE CARACTERES DANS LE "PROGRAMME APPELANT". 00404 ; VALARG : VALEUR DE L'ARGUMENT (PREMIERS 32 BITS). OPTIONNEL 00405 ; 00406 ; 00407 ; NBR = NARCAR(LLL999,NUM,TAB[,VALARG]) 00408 ; 00409 ; NUM : NUMERO DE L'ARGUMENT DANS LE PROGRAMME APPELANT 00410 ; TAB : VARIABLE DE TYPE CHARACTER OU SERONT RECOPIES LES CARACTERES 00411 ; NBR : NOMBRE DE CARACTERES DANS LE "PROGRAMME APPELANT". 00412 ; VALARG : VALEUR DE L'ARGUMENT (PREMIERS 32 BITS). OPTIONNEL 00413 ; 00414 ; IL PEUT Y AVOIR AMBIGUITE ENTRE LES DEUX SYNTAXES SUIVANTES : 00415 ; 00416 ; NARCAR(LLL999,NUM,MAX,TAB) ET NARCAR(LLL999,NUM,TAB,VALARG) 00417 ; 00418 ; S'IL Y A UNE TABLE DES LONGUEURS DANS LE PROGRAMME QUI APPELLE NARCAR, C'EST 00419 ; LA PREMIERE SYNTAXE. 00420 ; S'IL N'Y A PAS DE TABLE DES LONGUEURS DANS LE PROGRAMME QUI APPELLE NARCAR, 00421 ; C'EST LA SECONDE SYNTAXE. 00422 ;------------------------------------------------------------------------*/ 00423 #ifndef sgi 00424 int32 00425 narcar_ (int32 *stp) 00426 00427 #else 00428 int32 00429 narcar_(int32 *father_frame, int32 dum1, int32 dum2, int32 dum3) 00430 #endif 00431 00432 { 00433 char *tab,*arg_pere; 00434 int32 num,max,nbr; 00435 int32 i; 00436 00437 /*=-=-=-=-= Cette partie est strictement UNIX =-=-=-=-=-=-=-=-=-=-==-=-=-=-=*/ 00438 #ifndef sgi 00439 father_stack = *stp; 00440 res = recup_arg_();/* La fonction qui copie les argument dans le tableau */ 00441 /* "list_arg_moi", et position "nb_arg_moi" =-=-=-=-=*/ 00442 if (res == 0) { 00443 printf(" %%VARARG-ERR : FATAL ERROR \n"); 00444 exit (-1); 00445 } else if (res == 2) return (0); 00446 00447 #else 00448 set_args((uint32 *) father_frame, (uint32 *) comargs__); 00449 #endif 00450 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ 00451 00452 num = *(list_arg_moi[1]); /* Numero d'argument pere */ 00453 if ((num > nb_arg_pere) || (num <= 0)) { 00454 return(PAQUOT); /* Erreur */ 00455 } 00456 00457 arg_pere = (char *)list_arg_pere[num-1]; 00458 00459 switch (nb_arg_moi) { 00460 00461 case 5 : /*=-= Syntaxe NARCAR(LLL999,NUM,MAX,TAB,VALARG) =-=*/ 00462 max = *(list_arg_moi[2]); 00463 tab = (char *)list_arg_moi[3]; 00464 COPY_MOT(arg_pere, list_arg_moi[4]); 00465 break; 00466 00467 case 3 : /*=-= Syntaxe NARCAR(LLL999,NUM,TAB) =-=*/ 00468 max = list_len_moi[2]; /* Max = lengueur de chaine */ 00469 tab = (char *)list_arg_moi[2]; 00470 break; 00471 00472 case 4 : /*=-= Syntaxe ambigue =-=-=-=-=-=-=*/ 00473 if (list_len_moi[2] > 0){ /* 3eme argument de type cara */ 00474 /*=-= Syntaxe NARCAR(LLL999,NUM,TAB,VALARG) =-=*/ 00475 max = list_len_moi[2]; /* Max = lengueur de chaine */ 00476 tab = (char *)list_arg_moi[2]; 00477 COPY_MOT(arg_pere, list_arg_moi[3]); 00478 }else { /* 3eme argument de type autre que car */ 00479 /*=-= Syntaxe NARCAR(LLL999,NUM,MAX,TAB) =-=*/ 00480 max = *(list_arg_moi[2]); 00481 tab = (char *)list_arg_moi[3]; 00482 } 00483 break; 00484 default : /*=-= Syntaxe incorrect =-=-=*/ 00485 return(PAQUOT); /* Erreur */ 00486 } 00487 00488 if (*(arg_pere++) != QUOT) { 00489 return(PAQUOT); /* Erreur il faut que la chaine commance par QUOT */ 00490 } 00491 00492 /*=-= On commance a copier les caracteres de l'appelant vers l'appele =-=*/ 00493 for (nbr=0; arg_pere[nbr] != QUOT && nbr<MAX_CAR; nbr++) ; 00494 00495 if (arg_pere[nbr] != QUOT) { 00496 return(PAQUOT); /* Erreur il faut que la chaine termine par QUOT */ 00497 } 00498 00499 /*=-=-= Tout est bon on copie les caractere =-=-=-=-=*/ 00500 for (i=0; i < nbr; i++) { 00501 if (i < max) { 00502 *(tab++) = *(arg_pere++); 00503 } 00504 } 00505 00506 /*=-= On rempil a blancs l'argument de l'appele =-=-=*/ 00507 for (i=nbr; i < max; i++) { 00508 *(tab++) = ' '; 00509 } 00510 00511 return(nbr); 00512 } 00513 00514 /*------------------------------------------------------------------------ 00515 ; 00516 ; NTABCA : 00517 ; ======== 00518 ; 00519 ; NBR = NTABCA(LLL999,NUM,MAX,TAB[,VALARG]) 00520 ; 00521 ; COMME NARCAR AVEC TAB DE TYPE CHARACTER (TABLEAU). 00522 ; 00523 ; DANS CE CAS, ON OBTIENT MAX CARACTERES DANS LE TABLEAU CHARACTER TAB QUI 00524 ; NATURELLEMENT DOIT ETRE CORRECTEMENT DIMENSIONNE. (IL N'Y A PAS DE 00525 ; CONTROLE SUR LA DIMENSION DE TAB DANS NTABCA). 00526 ; 00527 ; 00528 ; IBM ( a titre indicatif ) 00529 ; ===== 00530 ; 00531 ; COMME SUR VAX AVEC LES DIFFERENCES SUIVANTES : 00532 ; 00533 ; S'IL N'Y A PAS DE LONGUEUR DANS LE "PROGRAMME APPELANT" ET DONC PAS DE 00534 ; VARIABLE/TABLEAU/CONSTANTE CHARACTER DANS LA LISTE D'ARGUMENTS, ON RECHERCHE 00535 ; LES "#" QUI CORRESPONDENT AUX "\" DU VAX ET ON CONTROLE QUE L'ON A DES 00536 ; CARACTERES IMPRIMABLES. 00537 ; 00538 ; S'IL Y A UNE LONGUEUR DIFFERENTE DE 4 ET DE 8 DANS LE "PROGRAMME APPELANT", 00539 ; C'EST UNE VARIABLE/TABLEAU/CONSTANTE CHARACTER ET L'ON TIENT COMPTE DE CETTE 00540 ; LONGUEUR. 00541 ; 00542 ; S'IL Y A UNE LONGUEUR 4 OU 8 DANS LE "PROGRAMME APPELANT", IL PEUT Y AVOIR 00543 ; AMBIGUITE. S'IL N'Y A QU'UN ARGUMENT DANS LE "PROGRAMME APPELANT", IL N'Y A 00544 ; PAS D'AMBIGUITE ET CET ARGUMENT EST DE TYPE CHARACTER DE LONGUEUR 4 OU 8. 00545 ; S'IL Y A PLUS D'UN ARGUMENT DANS LE "PROGRAMME APPELANT", ON CONTROLE COMME 00546 ; S'IL N'Y AVAIT PAS DE LONGUEUR. 00547 ;---------------------------------------------------------------------------*/ 00548 00549 #ifndef sgi 00550 int32 00551 ntabca_(int *stp) 00552 #else 00553 int32 00554 ntabca_(int32 *father_frame, int32 dum1, int32 dum2, int32 dum3) 00555 #endif 00556 00557 { 00558 char *tab,*arg_pere; 00559 int32 num,max,nbr; 00560 int32 i; 00561 00562 /*=-=-=-=-= Cette partie est strictement UNIX =-=-=-=-=-=-=-=-=-=-==-=-=-=-=*/ 00563 #ifndef sgi 00564 father_stack = *stp; 00565 res = recup_arg_();/* La fonction qui copie les argument dans le tableau */ /* "list_arg_moi", et position "nb_arg_moi" =-=-=-=-=*/ 00566 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ 00567 00568 if (res == 0) { 00569 printf(" %%VARARG-ERR : FATAL ERROR \n"); 00570 exit (-1); 00571 } else if (res == 2) return (0); 00572 #else 00573 set_args((uint32 *) father_frame, (uint32 *) comargs__); 00574 #endif 00575 00576 if (nb_arg_moi < 4 || nb_arg_moi > 5) { 00577 return(PAQUOT); /* Erreur de Syntaxe */ 00578 } 00579 00580 num = *(list_arg_moi[1]); /* Numero d'argument pere */ 00581 if ((num > nb_arg_pere) || (num <= 0)) { 00582 return(PAQUOT); /* Erreur */ 00583 } 00584 00585 arg_pere = (char *)list_arg_pere[num-1]; 00586 max = *(list_arg_moi[2]); 00587 00588 if (nb_arg_moi == 5) {/* Syntaxe NTABCA(LLL999,NUM,MAX,TAB,VALARG) */ 00589 /*=-= On copie dans VAlARG, le 1er mot de l'arg_pere =-=-=*/ 00590 COPY_MOT(arg_pere, list_arg_moi[4]); 00591 } 00592 00593 if (*(arg_pere++) != QUOT) { 00594 return(PAQUOT); /* Erreur il faut que la chaine commance par QUOT */ 00595 } 00596 00597 for (nbr=0; *(arg_pere) != QUOT && nbr<MAX_CAR; nbr++, arg_pere++) { 00598 if (nbr < max) { 00599 *(tab++) = *(arg_pere); 00600 } 00601 } 00602 00603 if (*(arg_pere) != QUOT) { 00604 return(PAQUOT); /* Erreur il faut que la chaine termine par QUOT */ 00605 } 00606 00607 for (i=nbr; i < max; i++) { 00608 *(tab++) = ' '; 00609 } 00610 00611 return(nbr); 00612 } 00613 00614 /*--------------------------------------------------------------------------- 00615 ; ======== 00616 ; NCHARA : 00617 ; ======== 00618 ; 00619 ; DANS CE CAS, ON EST A ARGUMENTS EN NOMBRE FIXE : NOMS EUCLID, PROGRAMMES DE 00620 ; BD, ... 00621 ; IL N'Y A ALORS PAS DE "\" ET L'ON DOIT SEULEMENT ASSURER LA COMPATIBILITE 00622 ; AVEC LE FONCTIONNEMENT ACTUEL (FORTRAN 66). 00623 ; 00624 ; VAX : 00625 ; ===== 00626 ; 00627 ; ON RETROUVE LES MEME SYNTAXES QUE POUR NARCAR : 00628 ; 00629 ; NBRCAR=NCHARA(LLL999,NUM,MAXCAR,TABCAR[,VALARG]) 00630 ; 00631 ; NBRCAR=NCHARA(LLL999,NUM,TABCAR[,VALARG]) 00632 ; 00633 ; SI L'ON N'A PAS UN TYPE CHARACTER DANS LE "PROGRAMME APPELANT", ON FOURNIT 00634 ; LES PREMIERS CARACTERES VALIDES (IMPRIMABLES) ET ON COMPLETE EVENTUELLEMENT 00635 ; A BLANC JUSQU'A MAXCAR CARACTERES ET NBRCAR VAUT MOINS LE NOMBRE DE 00636 ; CARACTERES VALIDES TROUVES. VALARG CONTIENT ALORS LE PREMIER MOT (32 BITS) 00637 ; ET LE FONCTIONNEMENT EST SEMBLABLE AU FONCTIONNEMENT ACTUEL. 00638 ; 00639 ; SI L'ON A UN TYPE CHARACTER DANS LE "PROGRAMME APPELANT", ON LES FOURNIT 00640 ; DANS TABCAR ET NBRCAR VAUT LE NOMBRE DE CARACTERES QU'IL Y AVAIT DANS LE 00641 ; "PROGRAMME APPELANT". 00642 ;---------------------------------------------------------------------------*/ 00643 #ifndef sgi 00644 int32 00645 nchara_(int32 *stp) 00646 #else 00647 int32 00648 nchara_(int32 *father_frame, int32 dum1, int32 dum2, int32 dum3) 00649 #endif 00650 00651 { 00652 char *tab,*arg_pere; 00653 int32 num,max,nbr,max_car_pere; 00654 int32 i; 00655 00656 /*=-=-=-=-= Cette partie est strictement UNIX =-=-=-=-=-=-=-=-=-=-==-=-=-=-=*/ 00657 #ifndef sgi 00658 father_stack = *stp; 00659 res = recup_arg_();/* La fonction qui copie les argument dans le tableau */ /* "list_arg_moi", et position "nb_arg_moi" =-=-=-=-=*/ 00660 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ 00661 00662 if (res == 0) { 00663 printf(" %%VARARG-ERR : FATAL ERROR \n"); 00664 exit (-1); 00665 } else if (res == 2) return (0); 00666 #else 00667 set_args((uint32 *) father_frame, (uint32 *) comargs__); 00668 #endif 00669 00670 num = *(list_arg_moi[1]); /* Numero d'argument pere */ 00671 if ((num > nb_arg_pere) || (num <= 0)) { 00672 return(FALSE); /* Erreur */ 00673 } 00674 00675 arg_pere = (char *)list_arg_pere[num-1]; 00676 00677 switch (nb_arg_moi) { 00678 00679 case 5 : /*=-= Syntaxe NARCAR(LLL999,NUM,MAX,TAB,VALARG) =-=*/ 00680 max = *(list_arg_moi[2]); 00681 tab = (char *)list_arg_moi[3]; 00682 COPY_MOT(arg_pere, list_arg_moi[4]); 00683 break; 00684 00685 case 3 : /*=-= Syntaxe NARCAR(LLL999,NUM,TAB) =-=*/ 00686 max = list_len_moi[2]; /* Max = lengueur de chaine */ 00687 tab = (char *)list_arg_moi[2]; 00688 break; 00689 00690 case 4 : /*=-= Syntaxe ambigue =-=-=-=-=-=-=*/ 00691 if (list_len_moi[2] > 0){ /* 3eme argument de type cara */ 00692 /*=-= Syntaxe NARCAR(LLL999,NUM,TAB,VALARG) =-=*/ 00693 max = list_len_moi[2]; /* Max = lengueur de chaine */ 00694 tab = (char *)list_arg_moi[2]; 00695 COPY_MOT(arg_pere, list_arg_moi[3]); 00696 }else { /* 3eme argument de type autre que car */ 00697 /*=-= Syntaxe NARCAR(LLL999,NUM,MAX,TAB) =-=*/ 00698 max = *(list_arg_moi[2]); 00699 tab = (char *)list_arg_moi[3]; 00700 } 00701 break; 00702 default : /*=-= Syntaxe incorrect =-=-=*/ 00703 return(FALSE); /* Erreur */ 00704 } 00705 00706 max_car_pere = list_len_pere[num - 1]; 00707 00708 if (max_car_pere == 0) { /* Argument pere de type autre que car */ 00709 /* On copie tous les caractere valide */ 00710 for(nbr=0;nbr<max &&((*arg_pere>=' ')&&(*arg_pere<DER_CAR));nbr++) { 00711 *(tab++) = *(arg_pere++); 00712 } 00713 }else {/* Argument pere de type car */ 00714 /* On copie tous les caractere */ 00715 for(nbr=0; nbr<max && nbr<max_car_pere;nbr++) { 00716 *(tab++) = *(arg_pere++); 00717 } 00718 } 00719 00720 /*=-= On rempil a blancs l'argument de l'appele =-=-=*/ 00721 for (i=nbr; i < max; i++) { 00722 *(tab++) = ' '; 00723 } 00724 00725 if (max_car_pere == 0) { 00726 return(-nbr); 00727 }else { 00728 return(max_car_pere); 00729 } 00730 } 00731 00732 /*------------------------------------------------------------------------- 00733 ; NTABCH : 00734 ; ======== 00735 ; 00736 ; NBR = NTABCH(LLL999,NUM,MAX,TAB[,VALARG]) 00737 ; 00738 ; COMME NCHARA AVEC TAB DE TYPE CHARACTER (TABLEAU). 00739 ; 00740 ; DANS CE CAS, ON OBTIENT MAX CARACTERES DANS LE TABLEAU CHARACTER TAB QUI 00741 ; NATURELLEMENT DOIT ETRE CORRECTEMENT DIMENSIONNE. (IL N'Y A PAS DE 00742 ; CONTROLE SUR LA DIMENSION DE TAB DANS NTABCH). 00743 ; 00744 ; IBM ( a titre indicatif ) 00745 ; ===== 00746 ; 00747 ; A PARTIR DU MOMENT OU ON VEUT ASSURER LA COMPATIBILITE CHARACTER ET 00748 ; ANCIEN MODE D'APPEL AVEC INTEGER/REAL*4/REAL*8, IL Y A DES AMBIGUITES. 00749 ; CEPENDANT IL FAUT SAVOIR QUE CELA N'AJOUTE PAS D'AMBIGUITES PAR RAPPORT 00750 ; A L'ETAT ACTUEL BIEN AU CONTRAIRE. 00751 ; 00752 ; S'IL N'Y A PAS DE TABLE DES LONGUEURS DANS LE "PROGRAMME APPELANT", ON 00753 ; FOURNIT MAXCAR CARACTERES (LES PREMIERS CARACTERES IMPRIMABLES SUIVIS DE 00754 ; BLANCS) ET NBRCAR=0. 00755 ; 00756 ; S'IL Y A UNE VARIABLE/TABLEAU/CONSTANTE CHARACTER DANS LA LISTE, CE N'EST 00757 ; PAS FORCEMENT CELUI QUE L'ON CHERCHE A RECUPERER PAR NCHARA. 00758 ; 00759 ; SI LA LONGUEUR EST 4, ON FOURNIT MAXCAR CARACTERES ET NBRCAR VAUT 0 A MOINS 00760 ; QUE L'ON N'AIT QU'UN SEUL ARGUMENT DANS LE "PROGRAMME APPELANT" AUQUEL CAS 00761 ; CET ARGUMENT EST DE TYPE CHARACTER DE LONGUEUR 4 OU 8. S'IL Y A PLUS D'UN 00762 ; ARGUMENT, ON NE PEUT SAVOIR SI 4 CARACTERES ONT ETE TRANSMIS (TYPE 00763 ; CHARACTER*4) OU BIEN SI C'EST UNE VARIABLE ENTIERE/REELLE OU BIEN SI C'EST UN 00764 ; TABLEAU ENTIER/REEL. 00765 ; 00766 ; SI LA LONGUEUR EST DIFFERENTE DE 4, ON FOURNIT LES CARACTERES ET NBRCAR 00767 ; VAUT LE NOMBRE DE CARACTERES. 00768 ;----------------------------------------------------------------------------*/ 00769 #ifndef sgi 00770 int32 00771 ntabch_(int32 *stp) 00772 00773 #else 00774 int32 00775 ntabch_(int32 *father_frame, int32 dum1, int32 dum2, int32 dum3) 00776 #endif 00777 00778 { 00779 char *tab,*arg_pere; 00780 int32 num,max,nbr,max_car_pere; 00781 int32 i; 00782 00783 /*=-=-=-=-= Cette partie est strictement UNIX =-=-=-=-=-=-=-=-=-=-==-=-=-=-=*/ 00784 #ifndef sgi 00785 father_stack = *stp; 00786 res = recup_arg_();/* La fonction qui copie les argument dans le tableau */ /* "list_arg_moi", et position "nb_arg_moi" =-=-=-=-=*/ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ 00787 00788 if (res == 0) { 00789 printf(" %%VARARG-ERR : FATAL ERROR \n"); 00790 exit (-1); 00791 } else if (res == 2) return (0); 00792 #else 00793 set_args((uint32 *) father_frame, (uint32 *) comargs__); 00794 #endif 00795 00796 if (nb_arg_moi < 4 || nb_arg_moi > 5) { 00797 return(FALSE); /* Erreur de Syntaxe */ 00798 } 00799 00800 num = *(list_arg_moi[1]); /* Numero d'argument pere */ 00801 if ((num > nb_arg_pere) || (num <= 0)) { 00802 return(FALSE); /* Erreur */ 00803 } 00804 00805 arg_pere = (char *)list_arg_pere[num-1]; 00806 max = *(list_arg_moi[2]); 00807 00808 if (nb_arg_moi == 5) {/* Syntaxe NTABCA(LLL999,NUM,MAX,TAB,VALARG) */ 00809 /*=-= On copie dans VAlARG, le 1er mot de l'arg_pere =-=-=*/ 00810 COPY_MOT(arg_pere, list_arg_moi[4]); 00811 } 00812 max_car_pere = list_len_pere[num - 1]; 00813 00814 if (max_car_pere == 0) { /* Argument pere de type autre que car */ 00815 /* On copie tous les caractere valide */ 00816 for(nbr=0;nbr<max &&((*arg_pere>=' ')&&(*arg_pere<DER_CAR));nbr++) { 00817 *(tab++) = *(arg_pere++); 00818 } 00819 }else {/* Argument pere de type car */ 00820 /* On copie tous les caractere */ 00821 for(nbr=0; nbr<max && nbr<max_car_pere;nbr++) { 00822 *(tab++) = *(arg_pere++); 00823 } 00824 } 00825 00826 /*=-= On rempil a blancs l'argument de l'appele =-=-=*/ 00827 for (i=nbr; i < max; i++) { 00828 *(tab++) = ' '; 00829 } 00830 00831 if (max_car_pere == 0) { 00832 return(-nbr); 00833 }else { 00834 return(max_car_pere); 00835 } 00836 } 00837 00838 /*------------------------------------------------------------------------ 00839 ; ======== 00840 ; NRETCA : 00841 ; ======== 00842 ; 00843 ; SYNTAXE : 00844 ; NBR = NRETCA(LLL999,NUM,TAB) 00845 ; TAB : LA CHAINE A RENVOYER, DE TYPE CARACTERE. 00846 ; 00847 ; SYNTAXE SUPPLEMENTAIRE : 00848 ; NBR = NRETCA(LLL999,NUM,MAX,TAB) 00849 ; 00850 ; NRETCA PERMET DE RENVOYER DANS LE PROGRAMME APPELANT LA VALEUR D'UNE CHAINE 00851 ; DE CARACTERES AVEC LES MEMES SYNTAXES QUE CI-DESSUS SANS L'ARGUMENT OPTIONNEL 00852 ; VALARG. 00853 ; 00854 ; LA VALEUR DE LA FONCTION NRETCA EST LE NOMBRE DE CARACTERES RECOPIES DANS LE 00855 ; PROGRAMME APPELANT. CE NOMBRE EST : 00856 ; > 0 SI ON A UNE VARIABLE CHARACTER DANS L'APPELANT 00857 ; < 0 SI ON N'A PAS UNE VARIABLE CHARACTER DANS L'APPELANT 00858 ; 00859 ; CE NOMBRE PEUT ETRE SUPERIEUR AU NOMBRE DE CARACTERES TRANSMIS PAR LE 00860 ; PROGRAMME QUI APPELLE NRETCA SI ON A UNE VARIABLE CHARACTER DANS LE 00861 ; "PROGRAMME APPELANT" CAR ON COMPLETE A BLANC. S'IL EST INFERIEUR, C'EST 00862 ; QU'IL Y A EU TRONCATION. 00863 ; 00864 ; SI L'ARGUMENT DU "PROGRAMME APPELANT" N'EST PAS DE TYPE CHARACTER, IL N'Y 00865 ; A PAS DE COMPLEMENT A BLANC ET ON NE TRANSFERE QUE LE NOMBRE DE CARACTERES 00866 ; TRANSMIS A NRETCA. 00867 ; 00868 ; SYNTAXE SUPPLEMENTAIRE : 00869 ; 00870 ; NBR = NRETCA(LLL999,NUM,MAX,TAB) 00871 ; 00872 ; CETTE SYNTAXE EST DESTINEE A RENVOYER UN TABLEAU DE TYPE CHARACTER ET 00873 ; TAB EST DE TYPE CHARACTER. (C'EST L'EQUIVALENT DE NTABCA ET DE NTABCH). 00874 ;-----------------------------------------------------------------------*/ 00875 #ifndef sgi 00876 int32 00877 nretca_(int32 *stp) 00878 00879 #else 00880 int32 00881 nretca_(int32 *father_frame, int32 dum1, int32 dum2, int32 dum3) 00882 #endif 00883 00884 { 00885 char *tab,*arg_pere; 00886 int32 num,max,nbr,max_car_pere; 00887 int32 i; 00888 00889 /*=-=-=-=-= Cette partie est strictement UNIX =-=-=-=-=-=-=-=-=-=-==-=-=-=-=*/ 00890 #ifndef sgi 00891 father_stack = *stp; 00892 res = recup_arg_();/* La fonction qui copie les argument dans le tableau */ 00893 /* "list_arg_moi", et position "nb_arg_moi" =-=-=-=-=*/ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ 00894 00895 if (res == 0) { 00896 printf(" %%VARARG-ERR : FATAL ERROR \n"); 00897 exit (-1); 00898 } else if (res == 2) return (0); 00899 #else 00900 set_args((uint32 *) father_frame, (uint32 *) comargs__); 00901 #endif 00902 00903 num = *(list_arg_moi[1]); /* Numero d'argument pere */ 00904 if ((num > nb_arg_pere) || (num <= 0)) { 00905 return(FALSE); /* Erreur */ 00906 } 00907 00908 arg_pere = (char *)list_arg_pere[num-1]; 00909 00910 switch (nb_arg_moi) { 00911 00912 case 4 : /*=-= Syntaxe NRETCA(LLL999,NUM,MAX,TAB) =-=*/ 00913 max = *(list_arg_moi[2]); 00914 tab = (char *)list_arg_moi[3]; 00915 break; 00916 00917 case 3 : /*=-= Syntaxe NARCAR(LLL999,NUM,TAB) =-=*/ 00918 max = list_len_moi[2]; /* Max = lengueur de chaine */ 00919 tab = (char *)list_arg_moi[2]; 00920 break; 00921 00922 default : /*=-= Syntaxe incorrect =-=-=*/ 00923 return(FALSE); /* Erreur */ 00924 } 00925 00926 max_car_pere = list_len_pere[num - 1]; 00927 00928 if (max_car_pere == 0) { /* Argument pere de type autre que car */ 00929 /* On copie tous les caractere */ 00930 for(nbr=0; nbr<max; nbr++) { 00931 *(arg_pere++) = *(tab++); 00932 } 00933 }else {/* Argument pere de type car */ 00934 /* On copie tous les caractere */ 00935 for(nbr=0; nbr<max && nbr<max_car_pere;nbr++) { 00936 *(arg_pere++) = *(tab++); 00937 } 00938 /*=-= On rempil a blancs l'argument de l'appele =-=-=*/ 00939 for (i=nbr; i < max_car_pere; i++) { 00940 *(arg_pere++) = ' '; 00941 } 00942 } 00943 00944 if (max_car_pere == 0) { 00945 return(-nbr); 00946 }else { 00947 return(max_car_pere); 00948 } 00949 }