intreadxls.c File Reference

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "machine.h"
#include "MALLOC.h"
#include "stack-c.h"
#include "ole.h"
#include "ripole.h"
#include "files.h"
#include "gw_fileio.h"
#include "intreadxls.h"

Include dependency graph for intreadxls.c:

Go to the source code of this file.

Functions

void GetenvB (char *name, char *env, int len)
int C2F() cluni0 (char *in_name, char *out_name, int *out_n, long int lin, long int lout)
void xls_read (int *fd, int *cur_pos, double **data, int **chainesind, int *N, int *M, int *err)
void xls_open (int *err, int *fd, char ***sst, int *ns, char ***Sheetnames, int **Abspos, int *nsheets)
int C2F() intreadxls (char *fname, long lfn)
static char * xls_basename (char *name)
int C2F() intopenxls (char *fname, long lfn)


Function Documentation

int C2F() cluni0 ( char *  in_name,
char *  out_name,
int out_n,
long int  lin,
long int  lout 
)

Definition at line 23 of file cluni0.c.

00024 {
00025   int  nc= MAX_ENV;
00026   static char SCI[MAX_ENV],HOME[MAX_ENV],TMP[MAX_ENV];
00027   static int k;
00028   
00029   if ( ( n==0 ) || (UpdateEnvVar == 1) )
00030   {
00031           GetenvB("SCI",SCI,nc);
00032           GetenvB("HOME",HOME,nc);
00033       GetenvB("TMPDIR",TMP,nc);
00034           n=n+1;
00035           UpdateEnvVar=0;
00036   }
00037   /* in_name[lin]='\0';*/
00038   if ( Cluni0(SCI,SCI_a,in_name,out_name,lin) == 0 )
00039     if ( Cluni0(HOME,HOME_a,in_name,out_name,lin) == 0 )
00040       if ( Cluni0(TMP,TMP_a,in_name,out_name,lin) == 0 ){
00041         strncpy(out_name,in_name,(size_t)lin);
00042         out_name[lin]='\0';
00043       }
00044   /*strncpy(out_name,in_name,lout); */
00045   *out_n = strlen(out_name);
00046 #if defined(_MSC_VER)
00047   for (k=0 ; k < *out_n ;k++) if ( out_name[k]=='/') out_name[k]='\\';
00048 #else
00049   for (k=0 ; k < *out_n ;k++) if ( out_name[k]=='\\') out_name[k]='/';
00050 #endif
00051 
00052 
00054   return(0);
00055 }

void GetenvB ( char *  name,
char *  env,
int  len 
)

Definition at line 61 of file cluni0.c.

References C2F, getenvc(), ierr, and last.

Referenced by BuildName(), and cluni0().

00062 {
00063   int ierr,un=1;
00064   C2F(getenvc)(&ierr,name,env,&len,&un);
00065   if( ierr == 0) 
00066     {
00067       char *last = &env[len-1];
00068       while ( *last == ' ' ) { last = '\0' ; } last--;
00069     }
00070   else 
00071     {
00072       env[0] = '\0' ;
00073     }  
00074 }

Here is the call graph for this function:

Here is the caller graph for this function:

int C2F() intopenxls ( char *  fname,
long  lfn 
)

Definition at line 101 of file intreadxls.c.

References C2F, CheckLhs, CheckRhs, cluni0(), CreateVar, CreateVarFromPtr, cstk, fd, fname, FREE, getenv(), GetRhsVar, i, ierr, int, istk, L, LhsVar, m1, mopen(), n1, NULL, OLE_OK, OLEER_INSANE_OLE_FILE, OLEER_LOADFAT_BAD_BOUNDARY, OLEER_MINIFAT_READ_FAIL, OLEER_NO_INPUT_FILE, OLEER_NOT_OLE_FILE, OLEER_PROPERTIES_READ_FAIL, putlhsvar(), res, result, Rhs, ripole(), stk, xls_basename(), and xls_open().

Referenced by C2F().

