Open64 (mfef90, whirl2f, and IR tools)  TAG: version-openad; SVN changeset: 916
nargum.c
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines