File:  [Local Repository] / rleda / rleda.c
Revision 1.4: download - view: text, annotated - select for diffs
Mon Feb 14 12:15:06 2005 UTC (19 years, 4 months ago) by brouard
Branches: MAIN
CVS tags: HEAD
Garde une variable intitulée numero qui relit les niveaux 2 et 3, tant
en SAS qu'en STATA.

    1: /* $Id: rleda.c,v 1.4 2005/02/14 12:15:06 brouard Exp $
    2:   $State: Exp $
    3:   $Log: rleda.c,v $
    4:   Revision 1.4  2005/02/14 12:15:06  brouard
    5:   Garde une variable intitulée numero qui relit les niveaux 2 et 3, tant
    6:   en SAS qu'en STATA.
    7: 
    8:   Revision 1.3  2005/02/08 17:10:08  brouard
    9:   Lit le fichier index deux fois pour n'avoir qu'un passage en SAS.
   10:   AJoute le proc contents des fichiers créés en fin de run;
   11: 
   12:   Revision 1.2  2003/12/12 19:08:17  brouard
   13:   Les variables ne sont plus toutes écrites en ligne mais avec un retour
   14:   à la ligne toutes les 5 variables.
   15: 
   16:   Revision 1.1.1.1  2003/12/12 18:53:44  brouard
   17:   Import de rleda
   18: 
   19: 
   20:  rleda.c
   21:  Programme pour lire une fichier d'index de LEDA qui a t  converti de l'EBCDIC vers l'ascii
   22:  Nicolas Brouard (Institut national d'tudes d mographiques)
   23:  Usage : rleda nom_d_index 
   24:  Il y a plusieurs sorties, un log (pour le debug) un .txt pour le format et
   25:  un .sas pour le sas.
   26:  Je me suis inspir de la version sas d'Andr  Wielki (INED).
   27:  Mardi 25 novembre 2003
   28: */
   29: #include <stdio.h>
   30: #include <string.h>
   31: #include <unistd.h>
   32: 
   33: #define MAXLINE 300
   34: #define FILENAMELENGTH 300
   35: #define FILENAMEEXTLEN 10
   36: #define	GLOCK_ERROR_NOPATH		-1	/* empty path */
   37: #define	GLOCK_ERROR_GETCWD		-2	/* cannot get cwd */
   38: 
   39: #ifdef unix
   40: #define DIRSEPARATOR '/'
   41: #define ODIRSEPARATOR '\\'
   42: #else
   43: #define DIRSEPARATOR '\\'
   44: #define ODIRSEPARATOR '/'
   45: #endif
   46: 
   47: char version[]="rleda-0.9.5 Programme de lecture de fichiers d'index au format LEDA convertis de l'EBCDIC en ASCII ";
   48: char fullversion[]="$Revision: 1.4 $ $Date: 2005/02/14 12:15:06 $"; 
   49: char line[MAXLINE];
   50: char title[MAXLINE],namevar[MAXLINE], namevara[MAXLINE];
   51: 
   52: char fileres[FILENAMELENGTH], filereso[FILENAMELENGTH];
   53: char filesas[FILENAMELENGTH]; /* SAS  file */
   54: char filestata[FILENAMELENGTH]; /* STATA  file */
   55: char filestatal[10][FILENAMELENGTH]; /* STATA dictionary  files */
   56: char filelog[FILENAMELENGTH]; /* Log file */
   57: 
   58: FILE *ficlog, *ficres, *ficdat, *ficreso, *ficsas, *ficstata, *ficstatal[10];
   59: 
   60: 
   61: static unsigned char const ascii_to_ebcdic[] =
   62: {
   63:   '\000', '\001', '\002', '\003', '\067', '\055', '\056', '\057',
   64:   '\026', '\005', '\045', '\013', '\014', '\015', '\016', '\017',
   65:   '\020', '\021', '\022', '\023', '\074', '\075', '\062', '\046',
   66:   '\030', '\031', '\077', '\047', '\034', '\035', '\036', '\037',
   67:   '\100', '\117', '\177', '\173', '\133', '\154', '\120', '\175',
   68:   '\115', '\135', '\134', '\116', '\153', '\140', '\113', '\141',
   69:   '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
   70:   '\370', '\371', '\172', '\136', '\114', '\176', '\156', '\157',
   71:   '\174', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
   72:   '\310', '\311', '\321', '\322', '\323', '\324', '\325', '\326',
   73:   '\327', '\330', '\331', '\342', '\343', '\344', '\345', '\346',
   74:   '\347', '\350', '\351', '\112', '\340', '\132', '\137', '\155',
   75:   '\171', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
   76:   '\210', '\211', '\221', '\222', '\223', '\224', '\225', '\226',
   77:   '\227', '\230', '\231', '\242', '\243', '\244', '\245', '\246',
   78:   '\247', '\250', '\251', '\300', '\152', '\320', '\241', '\007',
   79:   '\040', '\041', '\042', '\043', '\044', '\025', '\006', '\027',
   80:   '\050', '\051', '\052', '\053', '\054', '\011', '\012', '\033',
   81:   '\060', '\061', '\032', '\063', '\064', '\065', '\066', '\010',
   82:   '\070', '\071', '\072', '\073', '\004', '\024', '\076', '\341',
   83:   '\101', '\102', '\103', '\104', '\105', '\106', '\107', '\110',
   84:   '\111', '\121', '\122', '\123', '\124', '\125', '\126', '\127',
   85:   '\130', '\131', '\142', '\143', '\144', '\145', '\146', '\147',
   86:   '\150', '\151', '\160', '\161', '\162', '\163', '\164', '\165',
   87:   '\166', '\167', '\170', '\200', '\212', '\213', '\214', '\215',
   88:   '\216', '\217', '\220', '\232', '\233', '\234', '\235', '\236',
   89:   '\237', '\240', '\252', '\253', '\254', '\255', '\256', '\257',
   90:   '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
   91:   '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
   92:   '\312', '\313', '\314', '\315', '\316', '\317', '\332', '\333',
   93:   '\334', '\335', '\336', '\337', '\352', '\353', '\354', '\355',
   94:   '\356', '\357', '\372', '\373', '\374', '\375', '\376', '\377'
   95: };
   96: 
   97: static unsigned char const ascii_to_ibm[] =
   98: {
   99:   '\000', '\001', '\002', '\003', '\067', '\055', '\056', '\057',
  100:   '\026', '\005', '\045', '\013', '\014', '\015', '\016', '\017',
  101:   '\020', '\021', '\022', '\023', '\074', '\075', '\062', '\046',
  102:   '\030', '\031', '\077', '\047', '\034', '\035', '\036', '\037',
  103:   '\100', '\132', '\177', '\173', '\133', '\154', '\120', '\175',
  104:   '\115', '\135', '\134', '\116', '\153', '\140', '\113', '\141',
  105:   '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
  106:   '\370', '\371', '\172', '\136', '\114', '\176', '\156', '\157',
  107:   '\174', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
  108:   '\310', '\311', '\321', '\322', '\323', '\324', '\325', '\326',
  109:   '\327', '\330', '\331', '\342', '\343', '\344', '\345', '\346',
  110:   '\347', '\350', '\351', '\255', '\340', '\275', '\137', '\155',
  111:   '\171', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
  112:   '\210', '\211', '\221', '\222', '\223', '\224', '\225', '\226',
  113:   '\227', '\230', '\231', '\242', '\243', '\244', '\245', '\246',
  114:   '\247', '\250', '\251', '\300', '\117', '\320', '\241', '\007',
  115:   '\040', '\041', '\042', '\043', '\044', '\025', '\006', '\027',
  116:   '\050', '\051', '\052', '\053', '\054', '\011', '\012', '\033',
  117:   '\060', '\061', '\032', '\063', '\064', '\065', '\066', '\010',
  118:   '\070', '\071', '\072', '\073', '\004', '\024', '\076', '\341',
  119:   '\101', '\102', '\103', '\104', '\105', '\106', '\107', '\110',
  120:   '\111', '\121', '\122', '\123', '\124', '\125', '\126', '\127',
  121:   '\130', '\131', '\142', '\143', '\144', '\145', '\146', '\147',
  122:   '\150', '\151', '\160', '\161', '\162', '\163', '\164', '\165',
  123:   '\166', '\167', '\170', '\200', '\212', '\213', '\214', '\215',
  124:   '\216', '\217', '\220', '\232', '\233', '\234', '\235', '\236',
  125:   '\237', '\240', '\252', '\253', '\254', '\255', '\256', '\257',
  126:   '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
  127:   '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
  128:   '\312', '\313', '\314', '\315', '\316', '\317', '\332', '\333',
  129:   '\334', '\335', '\336', '\337', '\352', '\353', '\354', '\355',
  130:   '\356', '\357', '\372', '\373', '\374', '\375', '\376', '\377'
  131: };
  132: 
  133: static unsigned char const ebcdic_to_ascii[] =
  134: {
  135:   '\000', '\001', '\002', '\003', '\234', '\011', '\206', '\177',
  136:   '\227', '\215', '\216', '\013', '\014', '\015', '\016', '\017',
  137:   '\020', '\021', '\022', '\023', '\235', '\205', '\010', '\207',
  138:   '\030', '\031', '\222', '\217', '\034', '\035', '\036', '\037',
  139:   '\200', '\201', '\202', '\203', '\204', '\012', '\027', '\033',
  140:   '\210', '\211', '\212', '\213', '\214', '\005', '\006', '\007',
  141:   '\220', '\221', '\026', '\223', '\224', '\225', '\226', '\004',
  142:   '\230', '\231', '\232', '\233', '\024', '\025', '\236', '\032',
  143:   '\040', '\240', '\241', '\242', '\243', '\244', '\245', '\246',
  144:   '\247', '\250', '\133', '\056', '\074', '\050', '\053', '\041',
  145:   '\046', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
  146:   '\260', '\261', '\135', '\044', '\052', '\051', '\073', '\136',
  147:   '\055', '\057', '\262', '\263', '\264', '\265', '\266', '\267',
  148:   '\270', '\271', '\174', '\054', '\045', '\137', '\076', '\077',
  149:   '\272', '\273', '\274', '\275', '\276', '\277', '\300', '\301',
  150:   '\302', '\140', '\072', '\043', '\100', '\047', '\075', '\042',
  151:   '\303', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
  152:   '\150', '\151', '\304', '\305', '\306', '\307', '\310', '\311',
  153:   '\312', '\152', '\153', '\154', '\155', '\156', '\157', '\160',
  154:   '\161', '\162', '\313', '\314', '\315', '\316', '\317', '\320',
  155:   '\321', '\176', '\163', '\164', '\165', '\166', '\167', '\170',
  156:   '\171', '\172', '\322', '\323', '\324', '\325', '\326', '\327',
  157:   '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
  158:   '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
  159:   '\173', '\101', '\102', '\103', '\104', '\105', '\106', '\107',
  160:   '\110', '\111', '\350', '\351', '\352', '\353', '\354', '\355',
  161:   '\175', '\112', '\113', '\114', '\115', '\116', '\117', '\120',
  162:   '\121', '\122', '\356', '\357', '\360', '\361', '\362', '\363',
  163:   '\134', '\237', '\123', '\124', '\125', '\126', '\127', '\130',
  164:   '\131', '\132', '\364', '\365', '\366', '\367', '\370', '\371',
  165:   '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
  166:   '\070', '\071', '\372', '\373', '\374', '\375', '\376', '\377'
  167: };
  168: 
  169: /**************** split *************************/
  170: static	int split( char *path, char *dirc, char *name, char *ext, char *finame )
  171: {
  172:   char	*ss;				/* pointer */
  173:   int	l1, l2;				/* length counters */
  174: 
  175:   l1 = strlen(path );			/* length of path */
  176:   if ( l1 == 0 ) return( GLOCK_ERROR_NOPATH );
  177:   ss= strrchr( path, DIRSEPARATOR );		/* find last / */
  178:   if ( ss == NULL ) {			/* no directory, so use current */
  179:     /*if(strrchr(path, ODIRSEPARATOR )==NULL)
  180:       printf("Warning you should use %s as a separator\n",DIRSEPARATOR);*/
  181:     /* get current working directory */
  182:     /*    extern  char* getcwd ( char *buf , int len);*/
  183:     if ( getcwd( dirc, FILENAME_MAX ) == NULL ) {
  184:       return( GLOCK_ERROR_GETCWD );
  185:     }
  186:     strcpy( name, path );		/* we've got it */
  187:   } else {				/* strip direcotry from path */
  188:     ss++;				/* after this, the filename */
  189:     l2 = strlen( ss );			/* length of filename */
  190:     if ( l2 == 0 ) return( GLOCK_ERROR_NOPATH );
  191:     strcpy( name, ss );		/* save file name */
  192:     strncpy( dirc, path, l1 - l2 );	/* now the directory */
  193:     dirc[l1-l2] = 0;			/* add zero */
  194:   }
  195:   l1 = strlen( dirc );			/* length of directory */
  196:   /*#ifdef windows
  197:   if ( dirc[l1-1] != '\\' ) { dirc[l1] = '\\'; dirc[l1+1] = 0; }
  198: #else
  199:   if ( dirc[l1-1] != '/' ) { dirc[l1] = '/'; dirc[l1+1] = 0; }
  200: #endif
  201:   */
  202:   l1= strlen( name);
  203:   ss = strrchr( name, '.' );		/* find last / */
  204:   if (ss != '\0'){
  205:     ss++;
  206:     strcpy(ext,ss);			/* save extension */
  207:     l2= strlen(ss)+1;
  208:   }else{
  209:     ext[0]='\0';
  210:     l2 = 0;
  211:   }
  212:   strncpy( finame, name, l1-l2);
  213:   finame[l1-l2]= 0;
  214:   return( 0 );				/* we're done */
  215: }
  216: 
  217: void trzb(char *z, char *in)
  218: {
  219:   /* Enlve les blancs en fin de cha ne et le caractre 0 qui se trouve
  220:      au d but s'il y est */
  221:   int i=0, j=0, k=0;
  222:   int n;
  223: 
  224:   n =strlen(in);
  225: /*   for(i=n;(i>=0) || (in[i]==' ');i--){ */
  226: /*     printf ("i=%d in[i]=%s\n",i,in[i]); */
  227: /*   } */
  228:   k=0;
  229:   if(in[0]== '0')
  230:     k=1;
  231:   for(j=k; j<=n;j++){
  232:     if(in[j]==' '){
  233:       z[j-k]='\0';
  234:       break;
  235:     }
  236:     else
  237:       z[j-k]=in[j];
  238:   }
  239:   z[j-k]='\0';
  240: }
  241: 
  242: main(int argc, char *argv[])
  243: {
  244:   int numlinepar=0, ilect=0, firstpass=0, idic[10]={0,0,0,0,0,0,0,0,0,0};
  245:   long nobs=0, ncar=0,ncara=0, ncartes=0, nn=0, nvaris=0;
  246:   long c;
  247:   long d;
  248:   long numlis, ntype;
  249:   long n, pos;
  250:   int level, olevel, levelmax;
  251:   char scar;
  252:   char s;
  253:   char var1[4][10], varn[4][10]; 
  254: 
  255:   char pathtot[MAXLINE], path[MAXLINE], indexfile[FILENAMELENGTH], indexfilext[FILENAMEEXTLEN];
  256:   char indexfilefiname[FILENAMELENGTH];
  257: 
  258:   numlinepar=0;
  259:   if(argc <=1){
  260:     printf("\nEntrez le nom du fichier index binaire (dtrirdex) : ");
  261:     scanf("%s",pathtot);
  262:   }
  263:   else{
  264:     strcpy(pathtot,argv[1]);
  265:   }
  266:   split(pathtot,path,indexfile,indexfilext,indexfilefiname);
  267:   printf("pathtot=%s,\npath=%s,\nindexfile=%s \nindexfilext=%s \nindexfilefiname=%s\n",pathtot,path,indexfile,indexfilext,indexfilefiname);
  268:   chdir(path);
  269: 
  270: 
  271:   /* Log file */
  272:   strcat(filelog, indexfilefiname);
  273:   strcat(filelog,".log");    /* */
  274:   if((ficlog=fopen(filelog,"w"))==NULL)    {
  275:     printf("Problem with logfile %s\n",filelog);
  276:     goto end;
  277:   }
  278:   fprintf(ficlog,"Log filename:%s\n",filelog);
  279:   fprintf(ficlog,"\n%s\n%s",version,fullversion);
  280:   fprintf(ficlog,"\nEntrez le nom du fichier d'index: ");
  281:   fprintf(ficlog,"pathtot=%s\n\
  282:  path=%s \n\
  283:  indexfile=%s\n\
  284:  indexfilext=%s\n\
  285:  indexfilefiname=%s\n",pathtot,path,indexfile,indexfilext,indexfilefiname);
  286:   fflush(ficlog);
  287: 
  288: 
  289: 
  290:   strcpy(filereso,"o");
  291:   strcat(filereso,indexfilefiname);
  292:   strcat(filereso,".txt");
  293:   if((ficreso=fopen(filereso,"w"))==NULL) { /* opened on subdirectory */
  294:     printf("Problem with Output resultfile: %s\n", filereso);
  295:     fprintf(ficlog,"Problem with Output resultfile: %s\n", filereso);
  296:     fflush(ficlog);
  297:     goto end;
  298:   }
  299:   fprintf(ficreso,"Log filename:%s\n",filelog);
  300:   fprintf(ficreso,"\n%s\n%s",version,fullversion);
  301:   fprintf(ficreso,"\nEntrez le nom du fichier d'index: ");
  302:   fprintf(ficreso,"pathtot=%s\n\
  303:  path=%s \n\
  304:  indexfile=%s\n\
  305:  indexfilext=%s\n\
  306:  indexfilefiname=%s\n",pathtot,path,indexfile,indexfilext,indexfilefiname);
  307:   fflush(ficreso);
  308: 
  309:   strcpy(filesas,"s");
  310:   strcat(filesas,indexfilefiname);
  311:   strcat(filesas,".sas");
  312: 
  313:   strcpy(filestata,"s");
  314:   strcat(filestata,indexfilefiname);
  315:   strcat(filestata,".do");
  316:   printf("Le nom du fichier de sortie est %s\n",filereso);
  317:   printf("Le nom du fichier SAS de sortie est %s\n",filesas);
  318:   printf("Le nom du fichier STATA de sortie est %s\n",filestata);
  319: 
  320:   for(ilect=1;ilect<=2;ilect++){
  321:     pos=9;nvaris=0 ; 
  322:     level=0;
  323:     printf("Lecture du fichier d index pour la %d fois\n",ilect);
  324:     if((ficdat=fopen(indexfile,"rb"))==NULL)    {
  325:       printf("Problem with binary file %s\n",indexfile);
  326:       fprintf(ficlog,"Problem with binary file %s\n",indexfile);
  327:       fflush(ficlog);
  328:       goto end;
  329:     }
  330:     if(ilect==2){
  331:       if((ficsas=fopen(filesas,"w"))==NULL) { /* opened on subdirectory */
  332: 	printf("Problem with Output SAS file: %s\n", filesas);
  333: 	fprintf(ficlog,"Problem with Output SAS file: %s\n", filesas);
  334: 	fflush(ficlog);
  335: 	goto end;
  336:       }
  337:       fprintf(ficsas,"*Sortie de rleda version %s *;\n* %s *;\n",version,fullversion);
  338:       fprintf(ficsas,"libname %s \"%s\";\n",indexfilefiname,path);
  339:       fprintf(ficsas,"filename a \"%s.dat\";\n",indexfilefiname );
  340:       fprintf(ficsas,"* Ci dessous a modifier eventuellement *;\n");
  341:       fprintf(ficsas,"data %s.%s0 (keep=ID)\n",indexfilefiname,indexfilefiname);
  342: 	fprintf(ficsas,"     %s.%s%d (keep=%s--%s)\n",indexfilefiname,indexfilefiname,1,var1[1],varn[1]);
  343: 	idic[1]=0;
  344:       for(level=2; level <=levelmax; level++){
  345: 	fprintf(ficsas,"     %s.%s%d (keep=numero %s--%s)\n",indexfilefiname,indexfilefiname,level,var1[level],varn[level]);
  346: 	idic[level]=0;
  347:       }
  348:       fprintf(ficsas,"     ;\n");
  349:       fprintf(ficsas,"  infile a lrecl=500 ;\n");
  350:       fprintf(ficsas,"  input id 1. @; retain numero 0; \n");
  351:       fprintf(ficsas,"");
  352:       fprintf(ficsas,"");
  353:       if((ficstata=fopen(filestata,"w"))==NULL) { /* opened on subdirectory */
  354: 	printf("Problem with Output Stata file: %s\n", filestata);
  355: 	fprintf(ficlog,"Problem with Output Stata: %s\n", filestata);
  356: 	fflush(ficlog);
  357: 	goto end;
  358:       }
  359:       fprintf(ficstata,"*Sortie de rleda version %s *;\n* %s *;\n",version,fullversion);
  360:       fprintf(ficstata,"*repertoire %s \"%s\";\n",indexfilefiname,path);
  361:       fprintf(ficstata,"* Ci dessous a modifier eventuellement *;\n");
  362:       fprintf(ficstata,"* data %s.%s0 (keep=ID)\n",indexfilefiname,indexfilefiname);
  363:       for(level=1; level <=levelmax; level++){
  364: 	fprintf(ficstata,"*     %s.%s%d (keep=%s--%s)\n",indexfilefiname,indexfilefiname,level,var1[level],varn[level]);
  365:       }
  366:       fprintf(ficstata,"*     ;\n");
  367:     }
  368:     while((c=getc(ficdat)) != EOF){  
  369:       ungetc(c,ficdat); 
  370:       ntype=0;for(n=0;n<2;n++){ c=getc(ficdat); ntype+=(n+(1-n)*256)*ascii_to_ebcdic[c];} 
  371:       fprintf(ficlog,"ntype=%d ",ntype); 
  372:       /*     printf("ntype=%d ",ntype); */
  373:       switch(ntype){
  374:       case 11 : /* 11*/
  375: 	nobs=0;
  376: 	for(n=0;n<2;n++){
  377: 	  c=getc(ficdat);
  378: 	  d=(n+(1-n)*256)*ascii_to_ebcdic[c];
  379: 	  nobs+=d;
  380: 	}
  381: 	fprintf(ficlog,"nobs=%d ",nobs);
  382: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  383: 	for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
  384: 	printf(" %s\n", title);
  385: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  386: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  387: 	for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
  388: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  389: 	for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
  390: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  391: 	for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
  392: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  393: 	for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
  394: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  395: 	for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
  396: 	break;
  397:       case 12: /* 12 */
  398: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  399: 	for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
  400: 	printf(" %s\n", title);
  401: 	ncartes=0;for(n=0;n<2;n++){ c=getc(ficdat); ncartes+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"ncartes=%d ",ncartes);
  402: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  403: 	for(n=0;n<8;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
  404: 	olevel=level;
  405: 	level=title[0]-48;
  406: 	printf(" Niveau = %d Colonnes 1  8 = %s\n",level,title);
  407: 	fprintf(ficlog," Niveau = %d Colonnes 1  8 = %s\n",level,title);
  408: 	fprintf(ficreso," Niveau = %d Colonnes 1   8 = %s\n",level,title);
  409: 	if(level ==0){
  410: 	  if(ilect==2){
  411: 	    fprintf(ficsas,"  if id=%d then do;\n",level); 
  412: 	    /* 	    fprintf(ficstata,"*  if id=%d then do;\n",level);  */
  413: 	  /*       fprintf(ficsas,"  input @9 "); */
  414: 	  }
  415: 	}
  416: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  417: 	ncara=0;for(n=0;n<2;n++){ c=getc(ficdat); ncara+=(n+(1-n)*256)*ascii_to_ebcdic[c]; } fprintf(ficlog,"ncara=%d ",ncara);
  418: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  419: 	for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
  420: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  421: 	for(n=0;n<2;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
  422: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  423: 	break;
  424:       case 10:  /* 10 = 142 ascii*/
  425: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  426: 	for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"%s ",title);
  427: 	printf(" %s\n", title);
  428: 	trzb(namevar,title); 
  429: 	ncartes=0;for(n=0;n<2;n++){ c=getc(ficdat); ncartes+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"ncartes=%d ",ncartes);
  430: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  431: 	ncara=0;for(n=0;n<2;n++){ c=getc(ficdat); ncara+=(n+(1-n)*256)*ascii_to_ebcdic[c]; } fprintf(ficlog,"ncara=%d ",ncara);
  432: 	ncar=0;for(n=0;n<2;n++){ c=getc(ficdat); ncar+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"ncar=%d ",ncar);
  433: 	printf(" %s %d\n",namevar,ncara);
  434: 	fprintf(ficreso," %s %d\n",namevar,ncara);
  435: 	ncar=0;for(n=0;n<2;n++){ c=getc(ficdat); ncar+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"ncar=%d ",ncar);
  436: 	break;
  437:       case 14: /* 14 */
  438: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  439: 	for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"%s ",title);
  440: 	trzb(namevar,title); 
  441: 	printf("%d %20s ", level, namevar);
  442: 	fprintf(ficreso,"%d %20s ",level, namevar);
  443: 	fprintf(ficlog,"Variable \"%s\" \n",namevar);
  444: 	ncartes=0;for(n=0;n<2;n++){ c=getc(ficdat); ncartes+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"ncartes=%d ",ncartes);
  445: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  446: 	ncara=0;for(n=0;n<2;n++){ c=getc(ficdat); ncara+=(n+(1-n)*256)*ascii_to_ebcdic[c]; } fprintf(ficlog,"ncara=%d ",ncara);
  447: 	printf(" %6d",ncara); /* Nombre de caractres */
  448: 	fprintf(ficreso," %6d",ncara); /* Nombre de caract res */
  449: 	ncar=0;for(n=0;n<2;n++){ c=getc(ficdat); ncar+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"ncar=%d ",ncar);
  450: 	for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0';  fprintf(ficlog,"%s ",title);
  451: 	trzb(namevara,title); 
  452: 	printf("%10s ", namevara); /* Association */
  453: 	fprintf(ficreso,"%10s ", namevara); /* Association */
  454: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  455: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  456: 	for(n=0;n<2;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0';fprintf(ficlog,"\"%s\"",title);
  457: 	printf("%3s", title); /* Brute C ou Calcule R */
  458: 	fprintf(ficreso,"%3s", title); /* Brute C ou Calcul e R */
  459: 	if(strrchr(title,'C')!= 0 || strrchr(title,'G')!=0){
  460: 	  if(level!=olevel){
  461: 	    pos=9;
  462: 	    firstpass=0;
  463: 	    if(ilect==2){
  464: 	      if(olevel==1){
  465: 		fprintf(ficsas,"    ;\n   output %s.%s%d;\n",indexfilefiname,indexfilefiname,olevel);
  466: 	      }else if (olevel==2){
  467: 		fprintf(ficsas,"    ;\n      numero +1;\n   output %s.%s%d;\n",indexfilefiname,indexfilefiname,olevel);
  468: 	      }
  469: 	      fflush(ficsas);
  470: 	      if(idic[olevel]!=0)
  471: 		fprintf(ficstatal[olevel],"\n}\n");
  472: 	      fprintf(ficsas,"  end\n");
  473: 	    }
  474: 	    if(level !=0){
  475: 	      if(ilect==2){
  476: 		fprintf(ficsas,"  ;\n  else if id=%d then do;\n",level);
  477: 		if(idic[level]==0){
  478: 		  sprintf(filestatal[level],"s%s-dict%d.dct",indexfilefiname,level);
  479: 		  fprintf(ficlog,"\nOutput Stata dictionary: %s\n", filestatal[level]);
  480: 		  if((ficstatal[level]=fopen(filestatal[level],"w"))==NULL) { /* opened on subdirectory */
  481: 		    printf("Problem with Output Stata dictionary file: %s\n", filestatal[level]);
  482: 		    fprintf(ficlog,"Problem with Output Stata dictionary: %s\n", filestatal[level]);
  483: 		    fflush(ficlog);
  484: 		    goto end;
  485: 		  }
  486: 		  idic[level]=1;
  487: /* 		  fprintf(ficstatal[level],"* Sortie de rleda version %s, %s\n",version,fullversion ); */
  488: /* 		  fprintf(ficstatal[level],"* Nom de fichier  %s et chemin \"%s\";\n* Stata dictionary\n",indexfilefiname,path); */
  489: 		  fprintf(ficstatal[level],"dictionary using \"%s.dat\"{\n",indexfilefiname );
  490: 		}
  491: 	      }
  492: 	    }
  493: 	    if(ilect==2){
  494: 	      fprintf(ficsas,"    input @9 ");
  495: 	      if(idic[level]!=0)
  496: 		fprintf(ficstatal[level],"    str1 id _column(9) ");
  497: 	      printf("  input @9 ");
  498: 	    }
  499: 	    if(ilect==1){
  500: 	      levelmax=level;
  501: 	    }
  502: 	    olevel=level;
  503: 	  }
  504: 	  printf(" %d-%d", pos, pos+(ncara-1));
  505: 	  fprintf(ficreso," %d-%d", pos, pos+(ncara-1));
  506: 	  for(n=0;n<strlen(namevar);n++){
  507: 	    if(namevar[n]=='-')
  508: 	      break;
  509: 	  }
  510: 	  namevar[n]='\0';
  511: 	  if(ilect==1){
  512: 	    if(firstpass==0){
  513: 	      strcpy(var1[level],namevar);
  514: 	      printf(" Variable premiere %s, niveau %d  namevar=%s\n",var1[level],level, namevar);
  515: 	      firstpass=1;
  516: 	    }
  517: 	    else{
  518: 	      strcpy(varn[level],namevar);
  519: 	      printf(" Variable N %s, niveau %d  namevar=%s\n",varn[level],level, namevar);
  520: 	    }
  521: 	  }
  522: 	  if(ilect==2){
  523: 	    fprintf(ficsas, " %s $%d.", namevar, ncara);
  524: 	    fprintf(ficstatal[level], " str%d %s %%%ds", ncara, namevar, ncara);
  525: 	  }
  526: 	  pos+=ncara;nvaris++ ; 
  527: 	  if (nvaris>=5) {
  528: 	    if(ilect==2){
  529: 	      fprintf(ficsas,"\n     ") ; 
  530: 	      fprintf(ficstatal[level],"\n     ") ; 
  531: 	    }
  532: 	    nvaris=0 ; 
  533: 	  }
  534: 	}
  535: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  536: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  537: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  538: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  539: 	for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0';fprintf(ficlog,"%s ",title);
  540: 	trzb(namevar,title); 
  541: 	printf(" %10s\n", namevar); /* format */
  542: 	fprintf(ficreso," %10s", namevar); /* format */
  543: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  544: 	for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0';fprintf(ficlog,"%s ",title);
  545: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  546: 	break;
  547:       default: fprintf(ficlog,"Warning ntype=%d cas non prvu, voir les fichiers sources",ntype);
  548: 	nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
  549: 	for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"%s ",title);
  550: 	printf(" %s\n", title);
  551:       }
  552:       n=0;
  553:       while((c=getc(ficdat)) !='\r'){
  554: 	if(ncara != 0) 
  555: 	  nn= n % ncara;
  556: 	else
  557: 	  nn=0;
  558: 	title[nn]=c; 
  559: 	if(nn==ncara-1){
  560: 	  title[nn+1]='\0';
  561: 	  fprintf(ficlog," \"%s\"",title);
  562: 	  printf(" \"%s\"",title);
  563: 	  fprintf(ficreso," \"%s\"",title);
  564: 	  n=n+1;
  565: 	}else{
  566: 	  n=n+1;
  567: 	}
  568:       }
  569:       if(c=='\r')
  570: 	if((c=getc(ficdat))=='\n');
  571: 	else ungetc(c,ficdat);
  572:       fprintf(ficlog,"\n");
  573:       fprintf(ficreso,"\n");
  574:     } /* End of read loop */
  575:     fclose(ficdat);
  576:   } /* End loop ilect */
  577:   
  578:   fprintf(ficsas,"   ;\n    output %s.%s%d;\n  end;\n  else input;\nrun;\n",indexfilefiname,indexfilefiname,level);
  579:   fprintf(ficstatal[level],"\n}\n");
  580:   for(level=0; level <=levelmax; level++){
  581:     fprintf(ficsas,"proc contents data=%s.%s%d;run;\n",indexfilefiname,indexfilefiname,level);
  582:     /*     fprintf(ficstata,"*proc contents data=%s.%s%d;run;\n",indexfilefiname,indexfilefiname,level); */
  583:     if(level==2){
  584:       fprintf(ficstata,"clear\n  quiet infile using s%s-dict%d if id==\"%d\"\n  gen long numero=_n\n  sort numero\nsave %s%d,replace\n",indexfilefiname,level,level,indexfilefiname,level);
  585:     }
  586:     else if(level==3){
  587:       fprintf(ficstata,"clear\n  quiet infile using s%s-dict%d if id != \"1\"\n  gen long numero=1  if id==\"2\"\n  replace numero=sum(numero)\n  sort numero\n",indexfilefiname,level);
  588:       fprintf(ficstata,"* merge numero using %s2\n* drop numero\n drop if id != \"3\"\nsave %s%d,replace\n",indexfilefiname,indexfilefiname,level);
  589:     }
  590:   }
  591:   fclose(ficsas);
  592:   fclose(ficstata);
  593:   printf("Le nom du fichier de debug est %s\n",filelog);
  594:   printf("Le nom du fichier du format de sortie est %s\n",filereso);
  595:   printf("Le nom du fichier SAS de sortie est %s\n",filesas);
  596:   printf("Le nom du fichier STATA de sortie est %s\n",filestata);
  597:   for(level=1;level<=levelmax;level++){
  598:     fclose(ficstatal[level]);
  599: 	   printf("Le nom du fichier STATA dictionnaire niveau %d de sortie est %s\n",level,filestatal[level]);
  600:   }
  601:   fclose(ficreso);
  602:   fclose(ficlog);
  603:   exit(0);
  604:  end: 
  605:     fclose(ficlog);
  606:     exit(1);
  607: 
  608: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>