00102 {
00103 #undef IN
00104   int i,k,m1,n1,l1,l2,one=1,fd,f_swap=0;
00105   int ierr,ns,result;
00106   double res;
00107   char **sst=NULL;
00108   char **Sheetnames=NULL;
00109   int *Abspos=NULL;
00110   int nsheets;
00111   char IN[256],TMP[256];
00112   char sep[2];
00113 #ifdef _MSC_VER
00114   sep[0]='\\';
00115 #else
00116   sep[0]='/';
00117 #endif
00118   sep[1]='\0';
00119 
00120   CheckLhs(4,4);
00121   CheckRhs(1,1);
00122 
00123   /*  checking variable file */
00124   GetRhsVar(1,"c",&m1,&n1,&l1);
00125   C2F(cluni0)(cstk(l1), IN, &ns,(long int) (m1*n1),256L);
00126 
00127   strcpy(TMP,getenv("TMPDIR"));
00128   
00129   strcat(TMP,sep);
00130   strcat(TMP,xls_basename(IN));
00131   result=ripole(IN, TMP, 0, 0);
00132   if (result != OLE_OK) {
00133     if (result == OLEER_NO_INPUT_FILE)
00134       Scierror(999,"%s :There is no  file %s \r\n",fname,IN);
00135     else if(result == OLEER_NOT_OLE_FILE || 
00136             result == OLEER_INSANE_OLE_FILE || 
00137             result == OLEER_LOADFAT_BAD_BOUNDARY || 
00138             result == OLEER_MINIFAT_READ_FAIL || 
00139             result == OLEER_PROPERTIES_READ_FAIL)
00140       Scierror(999,"%s :file %s is not an ole2 file\r\n",fname,IN);
00141     else if(result == -1)
00142       Scierror(999,"%s :file %s  cannot be opened\r\n",fname,IN);
00143 
00144     return 0;
00145   }
00146   strcat(TMP,sep);
00147   strcat(TMP,"Workbook");
00148   C2F(mopen)(&fd, TMP,"rb", &f_swap, &res, &ierr);
00149   if (ierr != 0)
00150     {
00151       Scierror(999,"%s :There is no xls stream in the ole2 file %s \r\n",fname,IN);
00152       return 0;
00153     }
00154   CreateVar(Rhs+1,"i",&one,&one,&l2);
00155   *istk(l2)=fd; /* logical unit */
00156 
00157   xls_open(&ierr, &fd, &sst ,&ns, &Sheetnames, &Abspos,&nsheets);
00158   /*return *err:
00159     0 = OK
00160     1 = not an OLE file
00161     2 = no Workbook included
00162     3 = memory allocation problem
00163     4 = incorrect file
00164     5 = not a BIFF8 xls file
00165    */
00166   if (ierr == 1)
00167     {
00168       Scierror(999,"%s :Not an ole2 file \r\n",fname);
00169       return 0;
00170     }
00171   else  if (ierr == 2)
00172     {
00173       Scierror(999,"%s : the file has no Workbook directory \r\n",fname);
00174       return 0;
00175     }
00176  else  if (ierr == 3)
00177     {
00178       Scierror(999,"%s : impossible to alloc enough memory \r\n",fname);
00179       return 0;
00180     }
00181   else  if (ierr == 4)
00182     {
00183       Scierror(990,"%s : incorrect or corrupted file \r\n",fname);
00184       return 0;
00185     }
00186   else  if (ierr == 3)
00187     {
00188       Scierror(999,"%s : Only BIFF8 file format is handled \r\n",fname);
00189       return 0;
00190     }
00191 
00192   if (ns != 0) 
00193   {
00194     /* Create a typed list to return the properties */
00195     CreateVarFromPtr(Rhs+2,"S", &one, &ns, sst);
00196     for (k=0;k<ns;k++) 
00197         {
00198                 if ( (sst) && (sst[k]))
00199                 {
00200                         FREE(sst[k]);
00201                         sst[k]=NULL;
00202                 }
00203         }
00204         if (sst)
00205         {
00206                 FREE(sst);
00207                 sst=NULL;
00208         }
00209   }
00210   else
00211     CreateVar(Rhs+2,"d",&ns,&ns,&l2);
00212 
00213   if (nsheets != 0) 
00214   {
00215     /* Create a typed list to return the properties */
00216     CreateVarFromPtr(Rhs+3,"S", &one, &nsheets, Sheetnames);
00217         
00218         if (Sheetnames)
00219         {
00220                 for (k=0;k<nsheets;k++) 
00221                 {
00222                         if (Sheetnames[k])
00223                         {
00224                                 FREE(Sheetnames[k]);
00225                                 Sheetnames[k]=NULL;
00226                         }
00227                 }
00228                 FREE(Sheetnames);
00229                 Sheetnames=NULL;
00230         }
00231 
00232     
00233     
00234     CreateVar(Rhs+4,"d", &one, &nsheets, &l2);
00235     for (i=0;i<nsheets;i++) *stk(l2+i)=Abspos[i];
00236         if (Abspos)
00237         {
00238                 FREE(Abspos);
00239                 Abspos=NULL;
00240         }
00241   }
00242   else {
00243     CreateVar(Rhs+3,"d",&nsheets,&nsheets,&l2);
00244     CreateVar(Rhs+4,"d",&nsheets,&nsheets,&l2);
00245   }
00246 
00247   LhsVar(1)= Rhs+1;
00248   LhsVar(2)= Rhs+2;
00249   LhsVar(3)= Rhs+3;
00250   LhsVar(4)= Rhs+4;
00251   C2F(putlhsvar)();
00252   return 0;
00253 }

