static char rcs_id[] = "$Header$" ;
#endif
+char *add_u(part,ptr) char *ptr ; {
+ if ( part>=26 ) {
+ ptr=add_u(part/26-1,ptr) ;
+ }
+ *ptr= part%26 + 'a' ;
+ return ptr+1 ;
+}
+
+char *unique() {
+ /* Get the next unique part of the internal filename */
+ static int u_next = 0 ;
+ static char buf[10] ;
+ register char *ptr ;
+
+ ptr=add_u(u_next,buf) ;
+ *ptr=0 ;
+ u_next++ ;
+ return buf ;
+}
+
setfiles(phase) register trf *phase ; {
/* Set the out structure according to the in structure,
the transformation and some global data */
growstring pathname ;
register list_elem *elem ;
+ static int out_used= 0 ;
+ if ( !phase->t_next && !phase->t_isprep && outfile ) {
+ if ( out_used ) {
+ fuerror("only one output file allowed when using the -o flag") ;
+ } else {
+ if ( !phase->t_keep ) fatal("Removing result file") ;
+ phase->t_outfile=outfile ;
+ out_used++ ;
+ }
+ }
if ( phase->t_combine ) {
- out.p_keep=YES ;
- out.p_path=outfile ;
- out.p_keeps=NO ;
in.p_path= (char *)0 ;
in.p_keep=YES ;
in.p_keeps=NO ;
+ }
+ if ( phase->t_outfile ) {
+ out.p_path=phase->t_outfile ;
+ out.p_keeps=NO ;
} else {
gr_init(&pathname) ;
if ( !phase->t_keep && !t_flag ) {
gr_cat(&pathname,TMP_DIR) ;
gr_cat(&pathname,"/") ;
gr_cat(&pathname,template) ;
+ gr_cat(&pathname,unique()) ;
out.p_keep=NO ;
} else {
gr_cat(&pathname,p_basename) ;
}
scanlist( l_first(arguments), elem) {
if ( strcmp(l_content(*elem),out.p_path)==0 ) {
- error("attempt to overwrite argument file") ;
+ error("attempt to overwrite %s",out.p_path) ;
return 0 ;
}
}
return 1 ;
}
-disc_files() {
- if ( in.p_path ) {
- if ( !in.p_keep ) {
- if ( unlink(in.p_path)!=0 ) {
- werror("couldn't unlink %s",in.p_path);
+disc_files(phase) trf *phase ; {
+ path temp ;
+
+ if ( !phase->t_combine ) {
+ file_final(&in) ;
+ } else {
+ disc_inputs(phase) ;
+ }
+ temp=in ; in=out ; out=temp ;
+}
+
+file_final(file) path *file ; {
+ if ( file->p_path ) {
+ if ( !file->p_keep && t_flag<=1 ) {
+ if ( unlink(file->p_path)!=0 ) {
+ werror("couldn't unlink %s",file->p_path);
}
}
- if ( in.p_keeps ) throws(in.p_path) ;
+ if ( file->p_keeps ) throws(file->p_path) ;
+ }
+ file->p_path= (char *)0 ;
+ file->p_keeps=NO ;
+ file->p_keep=NO ;
+}
+
+disc_inputs(phase) trf *phase ; {
+ /* Remove all the input files of this phase */
+ /* Only for combiners */
+ register path *l_in ;
+ register list_elem *elem ;
+ scanlist( l_first(phase->t_inputs), elem) {
+ l_in= p_cont(*elem) ;
+ file_final(l_in) ;
+ freecore(l_in) ;
+ }
+ l_clear(&phase->t_inputs) ;
+}
+
+rmfile(file) path *file ; {
+ /* Remove a file, do not complain when is does not exist */
+ if ( file->p_path ) {
+ if ( t_flag<=1 ) unlink(file->p_path) ;
+ if ( file->p_keeps ) throws(file->p_path) ;
+ file->p_path= (char *)0 ;
+ file->p_keeps=NO ;
+ file->p_keep=NO ;
}
- in=out ;
- out.p_path= (char *)0 ;
- out.p_keeps=NO ;
- out.p_keep=NO ;
}
rmtemps() {
/* Called in case of disaster, always remove the current output file!
*/
- if ( out.p_path ) {
- unlink(out.p_path) ;
- if ( out.p_keeps ) throws(out.p_path) ;
- out.p_path= (char *)0 ;
- out.p_keeps=NO ;
- out.p_keep=NO ;
+ register list_elem *elem ;
+
+ if ( t_flag>1 ) return ;
+ rmfile(&out) ;
+ file_final(&in) ;
+ scanlist(l_first(tr_list),elem) {
+ if ( t_cont(*elem)->t_combine && t_cont(*elem)->t_do ) {
+ disc_inputs(t_cont(*elem)) ;
+ }
}
- if ( !in.p_keep && in.p_path ) {
- unlink(in.p_path) ;
- if ( in.p_keeps ) throws(in.p_path) ;
- in.p_path= (char *)0 ;
- out.p_keeps= NO ;
- out.p_keep=NO ;
+}
+
+add_input(file,phase) path *file ; trf *phase ; {
+ register path *store ;
+#ifdef DEBUG
+ if ( debug ) {
+ vprint("Adding %s to inputs of %s\n",
+ file->p_path,phase->t_name) ;
+ }
+#endif
+ if ( !l_first(phase->t_inputs) ) {
+ /* This becomes the first entry in the input list */
+ phase->t_origname= orig.p_path ;
}
+ store= (path *) getcore(sizeof (path)) ;
+ *store = *file ;
+ l_add(&phase->t_inputs,(char *)store) ;
+ /* The task of getting rid of the string is passed to 'phase',
+ as is the task to get rid of the file itself.
+ */
+ file->p_keeps=NO ; file->p_keep=YES ;
}