int o_var(char *basemap, char *covermap, char *outputmap, int usecats, struct Categories *cats) { char command[1024]; FILE *stats, *reclass; int first, mem, i, count; long basecat, covercat, catb, catc; double value, vari, x; double *tab; mem = MEM * sizeof(double); tab = (double *)G_malloc(mem); sprintf(command, "r.stats -cn input=\"%s,%s\" fs=space", basemap, covermap); stats = popen(command, "r"); sprintf(command, "r.reclass i=\"%s\" o=\"%s\"", basemap, outputmap); reclass = popen(command, "w"); first = 1; while (read_stats(stats, &basecat, &covercat, &value)) { if (first) { first = 0; catb = basecat; catc = covercat; i = 0; count = 0; } if (basecat != catb) { m_var(tab, count, &vari); fprintf(reclass, "%ld = %ld %f\n", catb, catb, vari); /*fprintf (stdout, "1. %ld = %ld %f\n", catb, catb, vari); */ catb = basecat; catc = covercat; count = 0; } if (usecats) sscanf(G_get_cat((CELL) covercat, cats), "%lf", &x); else x = covercat; for (i = 0; i < value; i++) { if (count * sizeof(double) >= mem) { mem += MEM * sizeof(double); tab = (double *)G_realloc(tab, mem); /* fprintf(stderr,"MALLOC: %d KB needed\n",(int)(mem/1024)); */ } tab[count++] = x; } } if (first) { catb = catc = 0; } m_var(tab, count, &vari); fprintf(reclass, "%ld = %ld %f\n", catb, catb, vari); G_debug(5, "2. %ld = %ld %f", catb, catb, vari); pclose(stats); pclose(reclass); return (0); }
int o_var(const char *basemap, const char *covermap, const char *outputmap, int usecats, struct Categories *cats) { struct Popen stats_child, reclass_child; FILE *stats, *reclass; int first, mem, i, count; long basecat, covercat, catb, catc; double value, vari, x; double *tab; mem = MEM * sizeof(double); tab = (double *)G_malloc(mem); stats = run_stats(&stats_child, basemap, covermap, "-cn"); reclass = run_reclass(&reclass_child, basemap, outputmap); first = 1; while (read_stats(stats, &basecat, &covercat, &value)) { if (first) { first = 0; catb = basecat; catc = covercat; i = 0; count = 0; } if (basecat != catb) { m_var(tab, count, &vari); fprintf(reclass, "%ld = %ld %f\n", catb, catb, vari); /*fprintf (stdout, "1. %ld = %ld %f\n", catb, catb, vari); */ catb = basecat; catc = covercat; count = 0; } if (usecats) sscanf(Rast_get_c_cat((CELL *) &covercat, cats), "%lf", &x); else x = covercat; for (i = 0; i < value; i++) { if (count * sizeof(double) >= mem) { mem += MEM * sizeof(double); tab = (double *)G_realloc(tab, mem); /* fprintf(stderr,"MALLOC: %d KB needed\n",(int)(mem/1024)); */ } tab[count++] = x; } } if (first) { catb = catc = 0; } m_var(tab, count, &vari); fprintf(reclass, "%ld = %ld %f\n", catb, catb, vari); G_debug(5, "2. %ld = %ld %f", catb, catb, vari); G_popen_close(&stats_child); G_popen_close(&reclass_child); return 0; }