Here is the call graph for this function:

Here is the caller graph for this function:

int C2F() intreadxls ( char *  fname,
long  lfn 
)

Definition at line 28 of file intreadxls.c.

References C2F, CheckLhs, CheckRhs, CreateVar, CreateVarFromPtr, data, fd, fname, FREE, GetRhsVar, ierr, ind, int, LhsVar, M, m1, N, n1, NULL, pos, putlhsvar(), Rhs, stk, and xls_read().

Referenced by C2F().

00029 {
00030   int m1,n1,l1,zero=0,ierr;
00031   double *data=NULL;
00032   int *ind=NULL;
00033   int M,N,MN;
00034   int pos,fd;
00035 
00036   CheckLhs(2,2);
00037   CheckRhs(2,2);
00038 
00039   /*  checking variable Pos */
00040   GetRhsVar(1,"d",&m1,&n1,&l1);
00041   fd=(int)*stk(l1);
00042   GetRhsVar(2,"d",&m1,&n1,&l1);
00043   pos=(int)*stk(l1);
00044 
00045   xls_read(&fd,&pos,&data, &ind, &N, &M,  &ierr);
00046   if (ierr == 1)
00047     {
00048       Scierror(999,"%s :Not enough memory to allocate results \r\n",fname);
00049       return 0;
00050     }
00051   else if(ierr == 2)
00052     {
00053       Scierror(999,"%s :Failed to read expected data, may be invalid xls file \r\n",fname);
00054       return 0;
00055     }
00056   else if(ierr == 3)
00057     {
00058       Scierror(999,"%s :End of File \r\n",fname);
00059       return 0;
00060     }
00061 
00062   /*  sciprint("readxls %d %d %d\n",M,N,ierr);*/
00063 
00064   MN=M*N;
00065   if (MN==0)
00066     {
00067       CreateVar(Rhs+1, "d", &zero,&zero, &l1);
00068       CreateVar(Rhs+2, "d", &zero,&zero, &l1);
00069     }
00070 
00071   else
00072     {
00073       CreateVarFromPtr(Rhs+1, "d", &N,&M, &data);
00074       CreateVarFromPtr(Rhs+2, "i", &N,&M, &ind);
00075       FREE(data);
00076       FREE(ind);
00077     }
00078 
00079 
00080   LhsVar(1)= Rhs+1;
00081   LhsVar(2)= Rhs+2;
00082   C2F(putlhsvar)();
00083 
00084   return 0;
00085 }

Here is the call graph for this function:

Here is the caller graph for this function:

static char* xls_basename ( char *  name  )  [static]

Definition at line 88 of file intreadxls.c.

References base, and NULL.

Referenced by intopenxls().

00090 {
00091   char *base=NULL;
00092 #ifdef _MSC_VER
00093   base = strrchr (name, '\\');
00094 #else
00095   base = strrchr (name, '/');
00096 #endif
00097 
00098   return base ? base + 1 : name;
00099 }

Here is the caller graph for this function:

void xls_open ( int err,
int fd,
char ***  sst,
int ns,
char ***  Sheetnames,
int **  Abspos,
int nsheets 
)

Definition at line 250 of file xls.c.

References C2F, cur_pos, getBOF(), getBoundsheets(), getSST(), int, Len(), mgetnc(), mseek(), mtell(), pos, and typ_ushort.

Referenced by intopenxls().

