const char*cubepos::parse_Singmaster(const char*p){ if(strncmp(p,"SING ",5)==0) p+= 5; int m= 0; for(int i= 0;i<12;i++){ int c= parse_edge(p)^sm_edge_flipped[i]; if(c<0) return"No such edge"; e[edge_perm(c)]= edge_val(sm_edge_order[i],edge_ori(c)); m|= 1<<i; } for(int i= 0;i<8;i++){ int cval= parse_corner(p); if(cval<0) return"No such corner"; c[corner_perm(cval)]= corner_ori_sub(sm_corner_order[i],cval); m|= 1<<(i+12); } skip_whitespace(p); if(*p) return"Extra stuff after Singmaster representation"; if(m!=((1<<20)-1)) return"Missing at least one cubie"; return 0; }
void parse_line(char *buff) { switch(*buff) { case '?': parse_ro_pred(buff+1); break; case '=': parse_copy_pred(buff+1); break; case '&': parse_binop_pred(buff+1, create_and); break; case '|': parse_binop_pred(buff+1, create_or); break; case '~': parse_not(buff+1); break; case 'P': parse_psi(buff+1); break; case 'H': parse_eta(buff+1); break; case '@': parse_updateuse(buff+1); case 'N': parse_node(buff+1); break; case 'E': parse_edge(buff+1); break; case 'C': parse_cond_edge(buff+1); break; } }
int main(int argc, char **argv) { struct pollfd *fdlist; int numfds = 0; int ch; int i; while (-1 != (ch = getopt(argc, argv, OPTSTRING))) { switch (ch) { case OPT_LOGFILE: logfile = strdup(optarg); break; case OPT_DETACH: detach = 1; break; case OPT_SCRIPT_DIR: script_dir = strdup(optarg); break; case OPT_DEFAULT_EDGE: if (-1 == (default_edge = parse_edge(optarg))) { fprintf(stderr, "error: invalid edge value: %s\n", optarg); exit(1); } break; case OPT_VERBOSE: loglevel += 1; break; case '?': usage(stderr); exit(2); } } if (logfile) { int fd; if (-1 == (fd = open(logfile, O_WRONLY|O_CREAT|O_APPEND, 0644))) { LOG_ERROR("failed to open logfile %s", logfile); exit(1); } close(1); close(2); dup(fd); dup(fd); } if (! is_dir(script_dir)) { LOG_ERROR("error: script directory \"%s\" does not exist.", script_dir); exit(1); } for (i=optind; i<argc; i++) { char *pos, *pinspec; struct pin p; pinspec = strdup(argv[i]); pos = strchr(pinspec, ':'); if (pos) { *pos = '\0'; pos++; p.pin = atoi(pinspec); if (-1 == (p.edge = parse_edge(pos))) { fprintf(stderr, "error: unknown edge spec: %s\n", argv[i]); exit(1); } } else { p.pin = atoi(pinspec); p.edge = default_edge; } free(pinspec); num_pins++; pins = realloc(pins, sizeof(struct pin) * num_pins); pins[num_pins-1] = p; } for (i=0; i<num_pins; i++) { pin_export(pins[i].pin); pin_set_edge(pins[i].pin, pins[i].edge); pin_set_direction(pins[i].pin, DIRECTION_IN); } if (detach) daemon(1, logfile ? 1: 0); watch_pins(); return 0; }
void cubepos::init(){ static int initialized= 0; if(initialized) return; initialized= 1; /*14:*/ #line 287 "../cubepos.w" for(int i= 0;i<CUBIES;i++){ int perm= corner_perm(i); int ori= corner_ori(i); corner_ori_inc[i]= corner_val(perm,(ori+1)%3); corner_ori_dec[i]= corner_val(perm,(ori+2)%3); corner_ori_neg_strip[i]= corner_val(0,(3-ori)%3); mod24[i]= mod24[i+CUBIES]= i; } /*:14*//*28:*/ #line 563 "../cubepos.w" for(int m= 0;m<NMOVES;m++) for(int c= 0;c<CUBIES;c++){ edge_trans[m][c]= c; corner_trans[m][c]= c; } /*:28*//*29:*/ #line 578 "../cubepos.w" for(int f= 0;f<FACES;f++) for(int t= 0;t<3;t++){ int m= f*TWISTS+t; int isquarter= (t==0||t==2); int perminc= t+1; if(m<0) continue; for(int i= 0;i<4;i++){ int ii= (i+perminc)%4; for(int o= 0;o<2;o++){ int oo= o; if(isquarter) oo^= edge_change[f]; edge_trans[m][edge_val(edge_twist_perm[f][i],o)]= edge_val(edge_twist_perm[f][ii],oo); } for(int o= 0;o<3;o++){ int oo= o; if(isquarter) oo= (corner_change[f][i]+oo)%3; corner_trans[m][corner_val(corner_twist_perm[f][i],o)]= corner_val(corner_twist_perm[f][ii],oo); } } } /*:29*//*34:*/ #line 649 "../cubepos.w" for(int i= 0;i<NMOVES;i++) inv_move[i]= TWISTS*(i/TWISTS)+(NMOVES-i-1)%TWISTS; /*:34*//*51:*/ #line 1040 "../cubepos.w" memset(lookup_edge_cubie,INVALID,sizeof(lookup_edge_cubie)); memset(lookup_corner_cubie,INVALID,sizeof(lookup_corner_cubie)); for(int i= 0;i<CUBIES;i++){ const char*tmp= 0; lookup_corner_cubie[parse_cubie(tmp= smcorners[i])-6*6*6]= i; lookup_corner_cubie[parse_cubie(tmp= smcorners[CUBIES+i])-6*6*6]= CUBIES+i; lookup_edge_cubie[parse_cubie(tmp= smedges[i])-6*6]= i; } const char*p= sing_solved; for(int i= 0;i<12;i++){ int cv= parse_edge(p); sm_edge_order[i]= edge_perm(cv); sm_edge_flipped[i]= edge_ori(cv); } for(int i= 0;i<8;i++) sm_corner_order[i]= corner_perm(parse_corner(p)); /*:51*//*60:*/ #line 1238 "../cubepos.w" unsigned char face_to_m[FACES*FACES*FACES]; for(int i= 0;i<6;i++) parse_corner_to_facemap(axis_permute_map[i],face_map[8*i]); for(int i= 0;i<8;i++) parse_corner_to_facemap(axis_negate_map[i],face_map[i]); for(int i= 1;i<6;i++) for(int j= 1;j<8;j++) face_map_multiply(face_map[8*i],face_map[j],face_map[8*i+j]); /*:60*//*61:*/ #line 1251 "../cubepos.w" for(int i= 0;i<M;i++){ int v= face_map[i][0]*36+face_map[i][1]*6+face_map[i][2]; face_to_m[v]= i; } unsigned char tfaces[6]; for(int i= 0;i<M;i++) for(int j= 0;j<M;j++){ face_map_multiply(face_map[i],face_map[j],tfaces); int v= tfaces[0]*36+tfaces[1]*6+tfaces[2]; mm[i][j]= face_to_m[v]; if(mm[i][j]==0) invm[i]= j; } for(int m= 0;m<M;m++){ int is_neg= (m^(m>>3))&1; for(int f= 0;f<6;f++){ for(int t= 0;t<TWISTS;t++){ if(is_neg) move_map[m][f*TWISTS+t]= face_map[m][f]*TWISTS+TWISTS-1-t; else move_map[m][f*TWISTS+t]= face_map[m][f]*TWISTS+t; } } } /*:61*//*62:*/ #line 1281 "../cubepos.w" for(int m= 0;m<M;m++) for(int c= 0;c<CUBIES;c++){ int v= 0; for(int i= 0;i<2;i++) v= 6*v+face_map[m][parse_face(smedges[c][i])]; rot_edge[m][c]= lookup_edge_cubie[v]; v= 0; for(int i= 0;i<3;i++) v= 6*v+face_map[m][parse_face(smcorners[c][i])]; rot_corner[m][c]= mod24[lookup_corner_cubie[v]]; } /*:62*//*73:*/ #line 1467 "../cubepos.w" for(int s= 0;s<CANONSEQSTATES;s++){ int prevface= (s-1)%FACES; canon_seq_mask[s]= (1<<NMOVES)-1; for(int mv= 0;mv<NMOVES;mv++){ int f= mv/TWISTS; int isplus= 0; if(s!=0&&(prevface==f||prevface==f+3)) { canon_seq[s][mv]= INVALID; canon_seq_mask[s]&= ~(1<<mv); }else{ canon_seq[s][mv]= f+1+FACES*isplus; } } canon_seq_mask_ext[s]= canon_seq_mask[s]; } /*:73*/ #line 262 "../cubepos.w" }