while(fgets(line,BUF_SIZE,data) != NULL) { // split the line int index = indexOf(line,'\t'); int len = strlen(line); int i = 0; line_r = substring(line,0,index); line_s = substring(line,index + 1,len - 1); if(regcomp(regex,line_r,REG_EXTENDED) != 0) { printf("Compile Failed for %s\n",line_r); free(line_r); free(line_s); continue; } [... other code here ...] free(line_r); free(line_s); }... and thinking what is more appropriate to do ... leave the code like that, duplicating the free functions of line_r and line_s, or using a label with a goto statement to the end of the loop ... ending with something like:
while(fgets(line,BUF_SIZE,data) != NULL) { // split the line int index = indexOf(line,'\t'); int len = strlen(line); int i = 0; line_r = substring(line,0,index); line_s = substring(line,index + 1,len - 1); if(regcomp(regex,line_r,REG_EXTENDED) != 0) { printf("Compile Failed for %s\n",line_r); goto free; } [... other code here ...] free: free(line_r); free(line_s); }Note: The substring allocates the buffer (i know that actually is bad policy) and i could do it avoiding the allocation for each line by using two big buffers (i have constant BUF_SIZE). Imagine that buf_size was variable and all buffers have to be allocated each time.
You might be interested to take a look at Go To Statement Considered Harmful by Edsger W. Dijkstra and this artcile from my supervisor Diomidis Spinellis in Dr. Dobbs journal.