+ parser works now with mmap and sscanf
[qpalma.git] / tools / data_tools / parser.c
index e686cf3..2783157 100644 (file)
@@ -4,7 +4,7 @@
 
 #include "datastructures.h"
 
-void parse_gff(char *filename, FILE* fid,struct gene** allGenes) {
+int parse_gff(char *filename, FILE* fid,struct gene*** allGenes) {
 
    int buffer_size = 256;
    char* chr   = malloc(sizeof(char)*buffer_size);
@@ -32,13 +32,13 @@ void parse_gff(char *filename, FILE* fid,struct gene** allGenes) {
    }
    freopen(filename,"r",fid);
  
-   printf("Found %d genes!\n",numGenes);
+   //printf("Found %d genes!\n",numGenes);
 
-   allGenes = malloc(sizeof(struct gene)*numGenes);
-   struct gene *currentGene = gene_alloc();
+   int idx = 0;
+   (*allGenes) = malloc(sizeof(struct gene*)*numGenes);
+   (*allGenes)[idx] = NULL;
 
    int skippedLinesCounter = 0;
-   int idx = 0;
    while(1) {
       status = fscanf(fid,"%s\t%s\t%s\t%d\t%d\t%c\t%c\t%c\t%s\n",chr,blah,id,&start,&stop,xy,strand,xz,desc);
       if(status == EOF)
@@ -50,35 +50,36 @@ void parse_gff(char *filename, FILE* fid,struct gene** allGenes) {
       }
 
       if (strcmp(id,"gene")==0) {
-         if ( currentGene->start != -1)
-            allGenes[idx] = currentGene;
+         if ( (*allGenes)[idx] !=NULL )
             idx++;
        
-         currentGene = gene_alloc();
-         currentGene->start = start;
-         currentGene->stop = stop;
-         currentGene->strand = (*strand);
+         (*allGenes)[idx] = gene_alloc();
+         (*allGenes)[idx]->start = start;
+         (*allGenes)[idx]->stop = stop;
+         (*allGenes)[idx]->strand = (*strand);
          //printf("gene start/stop: %d/%d\n",start,stop);
          continue;
       }
 
       if (strcmp(id,"exon")==0) {
-         add_exon(currentGene,start,stop);
+         add_exon((*allGenes)[idx],start,stop);
          //printf("exon start/stop: %d/%d\n",start,stop);
          continue;
       }
 
       if (strcmp(id,"pseudogene")==0) {
-         if ( currentGene->start != -1)
-            allGenes[idx] = currentGene;
+         if ( (*allGenes)[idx] !=NULL )
             idx++;
       }
    }
 
-   if ( currentGene->start != -1)
-      allGenes[idx] = currentGene;
+   if ( (*allGenes)[idx] !=NULL )
       idx++;
 
+   //printf("allGenes[0] is %d\n",(*allGenes)[0]);
+   //printf("allGenes[1] is %d\n",(*allGenes)[1]);
+   //printf("Skipped %d lines.\n",skippedLinesCounter);
+
    free(chr);
    free(blah);
    free(id);
@@ -86,4 +87,7 @@ void parse_gff(char *filename, FILE* fid,struct gene** allGenes) {
    free(xy);
    free(strand);
    free(xz);
+
+   return numGenes;
 }
+