void ReUpdateStandings(void) { int maxDrv; int curDrv; int runDrv; char *modName; int drvIdx; int points; int i, j; int found; tReStandings *standings = 0; void *results = ReInfo->results; const int BUFSIZE = 1024; char str1[BUFSIZE], str2[BUFSIZE], path[BUFSIZE], path2[BUFSIZE]; snprintf(path, BUFSIZE, "%s/%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, ReInfo->_reRaceName, RE_SECT_RANK); runDrv = GfParmGetEltNb(results, path); curDrv = GfParmGetEltNb(results, RE_SECT_STANDINGS); maxDrv = curDrv + runDrv; standings = (tReStandings *)calloc(maxDrv, sizeof(tReStandings)); /* Read the current standings */ for (i = 0; i < curDrv; i++) { snprintf(path2, BUFSIZE, "%s/%d", RE_SECT_STANDINGS, i + 1); standings[i].carName = strdup(GfParmGetStr(results, path2, RE_ATTR_NAME, 0)); standings[i].modName = strdup(GfParmGetStr(results, path2, RE_ATTR_MODULE, 0)); standings[i].drvIdx = (int)GfParmGetNum(results, path2, RE_ATTR_IDX, NULL, 0); standings[i].points = (int)GfParmGetNum(results, path2, RE_ATTR_POINTS, NULL, 0); } GfParmListClean(results, RE_SECT_STANDINGS); for (i = 0; i < runDrv; i++) { /* Search the driver in the standings */ found = 0; snprintf(path, BUFSIZE, "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, ReInfo->_reRaceName, RE_SECT_RANK, i + 1); const char* carName = GfParmGetStr(results, path, RE_ATTR_NAME, 0); for (j = 0; j < curDrv; j++) { if (!strcmp(carName, standings[j].carName)) { found = 1; break; } } if (!found) { /* Add the new driver */ curDrv++; standings[j].carName = strdup(carName); standings[j].modName = strdup(GfParmGetStr(results, path, RE_ATTR_MODULE, 0)); standings[j].drvIdx = (int)GfParmGetNum(results, path, RE_ATTR_IDX, NULL, 0); standings[j].points = (int)GfParmGetNum(results, path, RE_ATTR_POINTS, NULL, 0); } else { /* Add the new points */ standings[j].points += (int)GfParmGetNum(results, path, RE_ATTR_POINTS, NULL, 0); } /* bubble sort... */ while (j > 0) { if (standings[j - 1].points >= standings[j].points) { break; } /* Swap with preceeding */ carName = standings[j].carName; modName = standings[j].modName; drvIdx = standings[j].drvIdx; points = standings[j].points; standings[j].carName = standings[j - 1].carName; standings[j].modName = standings[j - 1].modName; standings[j].drvIdx = standings[j - 1].drvIdx; standings[j].points = standings[j - 1].points; standings[j - 1].carName = carName; standings[j - 1].modName = modName; standings[j - 1].drvIdx = drvIdx; standings[j - 1].points = points; j--; } } /* Store the standing back */ for (i = 0; i < curDrv; i++) { snprintf(path, BUFSIZE, "%s/%d", RE_SECT_STANDINGS, i + 1); GfParmSetStr(results, path, RE_ATTR_NAME, standings[i].carName); //free(standings[i].carName); GfParmSetStr(results, path, RE_ATTR_MODULE, standings[i].modName); free(standings[i].modName); GfParmSetNum(results, path, RE_ATTR_IDX, NULL, standings[i].drvIdx); GfParmSetNum(results, path, RE_ATTR_POINTS, NULL, standings[i].points); } free(standings); snprintf(str1, BUFSIZE, "%sconfig/params.dtd", GetDataDir()); snprintf(str2, BUFSIZE, "<?xml-stylesheet type=\"text/xsl\" href=\"file:///%sconfig/style.xsl\"?>", GetDataDir()); GfParmSetDTD (results, str1, str2); GfParmWriteFile(0, results, "Results"); }
void ReUpdateStandings(void) { tReStandings st; std::string drvName; std::vector<tReStandings> *standings; std::vector<tReStandings>::iterator found; std::vector<tReStandings>::iterator it; int runDrv, curDrv; int i; void *results = ReInfo->results; snprintf(path, sizeof(path), "%s/%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, ReInfo->_reRaceName, RE_SECT_RANK); runDrv = GfParmGetEltNb(results, path); curDrv = GfParmGetEltNb(results, RE_SECT_STANDINGS); standings = new std::vector<tReStandings>; standings->reserve(curDrv); /* Read the current standings */ for (i = 0; i < curDrv; i++) { snprintf(path2, sizeof(path2), "%s/%d", RE_SECT_STANDINGS, i + 1); st.drvName = GfParmGetStr(results, path2, RE_ATTR_NAME, 0); st.modName = GfParmGetStr(results, path2, RE_ATTR_MODULE, 0); st.carName = GfParmGetStr(results, path2, RE_ATTR_CAR, 0); st.extended = (int)GfParmGetNum(results, path2, RM_ATTR_EXTENDED, NULL, 0); st.drvIdx = (int)GfParmGetNum(results, path2, RE_ATTR_IDX, NULL, 0); st.points = (int)GfParmGetNum(results, path2, RE_ATTR_POINTS, NULL, 0); standings->push_back(st); }//for i //Void the stored results GfParmListClean(results, RE_SECT_STANDINGS); //Check last races' drivers and search their name in the results. //If found there, adds recent points. //If not found, adds the driver for (i = 0; i < runDrv; i++) { //Search the driver name in the standings snprintf(path, sizeof(path), "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, ReInfo->_reRaceName, RE_SECT_RANK, i + 1); drvName = GfParmGetStr(results, path, RE_ATTR_NAME, 0); found = std::find(standings->begin(), standings->end(), drvName); if(found == standings->end()) { //No such driver in the standings, let's add it st.drvName = drvName; st.modName = GfParmGetStr(results, path, RE_ATTR_MODULE, 0); st.carName = GfParmGetStr(results, path, RE_ATTR_CAR, 0); st.extended = (int)GfParmGetNum(results, path, RM_ATTR_EXTENDED, NULL, 0); st.drvIdx = (int)GfParmGetNum(results, path, RE_ATTR_IDX, NULL, 0); st.points = (int)GfParmGetNum(results, path, RE_ATTR_POINTS, NULL, 0); standings->push_back(st); } else { //Driver found, add recent points found->points += (int)GfParmGetNum(results, path, RE_ATTR_POINTS, NULL, 0); }//if found }//for i //sort standings by score std::sort(standings->begin(), standings->end(), sortByScore); //Store the standing back for(it = standings->begin(), i = 0; it != standings->end(); ++it, ++i) { snprintf(path, sizeof(path), "%s/%d", RE_SECT_STANDINGS, i + 1); GfParmSetStr(results, path, RE_ATTR_NAME, it->drvName.c_str()); GfParmSetStr(results, path, RE_ATTR_MODULE, it->modName.c_str()); GfParmSetStr(results, path, RE_ATTR_CAR, it->carName.c_str()); GfParmSetNum(results, path, RE_ATTR_IDX, NULL, (tdble)it->drvIdx); GfParmSetNum(results, path, RE_ATTR_POINTS, NULL, (tdble)it->points); }//for it delete standings; char str1[512], str2[512]; snprintf(str1, sizeof(str1), "%sconfig/params.dtd", GfDataDir()); snprintf(str2, sizeof(str2), "<?xml-stylesheet type=\"text/xsl\" href=\"file:///%sconfig/raceresults.xsl\"?>", GfDataDir()); GfParmSetDTD (results, str1, str2); GfParmWriteFile(0, results, "Results"); }//ReUpdateStandings