00251 {
00252   /* if opt==1 it is supposed that the current file position is at the beginning of oleheader
00253    * if opt==0 it is supposed that the current file position is at the  beginning of workbook stream
00254    */
00255 
00256   /* we suppose that the ole file as a simple structure: 
00257    * Workbook stream should follows immediately the header 
00258    * and is strored in sequential sections 
00259    */
00260 
00261   /*return *err:
00262     0 = OK
00263     1 = not an OLE file
00264     2 = no Workbook included
00265     3 = memory allocation problem
00266     4 = incorrect file
00267     5 = not a BIFF8 xls file
00268    */
00269   /*---------------Déclaration Des Variables*--------------------*/
00270   int k,one=1; 
00271   int cur_pos, init_pos;
00272   double pos;
00273   unsigned short Opcode, Len; 
00274   /*BOF data*/
00275   int BOFData[7]; /*[BIFF  Version DataType Identifier Year HistoryFlags LowestXlsVersion]*/
00276   *nsheets=0;
00277   *err=0;
00278   /*---------------Déclaration Des Variables*--------------------*/
00279   cur_pos=0;
00280 
00281   /*  if (get_oleheader(fd)) {
00282     *err=1;
00283     return;
00284     }*/
00285   C2F(mtell) (fd, &pos, err);
00286   cur_pos=(int)pos;
00287   init_pos=cur_pos;
00288 
00289   /* first record should be a BOF */
00290   getBOF(fd ,BOFData, err);
00291   if (*err > 0) return;
00292 
00293   if (BOFData[0]<0) { /* not a BOF */
00294     *err=4;
00295     return;
00296   }
00297   if (BOFData[0] != 8) { /* not a BIFF8 */
00298     *err=5;
00299     return;
00300   }
00301 
00302   C2F(mtell) (fd, &pos, err);
00303   if (*err > 0) goto Err2;
00304   cur_pos=(int)pos;
00305 
00306   /* loops on records till an EOF is found */
00307   while(1) {
00308     C2F(mseek) (fd, &cur_pos, "set", err);
00309     if (*err > 0) goto Err2;
00310     /*Enregistrement de l'Opcode et de la Len du tag*/
00311     C2F(mgetnc) (fd, &Opcode, &one, typ_ushort, err);
00312     if (*err > 0) goto Err2;
00313     C2F(mgetnc) (fd, &Len, &one, typ_ushort, err);
00314     if (*err > 0) goto Err2;
00315 
00316     switch(Opcode) {
00317     case 10: /*EOF*/
00318       cur_pos=cur_pos+4+Len;
00319       return ;
00320     case 133: /* Boundsheets */
00321       getBoundsheets(fd,Sheetnames, Abspos,nsheets,&cur_pos,err);
00322       for (k=0;k<*nsheets;k++) (*Abspos)[k]+=init_pos;
00323       if (*err > 0) return;
00324       break;
00325     case 252: /* SST= Shared String table*/
00326       getSST(fd,Len,BOFData[0],ns,sst,err);
00327       if (*err > 0) return;
00328       cur_pos=cur_pos+4+Len;
00329       break;
00330     default:
00331       cur_pos=cur_pos+4+Len;
00332     }
00333   }
00334 
00335  Err2:
00336   *err=4; /* read problem */
00337   return;
00338 
00339 }

Here is the call graph for this function:

Here is the caller graph for this function:

void xls_read ( int fd,
int cur_pos,
double **  data,
int **  chainesind,
int N,
int M,
int err 
)

Definition at line 54 of file xls.c.

References C2F, FREE, getBOF(), i, int, Len(), MALLOC, mgetnc(), mseek(), mtell(), NULL, NumFromRk2(), pos, return_a_nan(), typ_double, typ_int, typ_short, and typ_ushort.

Referenced by intreadxls().

