Well I'm doing this... Based slightly on your code... It's not perfect code but I've been hacking it a lot as I go, it could do with some proper structures and stuff. Too many global variables :(
I'm hoping that "verts" and "tris" will contain pointers to the vertex and triangle structures based on counting back from the end of the file. Which is why I suspected that either I've somehow got yhe counts, or the file size wrong.
Code:
void ProcessTERFile(char* terdata, int size)
{
int magic = *(long*)(terdata+0);
int unk = *(long*)(terdata+4);
int list_length = *(long*)(terdata+8);
int obj_count = *(long*)(terdata+12);
int vert_count = *(long*)(terdata+16);
int poly_count = *(long*)(terdata+20);
assert(sizeof(TERVertex) == 32);
assert(sizeof(TERTriangle) == 20);
char* verts = terdata + size - (vert_count * sizeof(TERVertex) + poly_count * sizeof(TERTriangle) + 4);
char* tris = terdata + sizeof(TERVertex) * vert_count;
g_nVerts = vert_count;
g_Verts = (TERVertex*)verts;
g_nTriangles = poly_count;
g_Triangles = (TERTriangle*)tris;
/* Now process the texture names part */
char* p = terdata + 24;