#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) |
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:

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:

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.
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*) ¬used, &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:

1.5.1