00055 {
00056   /*---------------Déclaration Des Variables*--------------------*/
00057   unsigned short Opcode, Len;   /*Code Operationnel et Longueur du tag a lire*/
00058   double *valeur;    /*Tableau Recapitulatif (Final) des valeurs de la feuille Excel*/
00059   double pos;
00060 
00061   int one=1;
00062   int three=3;
00063 
00064   int i;  /*Variables de boucle*/
00065   int hauteur=0, longueur=0, capacite;   /*Hauteur, longueur de la feuille,  */
00066   int taille; /*Nombre de types de caractèers a enregistrer*/
00067   char *sheetname;   /*Nom de la feuille*/
00068   int rkvalue; /*RK value*/
00069   /*for RK */
00070   unsigned short row, col, xf;/*Index to row, to column, and to XF record*/
00071   /*for MULRK */
00072   unsigned short ixfe;
00073   short colFirst,colLast,ncol;/*Index to rox, to first column (fc)*/
00074   /* for LABELSST */
00075   short labelsst1[3];
00076   int indsst;/*Index to SST record*/
00077   /* for DIMENSIONS */
00078   int f_row,l_row;
00079   unsigned short f_col, l_col, notused;
00080   /* for FORMULA */
00081   double resultat;/*Result of the formula*/
00082   short optionflag;/*Option flags*/
00083   int formula_notused; /*Not used*/
00084   double NaN=return_a_nan();
00085 
00086   int BOFData[7]; /*[BIFF  Version DataType Identifier Year HistoryFlags LowestXlsVersion]*/
00087   /* initialization of pointers corresponding to malloc's */
00088   valeur=(double *)NULL;
00089   sheetname=(char *)NULL;
00090   *chainesind= (int *) NULL;
00091   *err=0;
00092 
00093   *cur_pos=*cur_pos;
00094   C2F(mseek) (fd, cur_pos, "set", err);
00095   if (*err > 0) goto ErrL;
00096 
00097   /* first record should be a BOF */
00098   getBOF(fd ,BOFData, err);
00099 
00100   if (*err > 0) return;
00101   if (BOFData[0]<0) { /* not a BOF */
00102     *err=2;
00103     return;
00104   }
00105   if (BOFData[0] != 8) { /* not a BIFF8 */
00106     *err=3;
00107     return;
00108   }
00109 
00110   C2F(mtell) (fd, &pos, err);
00111   if (*err > 0) goto ErrL;
00112   *cur_pos=(int)pos;
00113 
00114   while(1)
00115     {
00116       C2F(mseek) (fd, cur_pos, "set", err);
00117       if (*err > 0) goto ErrL;
00118       /*Enregistrement de l'Opcode et de la Len du tag*/
00119       C2F(mgetnc) (fd, &Opcode, &one, typ_ushort, err);
00120       if (*err > 0) goto ErrL;
00121       C2F(mgetnc) (fd, &Len, &one, typ_ushort, err);
00122       if (*err > 0) goto ErrL;
00123      switch(Opcode) {
00124      case 10:/*EOF */
00125        *N=hauteur;
00126        *M=longueur;
00127        *data=valeur;
00128        *cur_pos=*cur_pos+4+Len;
00129        return;
00130      case 638: /*RK*/
00131        C2F(mgetnc) (fd, (void*)&row, &one, typ_ushort, err);
00132        if (*err > 0) goto ErrL;
00133        C2F(mgetnc) (fd, (void*)&col, &one, typ_ushort, err);
00134        if (*err > 0) goto ErrL;
00135        C2F(mgetnc) (fd, (void*)&xf , &one, typ_ushort, err);
00136        if (*err > 0) goto ErrL;
00137        C2F(mgetnc) (fd, (void*) &rkvalue , &one, typ_int, err);
00138        if (*err > 0) goto ErrL;
00139        valeur[col*(hauteur)+row]= NumFromRk2(rkvalue);
00140        break;
00141      case 515: /*Number*/
00142        C2F(mgetnc) (fd, (void*)&row, &one, typ_ushort, err);
00143        if (*err > 0) goto ErrL;
00144        C2F(mgetnc) (fd, (void*)&col, &one, typ_ushort, err);
00145        if (*err > 0) goto ErrL;
00146        C2F(mgetnc) (fd, (void*)&xf , &one, typ_ushort, err);
00147        if (*err > 0) goto ErrL;
00148        C2F(mgetnc) (fd, (void*) &resultat , &one, typ_double, err);
00149        if (*err > 0) goto ErrL;
00150        valeur[col*(hauteur)+row]=resultat ;
00151        break;
00152 
00153      case 189: /*MULRK*/
00154        C2F(mgetnc) (fd, (void*)&row, &one, typ_ushort, err);
00155        if (*err > 0) goto ErrL;
00156        C2F(mgetnc) (fd,  (void*)&colFirst, &one, typ_short, err);
00157        if (*err > 0) goto ErrL;
00158        /*List of nc=lc-fc+1  XF/RK structures*/
00159        ncol=(Len-6)/6;  
00160        for (i=0;i<ncol;i++) {
00161          C2F(mgetnc) (fd, (void*) &ixfe, &one, typ_short, err);
00162          if (*err > 0) goto ErrL;
00163          C2F(mgetnc) (fd, (void*) &rkvalue, &one, typ_int, err);
00164          if (*err > 0) goto ErrL;
00165          valeur[row+(colFirst+i)*hauteur]=NumFromRk2(rkvalue);
00166        }
00167 
00168        /*Index of last column*/
00169        C2F(mgetnc) (fd, (void*) &colLast, &one, typ_ushort, err);
00170        if (*err > 0) goto ErrL;
00171        break;
00172 
00173      case 253:/*LABELSST*/
00174        C2F(mgetnc) (fd, (void*) labelsst1, &three, typ_short, err);
00175        if (*err > 0) goto ErrL;
00176        C2F(mgetnc) (fd, (void*) &indsst , &one, typ_int, err);
00177        if (*err > 0) goto ErrL;
00178        /*Allocation dans le tableau final*/
00179        (*chainesind)[(labelsst1[1])*(hauteur)+labelsst1[0]]=indsst+1;
00180        break;
00181      case 512:/* DIMENSIONS*/
00182        C2F(mgetnc) (fd, (void*) &f_row, &one, typ_int, err);
00183        if (*err > 0) goto ErrL;
00184        C2F(mgetnc) (fd, (void*) &l_row, &one, typ_int, err);
00185        if (*err > 0) goto ErrL;
00186        C2F(mgetnc) (fd, (void*) &f_col, &one, typ_ushort, err);
00187        if (*err > 0) goto ErrL;
00188        C2F(mgetnc) (fd, (void*) &l_col, &one, typ_ushort, err);
00189        if (*err > 0) goto ErrL;
00190        C2F(mgetnc) (fd, (void*) &notused, &one, typ_ushort, err);
00191        if (*err > 0) goto ErrL;
00192         
00193        /*Calcul de longueur, hauteur et capacite dela feuille*/
00194        hauteur=l_row;/*-f_row;*/
00195        longueur=l_col;/*-f_col;*/
00196        capacite=hauteur*longueur;
00197         
00198        /*Déclaration des tableaux de synthèse*/
00199        if ((valeur=(void*) MALLOC((capacite+1)*sizeof(double)))==NULL)  goto ErrL;
00200        if ((*chainesind=(int *) MALLOC((capacite+1)*sizeof(int)))==NULL)  goto ErrL;
00201        for (i=0;i<=capacite;i++) {
00202          (*chainesind)[i]=0;
00203          valeur[i]=NaN;
00204        }
00205        break;
00206      case 6:/* FORMULA*/
00207        C2F(mgetnc) (fd, (void*) &row, &one, typ_ushort, err);
00208        if (*err > 0) goto ErrL;
00209        C2F(mgetnc) (fd, (void*) &col, &one, typ_ushort, err);
00210        if (*err > 0) goto ErrL;
00211        C2F(mgetnc) (fd, (void*) &xf, &one, typ_ushort, err);
00212        if (*err > 0) goto ErrL;
00213         
00214        C2F(mgetnc) (fd, (void*) &resultat, &one, typ_double, err);
00215        if (*err > 0) goto ErrL;
00216 
00217        valeur[(col*hauteur+row)]=resultat;
00218 
00219        C2F(mgetnc) (fd, (void*)&optionflag, &one, typ_short, err);
00220        if (*err > 0) goto ErrL;
00221         
00222        C2F(mgetnc) (fd, (void*) &formula_notused, &one, typ_int, err);
00223        if (*err > 0) goto ErrL;
00224         
00225        /*Formuled data*/
00226        taille=Len-2-2-2-8-2-4;
00227        /*char formuladata[taille];
00228          C2F(mgetnc) (fd, (void*) formuladata, &taille, typ_char, err);
00229          if (*err > 0) goto ErrL;*/
00230 
00231        break;           
00232      }
00233      *cur_pos=*cur_pos+4+Len;
00234     }
00235   return;
00236  ErrL:
00237   {
00238     FREE(sheetname);
00239     FREE(valeur);
00240     FREE(*chainesind);
00241     if (*err==0)
00242       *err=1; /* malloc problem */
00243     else
00244       *err=2; /* read problem */
00245     return;
00246   }
00247 }

Here is the call graph for this function:

Here is the caller graph for this function:


Generated on Sun Mar 4 15:18:34 2007 for Scilab [trunk] by  doxygen 1.5.1