Index: main.c ================================================================== --- main.c +++ main.c @@ -639,13 +639,13 @@ fprintf(stderr,"Initializing user cache...\n"); if(z=sqlite3_exec(userdb,"BEGIN;",0,0,0)) fatal("SQL error (%d): %s\n",z,sqlite3_errmsg(userdb)); if(z=sqlite3_prepare_v2(userdb,"SELECT `ID`, `TIME` FROM `USERCACHEINDEX` WHERE `NAME` = ?1;",-1,&st,0)) fatal("SQL error (%d): %s\n",z,sqlite3_errmsg(userdb)); nam1=sqlite3_mprintf("%s.level",basefilename); if(!nam1) fatal("Allocation failed\n"); - nam2=main_options['n']?strdup(nam1):realpath(nam1,0); + nam2=realpath(nam1,0); if(!nam2) fatal("Cannot find real path of '%s': %m\n",nam1); - levelfp=fopen(nam2,main_options['n']?"w+x":main_options['r']?"r":"r+"); + levelfp=fopen(nam2,main_options['r']?"r":"r+"); if(!levelfp) fatal("Cannot open '%s' for reading%s: %m\n",nam2,main_options['r']?"":"/writing"); sqlite3_free(nam1); sqlite3_bind_text(st,1,nam2,-1,0); z=sqlite3_step(st); if(z==SQLITE_ROW) { @@ -655,17 +655,16 @@ leveluc=t1=-1; } else { fatal("SQL error (%d): %s\n",z,sqlite3_errmsg(userdb)); } sqlite3_reset(st); - if(main_options['n']) write_empty_level_set(levelfp); nam1=sqlite3_mprintf("%s.solution",basefilename); if(!nam1) fatal("Allocation failed\n"); - nam3=main_options['n']?strdup(nam1):realpath(nam1,0); + nam3=realpath(nam1,0); if(!nam3) fatal("Cannot find real path of '%s': %m\n",nam1); if(!strcmp(nam2,nam3)) fatal("Level and solution files seem to be the same file\n"); - solutionfp=fopen(nam3,main_options['n']?"w+x":main_options['r']?"r":"r+"); + solutionfp=fopen(nam3,main_options['r']?"r":"r+"); if(!solutionfp) fatal("Cannot open '%s' for reading%s: %m\n",nam3,main_options['r']?"":"/writing"); sqlite3_free(nam1); sqlite3_bind_text(st,1,nam3,-1,0); z=sqlite3_step(st); if(z==SQLITE_ROW) { @@ -689,10 +688,26 @@ fatal("SQL error (%d): %s\n",z,sqlite3_errmsg(userdb)); } if(z=sqlite3_exec(userdb,"COMMIT;",0,0,0)) fatal("SQL error (%d): %s\n",z,sqlite3_errmsg(userdb)); fprintf(stderr,"Done\n"); } + +static void new_puzzle_set(void) { + char*nam1; + char*nam2; + nam1=sqlite3_mprintf("%s.level",basefilename); + if(!nam1) fatal("Allocation failed\n"); + levelfp=fopen(nam1,"w+x"); + if(!levelfp) fatal("Cannot open '%s' for reading/writing: %m\n",nam1); + write_empty_level_set(levelfp); + nam2=sqlite3_mprintf("%s.solution",basefilename); + if(!nam2) fatal("Allocation failed\n"); + solutionfp=fopen(nam2,"w+x"); + if(!solutionfp) fatal("Cannot open '%s' for reading/writing: %m\n",nam2); + fclose(levelfp); + fclose(solutionfp); +} static void init_sql(void) { char*s; char*p; const char*v; @@ -1119,13 +1134,16 @@ if(main_options['T']) { printf("argv[0] = %s\n",argv[0]); init_sound(); test_mode(); return 0; + } + if(main_options['n']) { + new_puzzle_set(); + return 0; } if(!main_options['z']) init_usercache(); - if(main_options['n']) return 0; if(screen) init_sound(); load_classes(); load_key_bindings(); load_level_index(); optionquery[1]=Q_maxObjects;