This is a simple [critcl] function to read an entire file a line at a time and return it as a list. package require critcl 0.33 critcl::ccode { #include } critcl::cproc loadf {char* fn} Tcl_Obj* { FILE *fd; Tcl_Obj *r,*s; char line[1024]; r=Tcl_NewListObj(0,0); Tcl_IncrRefCount(r); s=Tcl_NewStringObj("",0); fd=fopen(fn,"r"); if (!fd) { return r; } while(!feof(fd)) { int l; if (!fgets(line,1024,fd)) { break; } l=strlen(line); if (line[l-1]=='\n') { line[--l]='\0'; Tcl_AppendToObj(s,line,l); Tcl_ListObjAppendElement(NULL,r,s); s=Tcl_NewStringObj("",0); } else { Tcl_AppendToObj(s,line,l); } } fclose(fd); if (Tcl_GetCharLength(s) > 0) { Tcl_ListObjAppendElement(NULL,r,s); } return r; } # tcl version for comparison proc loadf_tcl {file} { set f [open $file] fconfigure $f -translation binary set d [read -nonewline $f] close $f return [split $d "\n"] } # use set lines [loadf something] The critcl version is as much as 3 times faster than the tcl version on a large file. JR ---- I just noticed that on files with lots of short lines (e.g., /usr/share/dict/words) the critcl version is actually slower than the tcl version. This bears looking into. ---- [Category Command]