- FILE* fi;
- char filename[1024];
- char str[1024];
- int len,i;
-
- st_subset->name = (char*) malloc(sizeof(char)*(strlen(subset)+1));
- strcpy(st_subset->name,subset);
-
- snprintf(filename, 1024, "%s/levels/%s/info", st_dir, subset);
- if(!faccessible(filename))
- snprintf(filename, 1024, "%s/levels/%s/info", DATA_PREFIX, subset);
- if(faccessible(filename))
- {
- fi = fopen(filename, "r");
- if (fi == NULL)
- {
- perror(filename);
- }
-
- /* Load title info: */
- fgets(str, 40, fi);
- st_subset->title = (char*) malloc(sizeof(char)*(strlen(str)+1));
- strcpy(st_subset->title, str);
-
- /* Load the description: */
-
- str[0] = '\0';
- st_subset->description = NULL;
- len = 0;
- while(fgets(str, 300, fi) != NULL)
- {
- len += strlen(str);
- if(st_subset->description == NULL)
- st_subset->description = (char*) calloc(len+1,sizeof(char));
- else
- st_subset->description = (char*) realloc(st_subset->description, sizeof(char) * (len+1));
- strcat(st_subset->description,str);
- }
- fclose(fi);
-
- snprintf(str, 1024, "%s.png", filename);
- if(faccessible(str))
- {
- texture_load(&st_subset->image,str,IGNORE_ALPHA);
- }
- else
- {
- snprintf(filename, 1024, "%s/images/status/level-subset-info.png", DATA_PREFIX);
- texture_load(&st_subset->image,filename,IGNORE_ALPHA);
- }
+ try {
+ lisp::Parser parser;
+ std::auto_ptr<lisp::Lisp> root (parser.parse(filepath));
+
+ const lisp::Lisp* level = root->get_lisp("supertux-level");
+ if(!level)
+ throw std::runtime_error("file is not a supertux-level file.");
+
+ int version = 1;
+ level->get("version", version);
+ if(version == 1) {
+ load_old_format(*level);
+ return;