static const char *input_filename;
static int pause_updates;
+#define TITLE_MAX 100
+static char title[TITLE_MAX+1];
+
static void read_input(void) {
- int r;
+ int r, last_readlink_r, last_readlink_errno=0;
+ char symlink_check[sizeof(title)];
+
+ last_readlink_r= -2;
- if (input_f) fclose(input_f);
- input_f= fopen(input_filename, "rb"); if (!input_f) diee("input file");
+ for (;;) {
+ r= readlink(input_filename, symlink_check, TITLE_MAX);
+ assert(r<=TITLE_MAX);
+ assert(r!=-2);
+
+ if (r>=0) symlink_check[r]= 0;
+ else symlink_check[0]= 0;
+
+ if (r == last_readlink_r &&
+ (r<0
+ ? (errno==last_readlink_errno)
+ : !strcmp(symlink_check, title))) {
+ assert(input_f);
+ if (r<0) {
+ if (last_readlink_errno==EINVAL)
+ snprintf(title,sizeof(title),"%s",input_filename);
+ else
+ snprintf(title,sizeof(title),"? %s",strerror(last_readlink_errno));
+ }
+ break;
+ }
+
+ strcpy(title, symlink_check);
+ last_readlink_r= r;
+ last_readlink_errno= errno;
+
+ if (input_f) fclose(input_f);
+ input_f= fopen(input_filename, "rb"); if (!input_f) diee("input file");
+ }
if (fstat(fileno(input_f), &input_stab)) diee("fstat input file");
int v, k;
- FOR_VERTEX(v) {
+ FOR_VERTEX(v,INNER) {
input_gsl.data= &conformation[v][0];
GA( gsl_blas_dgemv(CblasNoTrans, 1.0,&transform_gsl, &input_gsl,
0.0, &result_gsl) );
int vb, ve[V6], e;
ntris= 0;
- FOR_VERTEX(vb) {
+ FOR_VERTEX(vb,INNER) {
/* We use the two triangles in the parallelogram vb, vb+e5, vb+e0, vb+e1.
* We go round each triangle clockwise (although our surface is non-
* orientable so it shouldn't matter). Picking the parallelogram
if (!vertex_in_triangles_checked) {
int v, expd;
- FOR_VERTEX(v) {
+ FOR_VERTEX(v,INNER) {
expd= RIM_VERTEX_P(v) ? 3 : 6;
if (vertex_in_triangles[v] != expd) {
fprintf(stderr,"vertex %02x used for %d triangles, expected %d\n",
drawtriangles(&dmwhite);
printf("shown, %d/%d triangles cut\n", ncut, ntris);
}
-
+
+ XA( XStoreName(display,window,title) );
XA( XSetWindowBackgroundPixmap(display,window,pixmap) );
XA( XClearWindow(display,window) );
currentbuffer= !currentbuffer;
static void topocheck(void) {
int v1,e,v2,eprime,v1prime, count;
- FOR_EDGE(v1,e,v2) {
+ FOR_EDGE(v1,e,v2, INNER) {
count= 0;
FOR_VEDGE(v2,eprime,v1prime)
if (v1prime==v1) count++;
struct pollfd *polls=0;
int motion_deferred=0, motion_x=-1, motion_y=-1;
+ mgraph_prepare();
topocheck();
if (argc==1) { printf("topology self-consistent, ok\n"); exit(0); }