I've written a small script which removes ctrl-M's and an ending
ctrl-Z from files which I'm including below. When the lines

    #ftmp.open()
    #ftmp.close(true)

are uncommented, everything works fine. When they're commented out, I
get errors like the following:


processing act_func.cpp
processing activity.cpp
processing anneal.cpp
processing confuse.cpp
processing conjgrad.cpp
processing control.cpp
processing direcmin.cpp
processing dotprod.cpp
processing execute.cpp
processing gen_init.cpp
/home/wiener/ruby/rmctlm.rb:29:in `process': failed to convert nil
into Array (TypeError)
        from /home/wiener/ruby/rmctlm.rb:24:in `each'
        from /home/wiener/ruby/rmctlm.rb:24:in `process'
        from /home/wiener/ruby/rmctlm.rb:15:in `each'
        from /home/wiener/ruby/rmctlm.rb:15:in `process'
        from /home/wiener/ruby/rmctlm.rb:59




Does anyone have an idea what's going wrong here?

Thanks,

Gerry Wiener

-------------------------------------------------------------------------------
#!/usr/bin/env ruby

require "tempfile"

# Remove control M's from file

def usage()
  printf("usage: %s files\n", $0)
  exit(2)
end


def process(files)
  
  for f in files
    printf("processing %s\n", f)
    change = false

    fp = File.new(f, "r")
    lines = fp.readlines()
    fp.close()

    ftmp = Tempfile.new(File.basename(f))
    for l in lines
      if l[-2] == ?\C-m
	# Remove control-M
	outl = l[0...-2] + "\n"

	ftmp.write(outl)
	change = true
      else
	if l[0] == ?\C-z
	  # Don't write out a line containing control Z
	  change = true
	else
	  ftmp.write(l)
	end
      end
    end

    ftmp.close()

    if change
      s = sprintf("cp %s %s", ftmp.path(), f)
      system(s)
    end

    #ftmp.open()
    #ftmp.close(true)

  end
end


if (ARGV.length() == 0)
  usage()
end
  
process(ARGV)