void FreeNode( AIGenericNode_t *node ) { if ( !node ) { return; } switch( node->type ) { case SELECTOR_NODE: FreeNodeList( ( AINodeList_t * ) node ); break; case CONDITION_NODE: FreeConditionNode( ( AIConditionNode_t * ) node ); break; case ACTION_NODE: FreeActionNode( ( AIActionNode_t * ) node ); break; case DECORATOR_NODE: FreeDecoratorNode( ( AIDecoratorNode_t * ) node ); break; default: break; } }
/* ====================== ReadNodeList Parses and creates an AINodeList_t from a token list The token list pointer is modified to point to the beginning of the next node text block after reading ====================== */ AIGenericNode_t *ReadNodeList( pc_token_list **tokenlist ) { AINodeList_t *list; pc_token_list *current = *tokenlist; if ( !expectToken( "{", ¤t, true ) ) { return nullptr; } list = allocNode( AINodeList_t ); while ( Q_stricmp( current->token.string, "}" ) ) { AIGenericNode_t *node = ReadNode( ¤t ); if ( node && list->numNodes >= MAX_NODE_LIST ) { Log::Warn( "Max selector children limit exceeded at line %d", (*tokenlist)->token.line ); FreeNode( node ); FreeNodeList( list ); *tokenlist = current; return nullptr; } else if ( node ) { list->list[ list->numNodes ] = node; list->numNodes++; } if ( !node ) { *tokenlist = current; FreeNodeList( list ); return nullptr; } if ( !current ) { *tokenlist = current; return ( AIGenericNode_t * ) list; } } *tokenlist = current->next; return ( AIGenericNode_t * ) list; }
int main(int argc, char *argv[]) { int ntotal,external; NodeList hull, intern, boundary, given; HNN=MakeHashTable(); HEL=MakeHashTable(); HLI=MakeHashTable(); NEL=MakeListTable(); CM=MakeQueueTable(); SetOptions(argc,argv); ReadFiles(argc,argv); /* CheckBoundary(); */ ntotal = CheckInput(); hull = MakeNodeList(ntotal); intern = MakeNodeList(ntotal); printf("Making convex hull... %d\n",hull->count); ConvexHull(hull,intern); /* CheckConvex(hull,intern); PrintNodeList("hull",hull); PrintNodeList("intern",intern); */ printf("Making maxi elements...\n"); MakeMaxiTriang(hull); CheckNeibor(-1); printf("Inserting convex hull... %d\n",hull->count); InsertBoundaryNodes(hull); CheckCircumCircle(); CheckNeibor(-2); WriteAll("M_hull.grd",hull); CheckNeibor(-3); printf("Inserting internal boundary points... %d\n",intern->count); InsertBoundaryNodes(intern); CheckCircumCircle(); CheckNeibor(-4); WriteAll("M_orgbound.grd",NULL); SetResolution(hull); CopyBoundaryLine(); printf("Recovering boundary lines 1...\n"); RecoverBoundary(); CheckCircumCircle(); CheckNeibor(-43); WriteAll("M_bndrecover.grd",NULL); printf("Refining boundary points 1...\n"); boundary = RefineBoundary(); if( boundary ) { printf("Inserting new boundary points... %d\n",boundary->count); InsertBoundaryNodes(boundary); CheckCircumCircle(); CheckCircumCircleProperty(); CheckNeibor(-5); } TestVersion(); printf("Marking external elements..."); external=MarkExternalElements( hull ); printf(" %d / %d\n",external,NTotElems); WriteGrd("M_finebound.grd"); /* printf("Marking outer elements..."); external=MarkOuterElements(); printf(" %d / %d\n",external,NTotElems); WriteGrd("M_test.grd"); */ FreeNodeList(hull); FreeNodeList(intern); FreeNodeList(boundary); given = GivenNodes(); printf("Inserting internal given points... %d\n",given->count); InsertNodes(given); FreeNodeList(given); CheckCircumCircle(); CheckNeibor(-44); WriteAll("M_given.grd",NULL); printf("Recovering boundary lines 2...\n"); RecoverBoundary(); CheckCircumCircle(); CheckNeibor(-45); WriteAll("M_intrecover.grd",NULL); CheckArea(); printf("Inserting internal points...\n"); InsertInternalNodes(); CheckCircumCircle(); CheckCircumCircleProperty(); WriteGrd("M_insert.grd"); TestVersion(); CheckArea(); printf("Refining internal points... %f\n",OpAspect); RefineInternalNodes(); CheckArea(); CheckCircumCircle(); CheckCircumCircleProperty(); WriteGrd("M_refine.grd"); CheckArea(); printf("Recovering boundary lines 3...\n"); RecoverBoundary(); printf("Recovering fault lines...\n"); RecoverInternalFault(); CheckCircumCircle(); CheckNeibor(-48); WriteAll("M_intrecover2.grd",NULL); printf("Marking outer elements..."); external=MarkOuterElements(); printf(" %d / %d\n",external,NTotElems); printf("Marking outer nodes..."); external=MarkOuterNodes(); printf(" %d / %d\n",external,NTotNodes); WriteGrd("M_test.grd"); TestVersion(); CheckArea(); printf("Smoothing internal points... %f\n",OpSmoothOmega); SmoothInternalNodes(); CheckArea(); WriteGrd("final.grd"); return 0; }
int main(int argc,char** argv) { NodesX *OSMNodes; WaysX *OSMWays; RelationsX *OSMRelations; ErrorLogsX *OSMErrorLogs; char *dirname=NULL,*prefix=NULL,*tagging=NULL; int option_keep=1; int option_filenames=0; int arg; printf_program_start(); /* Parse the command line arguments */ for(arg=1;arg<argc;arg++) { if(!strcmp(argv[arg],"--version")) print_usage(-1,NULL,NULL); else if(!strcmp(argv[arg],"--help")) print_usage(1,NULL,NULL); else if(!strncmp(argv[arg],"--dir=",6)) dirname=&argv[arg][6]; else if(!strncmp(argv[arg],"--sort-ram-size=",16)) option_filesort_ramsize=atoi(&argv[arg][16]); #if defined(USE_PTHREADS) && USE_PTHREADS else if(!strncmp(argv[arg],"--sort-threads=",15)) option_filesort_threads=atoi(&argv[arg][15]); #endif else if(!strncmp(argv[arg],"--tmpdir=",9)) option_tmpdirname=&argv[arg][9]; else if(!strncmp(argv[arg],"--tagging=",10)) tagging=&argv[arg][10]; else if(!strcmp(argv[arg],"--loggable")) option_loggable=1; else if(!strcmp(argv[arg],"--logtime")) option_logtime=1; else if(!strcmp(argv[arg],"--logmemory")) option_logmemory=1; else if(argv[arg][0]=='-' && argv[arg][1]=='-') print_usage(0,argv[arg],NULL); else option_filenames++; } /* Check the specified command line options */ if(!option_filesort_ramsize) { #if SLIM option_filesort_ramsize=64*1024*1024; #else option_filesort_ramsize=256*1024*1024; #endif } else option_filesort_ramsize*=1024*1024; if(!option_tmpdirname) { if(!dirname) option_tmpdirname="."; else option_tmpdirname=dirname; } if(tagging) { if(!ExistsFile(tagging)) { fprintf(stderr,"Error: The '--tagging' option specifies a file that does not exist.\n"); exit(EXIT_FAILURE); } } else { tagging=FileName(dirname,prefix,"fixme.xml"); if(!ExistsFile(tagging)) { fprintf(stderr,"Error: The '--tagging' option was not used and the default 'fixme.xml' does not exist.\n"); exit(EXIT_FAILURE); } } if(ParseXMLTaggingRules(tagging)) { fprintf(stderr,"Error: Cannot read the tagging rules in the file '%s'.\n",tagging); exit(EXIT_FAILURE); } /* Create new node, segment, way and relation variables */ OSMNodes=NewNodeList(0,0); OSMWays=NewWayList(0,0); OSMRelations=NewRelationList(0,0); /* Create the error log file */ open_errorlog(FileName(dirname,prefix,"fixme.log"),0,option_keep); /* Parse the file */ for(arg=1;arg<argc;arg++) { int fd; char *filename,*p; if(argv[arg][0]=='-' && argv[arg][1]=='-') continue; filename=strcpy(malloc(strlen(argv[arg])+1),argv[arg]); fd=OpenFile(filename); if((p=strstr(filename,".bz2")) && !strcmp(p,".bz2")) { fd=Uncompress_Bzip2(fd); *p=0; } if((p=strstr(filename,".gz")) && !strcmp(p,".gz")) { fd=Uncompress_Gzip(fd); *p=0; } if((p=strstr(filename,".xz")) && !strcmp(p,".xz")) { fd=Uncompress_Xz(fd); *p=0; } printf("\nParse OSM Data [%s]\n==============\n\n",filename); fflush(stdout); if((p=strstr(filename,".pbf")) && !strcmp(p,".pbf")) { if(ParsePBFFile(fd,OSMNodes,OSMWays,OSMRelations)) exit(EXIT_FAILURE); } else if((p=strstr(filename,".o5m")) && !strcmp(p,".o5m")) { if(ParseO5MFile(fd,OSMNodes,OSMWays,OSMRelations)) exit(EXIT_FAILURE); } else { if(ParseOSMFile(fd,OSMNodes,OSMWays,OSMRelations)) exit(EXIT_FAILURE); } CloseFile(fd); free(filename); } DeleteXMLTaggingRules(); FinishNodeList(OSMNodes); FinishWayList(OSMWays); FinishRelationList(OSMRelations); /* Sort the data */ printf("\nSort OSM Data\n=============\n\n"); fflush(stdout); /* Sort the nodes, ways and relations */ SortNodeList(OSMNodes); SortWayList(OSMWays); SortRelationList(OSMRelations); /* Process the data */ RenameFile(OSMNodes->filename_tmp,OSMNodes->filename); RenameFile(OSMWays->filename_tmp,OSMWays->filename); RenameFile(OSMRelations->rrfilename_tmp,OSMRelations->rrfilename); RenameFile(OSMRelations->trfilename_tmp,OSMRelations->trfilename); close_errorlog(); printf("\nCreate Error Log\n================\n\n"); fflush(stdout); OSMErrorLogs=NewErrorLogList(); ProcessErrorLogs(OSMErrorLogs,OSMNodes,OSMWays,OSMRelations); SortErrorLogsGeographically(OSMErrorLogs); SaveErrorLogs(OSMErrorLogs,FileName(dirname,prefix,"fixme.mem")); FreeErrorLogList(OSMErrorLogs); /* Free the memory (delete the temporary files) */ FreeNodeList(OSMNodes,0); FreeWayList(OSMWays,0); FreeRelationList(OSMRelations,0); printf("\n"); fflush(stdout); printf_program_end(); exit(EXIT_SUCCESS); }
int main(int argc,char** argv) { NodesX *Nodes; SegmentsX *Segments,*SuperSegments=NULL,*MergedSegments=NULL; WaysX *Ways; int iteration=0,quit=0; int max_iterations=10; char *dirname=NULL,*prefix=NULL,*tagging=NULL; int option_parse_only=0,option_process_only=0; int option_filenames=0; int arg; /* Parse the command line arguments */ for(arg=1;arg<argc;arg++) { if(!strcmp(argv[arg],"--help")) print_usage(1); else if(!strcmp(argv[arg],"--slim")) option_slim=1; else if(!strncmp(argv[arg],"--sort-ram-size=",16)) option_filesort_ramsize=atoi(&argv[arg][16]); else if(!strncmp(argv[arg],"--dir=",6)) dirname=&argv[arg][6]; else if(!strncmp(argv[arg],"--tmpdir=",9)) option_tmpdirname=&argv[arg][9]; else if(!strncmp(argv[arg],"--prefix=",9)) prefix=&argv[arg][9]; else if(!strcmp(argv[arg],"--parse-only")) option_parse_only=1; else if(!strcmp(argv[arg],"--process-only")) option_process_only=1; else if(!strncmp(argv[arg],"--max-iterations=",17)) max_iterations=atoi(&argv[arg][17]); else if(!strncmp(argv[arg],"--tagging=",10)) tagging=&argv[arg][10]; else if(argv[arg][0]=='-' && argv[arg][1]=='-') print_usage(0); else option_filenames++; } /* Check the specified command line options */ if(option_parse_only && option_process_only) print_usage(0); if(option_filenames && option_process_only) print_usage(0); if(!option_filesort_ramsize) { if(option_slim) option_filesort_ramsize=64*1024*1024; else option_filesort_ramsize=256*1024*1024; } else option_filesort_ramsize*=1024*1024; if(!option_tmpdirname) { if(!dirname) option_tmpdirname="."; else option_tmpdirname=dirname; } if(tagging && ExistsFile(tagging)) ; else if(!tagging && ExistsFile(FileName(dirname,prefix,"tagging.xml"))) tagging=FileName(dirname,prefix,"tagging.xml"); if(tagging && ParseXMLTaggingRules(tagging)) { fprintf(stderr,"Error: Cannot read the tagging rules in the file '%s'.\n",tagging); return(1); } if(!tagging) { fprintf(stderr,"Error: Cannot run without reading some tagging rules.\n"); return(1); } /* Create new node, segment and way variables */ Nodes=NewNodeList(option_parse_only||option_process_only); Segments=NewSegmentList(option_parse_only||option_process_only); Ways=NewWayList(option_parse_only||option_process_only); /* Parse the file */ if(option_filenames) { for(arg=1;arg<argc;arg++) { FILE *file; if(argv[arg][0]=='-' && argv[arg][1]=='-') continue; file=fopen(argv[arg],"rb"); if(!file) { fprintf(stderr,"Cannot open file '%s' for reading [%s].\n",argv[arg],strerror(errno)); exit(EXIT_FAILURE); } printf("\nParse OSM Data [%s]\n==============\n\n",argv[arg]); fflush(stdout); if(ParseOSM(file,Nodes,Segments,Ways)) exit(EXIT_FAILURE); fclose(file); } } else if(!option_process_only) { printf("\nParse OSM Data\n==============\n\n"); fflush(stdout); if(ParseOSM(stdin,Nodes,Segments,Ways)) exit(EXIT_FAILURE); } if(option_parse_only) { FreeNodeList(Nodes,1); FreeSegmentList(Segments,1); FreeWayList(Ways,1); return(0); } /* Process the data */ printf("\nProcess OSM Data\n================\n\n"); fflush(stdout); /* Sort the nodes, segments and ways */ SortNodeList(Nodes); SortSegmentList(Segments); SortWayList(Ways); /* Remove bad segments (must be after sorting the nodes and segments) */ RemoveBadSegments(Nodes,Segments); /* Remove non-highway nodes (must be after removing the bad segments) */ RemoveNonHighwayNodes(Nodes,Segments); /* Measure the segments and replace node/way id with index (must be after removing non-highway nodes) */ UpdateSegments(Segments,Nodes,Ways); /* Repeated iteration on Super-Nodes and Super-Segments */ do { printf("\nProcess Super-Data (iteration %d)\n================================%s\n\n",iteration,iteration>9?"=":""); fflush(stdout); if(iteration==0) { /* Select the super-nodes */ ChooseSuperNodes(Nodes,Segments,Ways); /* Select the super-segments */ SuperSegments=CreateSuperSegments(Nodes,Segments,Ways,iteration); } else { SegmentsX *SuperSegments2; /* Select the super-nodes */ ChooseSuperNodes(Nodes,SuperSegments,Ways); /* Select the super-segments */ SuperSegments2=CreateSuperSegments(Nodes,SuperSegments,Ways,iteration); if(SuperSegments->xnumber==SuperSegments2->xnumber) quit=1; FreeSegmentList(SuperSegments,0); SuperSegments=SuperSegments2; } /* Sort the super-segments */ SortSegmentList(SuperSegments); /* Remove duplicated super-segments */ DeduplicateSegments(SuperSegments,Nodes,Ways); iteration++; if(iteration>max_iterations) quit=1; } while(!quit); /* Combine the super-segments */ printf("\nCombine Segments and Super-Segments\n===================================\n\n"); fflush(stdout); /* Merge the super-segments */ MergedSegments=MergeSuperSegments(Segments,SuperSegments); FreeSegmentList(Segments,0); FreeSegmentList(SuperSegments,0); Segments=MergedSegments; /* Rotate segments so that node1<node2 */ RotateSegments(Segments); /* Sort the segments */ SortSegmentList(Segments); /* Remove duplicated segments */ DeduplicateSegments(Segments,Nodes,Ways); /* Cross reference the nodes and segments */ printf("\nCross-Reference Nodes and Segments\n==================================\n\n"); fflush(stdout); /* Sort the node list geographically */ SortNodeListGeographically(Nodes); /* Create the real segments and nodes */ CreateRealNodes(Nodes,iteration); CreateRealSegments(Segments,Ways); /* Fix the segment and node indexes */ IndexNodes(Nodes,Segments); IndexSegments(Segments,Nodes); /* Output the results */ printf("\nWrite Out Database Files\n========================\n\n"); fflush(stdout); /* Write out the nodes */ SaveNodeList(Nodes,FileName(dirname,prefix,"nodes.mem")); FreeNodeList(Nodes,0); /* Write out the segments */ SaveSegmentList(Segments,FileName(dirname,prefix,"segments.mem")); FreeSegmentList(Segments,0); /* Write out the ways */ SaveWayList(Ways,FileName(dirname,prefix,"ways.mem")); FreeWayList(Ways,0); return(0); }