Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
niml_fileread.c
Go to the documentation of this file.00001 #include "niml_private.h"
00002
00003 #undef SKIP_COMMENT_FLAG
00004 #define SKIP_COMMENT_FLAG 1
00005
00006 static char * my_fgets( char *, int, FILE *, int ) ;
00007
00008
00009
00010
00011
00012
00013 NI_element * NI_read_file_nohead( char *fname )
00014 {
00015 FILE *fp ;
00016 char prefix[32] , *ptr ;
00017 NI_element *nel ;
00018
00019 if( fname == NULL || *fname == '\0' ) return NULL ;
00020
00021 fp = fopen( fname , "r" ) ; if( fp == NULL ) return NULL ;
00022
00023
00024
00025 memset(prefix,0,32) ; fread(prefix,1,31,fp) ; rewind(fp) ;
00026 ptr = strchr(prefix,'<') ;
00027 if( ptr != NULL && isalpha(*(ptr+1)) ){
00028 NI_stream ns ;
00029 fclose(fp) ;
00030 ptr = NI_malloc(char, strlen(fname)+16) ;
00031 sprintf(ptr,"file:%s",fname) ;
00032 ns = NI_stream_open(ptr,"r") ; NI_free(ptr) ;
00033 if( ns == NULL ) return NULL ;
00034 nel = NI_read_element( ns , 66 ) ;
00035 NI_stream_close(ns) ;
00036 return nel ;
00037 }
00038
00039 }
00040
00041
00042
00043
00044 #define LBUF 65536
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 static char * my_fgets( char *buf, int size, FILE *fts, int flags )
00055 {
00056 char *ptr ;
00057 int nbuf , ll,ii , cflag ;
00058 static char *qbuf=NULL ;
00059 int skip_comm = (flags & SKIP_COMMENT_FLAG) != 0 ;
00060
00061 if( buf == NULL || size < 1 || fts == NULL ){
00062 NI_free(qbuf); qbuf = NULL; return NULL;
00063 }
00064
00065 if( qbuf == NULL ) qbuf = NI_malloc(char, LBUF) ;
00066
00067 nbuf = 0 ;
00068 cflag = 0 ;
00069
00070 while(1){
00071
00072 ptr = fgets( qbuf , LBUF , fts ) ;
00073
00074 if( ptr == NULL ) break ;
00075
00076
00077
00078 for( ; *ptr != '\0' && isspace(*ptr) ; ptr++ ) ;
00079
00080
00081
00082 if( *ptr == '\0' ){ if(cflag) break; else continue; }
00083
00084
00085
00086 if( skip_comm &&
00087 (*ptr == '#' || (*ptr == '/' && *(ptr+1) == '/')) ) continue ;
00088
00089
00090
00091 ll = strlen(ptr) ;
00092 for( ii=ll-1 ; isspace(ptr[ii]) && ii > 0 ; ii-- )
00093 ptr[ii] = '\0' ;
00094
00095 ll = strlen(ptr) ;
00096 if( ll == 0 ) continue ;
00097
00098 cflag = (ptr[ll-1] == '\\') ;
00099 if( cflag && ll > 1 && ptr[ll-2] == '\\' ) cflag = 0 ;
00100 if( cflag ) ptr[ll-1] = ' ' ;
00101
00102
00103
00104 if( nbuf+ll+1 > size ){
00105 ll = size - (nbuf+1) ;
00106 if( ll <= 0 ) break ;
00107 }
00108
00109 memcpy(buf+nbuf,ptr,ll+1) ; nbuf += ll ;
00110 if( !cflag ) break ;
00111
00112 }
00113
00114
00115
00116 if( nbuf > 0 ) return buf ;
00117 return NULL ;
00118 }