C Renaming Example

Here we use several of extract's features in order to solve a common problem in interlanguage operation. Fortran compilers typically mangle the namespace differently than C, so a C routine has to change it's name depending on what fortran compiler is calling it. Most of these name manglings can be handled by a clever cpp functioning, but uppercasing, required by Cray and some Windows compilers, cannot (at least to my knowledge). The following basefile command handles the correct renaming of the level 3 BLAS, implemented in C, to be called from the various Fortran77 compilers:
beginproc blasdef mnam
   @multidef @(mnam)
      @whiledef pre z c d s
         @(pre)gemm @(pre)symm @(pre)syrk @(pre)syr2k @(pre)trmm @(pre)trsm
      @endwhile
      @whiledef pre z c 
         @(pre)hemm @(pre)herk @(pre)her2k
      @endwhile
   @endmultidef
@endproc

#ifdef Add_
   @callproc blasdef l3blas
   @whiledef l3blas
   #define @10l@(l3blas) @(l3blas)_
   @endwhile
#elif defined(UPCASE)
   @callproc blasdef l3blas
   @whiledef l3blas
   #define @10l@(l3blas) @up@(l3blas)
   @endwhile
#endif

Extracted, this is:


#ifdef Add_
   #define zher2k     zher2k_
   #define zherk      zherk_
   #define zhemm      zhemm_
   #define cher2k     cher2k_
   #define cherk      cherk_
   #define chemm      chemm_
   #define ztrsm      ztrsm_
   #define ztrmm      ztrmm_
   #define zsyr2k     zsyr2k_
   #define zsyrk      zsyrk_
   #define zsymm      zsymm_
   #define zgemm      zgemm_
   #define ctrsm      ctrsm_
   #define ctrmm      ctrmm_
   #define csyr2k     csyr2k_
   #define csyrk      csyrk_
   #define csymm      csymm_
   #define cgemm      cgemm_
   #define dtrsm      dtrsm_
   #define dtrmm      dtrmm_
   #define dsyr2k     dsyr2k_
   #define dsyrk      dsyrk_
   #define dsymm      dsymm_
   #define dgemm      dgemm_
   #define strsm      strsm_
   #define strmm      strmm_
   #define ssyr2k     ssyr2k_
   #define ssyrk      ssyrk_
   #define ssymm      ssymm_
   #define sgemm      sgemm_
#elif defined(UPCASE)
   #define zher2k     ZHER2K
   #define zherk      ZHERK
   #define zhemm      ZHEMM
   #define cher2k     CHER2K
   #define cherk      CHERK
   #define chemm      CHEMM
   #define ztrsm      ZTRSM
   #define ztrmm      ZTRMM
   #define zsyr2k     ZSYR2K
   #define zsyrk      ZSYRK
   #define zsymm      ZSYMM
   #define zgemm      ZGEMM
   #define ctrsm      CTRSM
   #define ctrmm      CTRMM
   #define csyr2k     CSYR2K
   #define csyrk      CSYRK
   #define csymm      CSYMM
   #define cgemm      CGEMM
   #define dtrsm      DTRSM
   #define dtrmm      DTRMM
   #define dsyr2k     DSYR2K
   #define dsyrk      DSYRK
   #define dsymm      DSYMM
   #define dgemm      DGEMM
   #define strsm      STRSM
   #define strmm      STRMM
   #define ssyr2k     SSYR2K
   #define ssyrk      SSYRK
   #define ssymm      SSYMM
   #define sgemm      SGEMM
#endif

Back to example index