cernlib.c

Go to the documentation of this file.
00001 //------------------------------------------------------------------------------
00002 //
00003 // This file contains the kernlib's package subset needed to build h2root.
00004 // It cannot be used by any kernlib application because many kernlib
00005 // functionalities * are missing.
00006 //
00007 //------------------------------------------------------------------------------
00008 
00009 #ifdef WIN32
00010 
00011 #include <io.h>
00012 typedef long off_t;
00013 
00014 #define cfclos_   __stdcall CFCLOS
00015 #define cfget_    __stdcall CFGET
00016 #define cfseek_   __stdcall CFSEEK
00017 #define ishftr_   __stdcall ISHFTR
00018 #define lshift_   __stdcall LSHIFT
00019 #define vxinvb_   __stdcall VXINVB
00020 #define vxinvc_   __stdcall VXINVC
00021 #define cfopei_   __stdcall CFOPEI
00022 #define cfstati_  __stdcall CFSTATI
00023 #define lnblnk_   __stdcall LNBLNK
00024 
00025 #else
00026 #include <unistd.h>
00027 #endif
00028 
00029 #include <stdio.h>
00030 #include <stdlib.h>
00031 #include <fcntl.h>
00032 #include <sys/types.h>
00033 #include <sys/stat.h>
00034 
00035 
00036 char *fchtak(char *ftext, int lgtext)
00037 {
00038       char *ptalc, *ptuse;
00039       char *utext;
00040       int  nalc;
00041       int  ntx, jcol;
00042 
00043       nalc  = lgtext + 8;
00044       ptalc = malloc (nalc);
00045       if (ptalc == NULL)     goto exit;
00046       utext = ftext;
00047 
00048       ptuse = ptalc;
00049       ntx   = lgtext;
00050       for (jcol = 0; jcol < ntx; jcol++)  *ptuse++ = *utext++;
00051 
00052       *ptuse = '\0';
00053 exit: return  ptalc;
00054 }
00055 
00056 //------------------------------------------------------------------------------
00057 
00058 unsigned int ishftr_(unsigned int *arg, int *len)
00059 {
00060    return(*arg >> *len);
00061 }
00062 
00063 //------------------------------------------------------------------------------
00064 
00065 unsigned int lshift_(unsigned int *arg, int *len)
00066 {
00067    return(*arg << *len);
00068 }
00069 
00070 //------------------------------------------------------------------------------
00071 
00072 void vxinvb_(int *ixv, int *n)
00073 {
00074    int limit, jloop;
00075    int in;
00076    limit = *n;
00077    for (jloop = 0; jloop < limit; jloop++) { 
00078       in = ixv[jloop];
00079       ixv[jloop] =
00080             ((in >> 24) & 0x000000ff) |
00081             ((in >> 8) & 0x0000ff00) |
00082             ((in << 8) & 0x00ff0000) |
00083             ((in << 24) & 0xff000000);
00084    }
00085    return;
00086 }
00087 
00088 //------------------------------------------------------------------------------
00089 
00090 void vxinvc_ (int *iv, int *ixv, int *n)
00091 {
00092    int limit, jloop;
00093    int in;
00094    limit = *n;
00095    for (jloop = 0; jloop < limit; jloop++) {
00096       in = iv[jloop];
00097       ixv[jloop] =
00098       ((in >> 24) & 0x000000ff) |
00099       ((in >> 8) & 0x0000ff00) |
00100       ((in << 8) & 0x00ff0000) | ((in << 24) & 0xff000000);
00101    }
00102    return;
00103 }
00104 
00105 //------------------------------------------------------------------------------
00106 
00107 void cfget_(int *lundes, int *medium, int *nwrec, int *nwtak, char *mbuf, 
00108             int *astat)
00109 {
00110    int fildes;   
00111    int nbdn, nbdo;   
00112 
00113    if (medium) { }
00114 
00115    *astat = 0;   
00116    if (*nwtak <= 0) return;   
00117                      
00118    fildes = *lundes;   
00119    nbdo = *nwrec * 4;   
00120    nbdn = read (fildes, mbuf, nbdo);   
00121    if (nbdn == 0) goto heof;   
00122    if (nbdn < 0) goto herror;   
00123    *nwtak = (nbdn - 1) / 4 + 1;
00124    return;   
00125    heof:
00126       *astat = -1;
00127       return;
00128    herror:
00129       *astat = 0;
00130       printf ("error in CFGET\n");
00131       return;
00132 }
00133 
00134 //------------------------------------------------------------------------------
00135 
00136 void cfseek_(int *lundes, int *medium, int *nwrec, int *jcrec, int *astat)
00137 {
00138    int fildes;
00139    int nbdo;
00140    int isw;
00141 
00142    if (medium) { }
00143 
00144    fildes = *lundes;
00145    nbdo = *jcrec * *nwrec * 4;
00146    isw = lseek (fildes, nbdo, 0); 
00147    if (isw < 0) goto trouble;
00148    *astat = 0;
00149    return;
00150 
00151    trouble: 
00152       *astat = -1;
00153       printf("error in CFSEEK\n");  
00154 }
00155 
00156 //------------------------------------------------------------------------------
00157 
00158 void cfclos_(int *lundes, int *medium)
00159 {
00160    int fildes;
00161    if (medium) { }
00162    fildes = *lundes;
00163    close (fildes);
00164    return;
00165 }
00166 
00167 //------------------------------------------------------------------------------
00168 #ifdef WIN32
00169 int cfstati_(char *fname, int lfname, int *info, int *lgname)
00170 #else
00171 int cfstati_(char *fname, int *info, int *lgname)
00172 #endif
00173 {
00174    struct stat buf;
00175    char *ptname, *fchtak();
00176    int istat=-1, stat();
00177    ptname = fchtak(fname,*lgname);
00178    if (ptname == ((void *)0)) return -1;
00179    istat = stat(ptname, &buf);
00180    if (!istat) {
00181       info[0] = (int) buf.st_dev;
00182       info[1] = (int) buf.st_ino;
00183       info[2] = (int) buf.st_mode;
00184       info[3] = (int) buf.st_nlink;
00185       info[4] = (int) buf.st_uid;
00186       info[5] = (int) buf.st_gid;
00187       info[6] = (int) buf.st_size;
00188 #if defined(__APPLE__) || defined(__FreeBSD__)
00189       info[7] = (int) buf.st_atimespec.tv_sec;
00190       info[8] = (int) buf.st_mtimespec.tv_sec;
00191       info[9] = (int) buf.st_ctimespec.tv_sec;
00192       info[10] = (int) buf.st_blksize;
00193       info[11] = (int) buf.st_blocks;
00194 #elif defined(WIN32)
00195       info[7] = 0;
00196       info[8] = 0;
00197       info[9] = 0;
00198       info[10] = 0;
00199       info[11] = 0;
00200 #else
00201       info[7] = (int) buf.st_atim.tv_sec;
00202       info[8] = (int) buf.st_mtim.tv_sec;
00203       info[9] = (int) buf.st_ctim.tv_sec;
00204       info[10] = (int) buf.st_blksize;
00205       info[11] = (int) buf.st_blocks;
00206 #endif
00207    };
00208    free(ptname);
00209    return istat;
00210 }
00211 
00212 //------------------------------------------------------------------------------
00213 
00214 int cfopen_perm = 0;
00215 #ifdef WIN32
00216 void cfopei_(int *lundes, int *medium, int *nwrec, int *mode, int *nbuf,
00217              char *ftext, int lftext, int *astat, int *lgtx)
00218 #else
00219 void cfopei_(int *lundes, int *medium, int *nwrec, int *mode, int *nbuf,
00220              char *ftext, int *astat, int *lgtx)
00221 #endif
00222 {
00223    char *pttext, *fchtak();
00224    int flags = 0;
00225    int fildes;
00226    int perm;
00227    if (nwrec || nbuf) { }
00228    *lundes = 0;
00229    *astat = -1;
00230    perm = cfopen_perm;
00231    cfopen_perm = 0;
00232    if (*medium == 1) goto fltp;
00233    if (*medium == 3) goto fltp;
00234    if (mode[0] == 0)
00235    {if (mode[1] == 0)
00236    flags = 00;
00237    else
00238    flags = 02;}
00239    else if (mode[0] == 1)
00240    {if (mode[1] == 0)
00241    flags = 01 | 0100 | 01000;
00242    else
00243    flags = 02 | 0100 | 01000;}
00244    else if (mode[0] == 2)
00245    {if (mode[1] == 0)
00246    flags = 01 | 0100 | 02000;
00247    else
00248    flags = 02 | 0100 | 02000;}
00249    goto act;
00250 fltp:
00251    if (mode[0] == 0)
00252    {if (mode[1] == 0)
00253    flags = 00;
00254    else
00255    flags = 02;}
00256    else if (mode[0] == 1)
00257    {if (mode[1] == 0)
00258    flags = 01;
00259    else
00260    flags = 02;}
00261    else if (mode[0] == 2) return;
00262 act: 
00263    pttext = fchtak(ftext,*lgtx);
00264    if (pttext == 0) return;
00265    if (perm == 0) perm = 0644;
00266    fildes = open (pttext, flags, perm);
00267    if (fildes < 0) goto errm;
00268    *lundes = fildes;
00269    *astat = 0;
00270    goto done;
00271 errm: 
00272    *astat = 0;
00273    printf("error in CFOPEN\n");
00274 done: 
00275    free(pttext);
00276    return;
00277 }
00278 
00279 //------------------------------------------------------------------------------
00280 
00281 int lnblnk_ (char *chline, int len)
00282 {
00283    char  *chcur;
00284    chcur = chline + len;
00285    while (chcur > chline) { if (*--chcur != ' ') goto exit; }
00286    return 0;
00287    exit: return chcur+1 - chline;
00288 }
00289 
00290 //------------------------------------------------------------------------------
00291 

Generated on Tue Jul 5 14:44:00 2011 for ROOT_528-00b_version by  doxygen 1.5.1