#include #include #include #include #include #include "local_proto.h" void get_stp_proj(char string[]) { int code; char answer[50], buff[50]; while ((code = get_stp_num()) == 0) { if (G_yes ("Are you sure you want to exit without making any changes", 0)) leave(SP_NOCHANGE); } for (;;) { do { fprintf(stderr, "\nSpecify State Plane 1927 or 1983\n"); fprintf(stderr, "Enter '27' or '83'\n"); fprintf(stderr, "Hit RETURN to cancel request\n"); fprintf(stderr, ">"); } while (!G_gets(answer)); G_strip(answer); if (strlen(answer) == 0) { leave(SP_NOCHANGE); } else if (strcmp(answer, "27") == 0) { sprintf(buff, STP1927PARAMS); break; } else if (strcmp(answer, "83") == 0) { sprintf(buff, STP1983PARAMS); break; } else fprintf(stderr, "\nInvalid Co-ordinate System Specification\n"); } if (get_stp_code(code, string, buff) == 0) G_fatal_error(_("This should not happen. See your system admin.")); return; } int get_stp_code(int code, char *string, char *paramfile) { char nad27[256], buff[256], *p; int gotit = 0, stp; FILE *fp; sprintf(nad27, "%s%s", G_gisbase(), paramfile); fp = fopen(nad27, "r"); if (fp == NULL) { sprintf(buff, "Can not open NAD27 file %s", nad27); G_fatal_error(buff); } while (!gotit) { if (fgets(buff, 200, fp) == NULL) break; if (buff[0] != '#') { sscanf(buff, "%d:", &stp); if (stp == code) { p = strtok(buff, ":"); p = strtok(NULL, "\n"); while (*p == ' ') p++; sprintf(string, "%s", p); gotit = 1; } } } fclose(fp); return (gotit); } int get_stp_num(void) { FILE *fipsfile; char FIPSfile[256], buff[256]; int NUM_ZON, sfips, cfips, SFIPS = 0, CFIPS = 0; int record, icode, reccnt, special_case; char STabbr[50], COname[50]; sprintf(FIPSfile, "%s/etc/proj/FIPS.code", G_gisbase()); for (;;) { fipsfile = fopen(FIPSfile, "r"); if (fipsfile == NULL) { G_fatal_error(_("Unable to open FIPS code file")); } ask_fips(fipsfile, &SFIPS, &CFIPS, &special_case); if (special_case == -1) { fclose(fipsfile); return (0); } /* combine SFIPS and CFIPS to make lookup */ /*DEBUG fprintf(stderr,"FIPS = %d %d\n",SFIPS,CFIPS); */ for (record = 0;; ++record) { icode = 0; reccnt++; if (fgets(buff, 80, fipsfile) == NULL) break; sscanf(buff, "%d%d%s%s%d", &sfips, &cfips, STabbr, COname, &NUM_ZON); /* compare for match */ if (SFIPS == sfips && CFIPS == cfips) { icode = 1; break; } } /* end file search */ if (icode != 0) break; else { /* no match */ G_warning(_("No match of FIPS state %d county %d"), SFIPS, CFIPS); fclose(fipsfile); } } /**** SPECIAL CASE FOR MICHIGAN ****, could be mercator or lambert */ if (SFIPS == 26) { if (special_case == 2) NUM_ZON = NUM_ZON + 10; } /**** SPECIAL CASE FOR ALASKA ***** */ if (SFIPS == 2) { NUM_ZON = NUM_ZON + special_case; } /* all done, good-bye */ fclose(fipsfile); return (NUM_ZON); } int ask_fips(FILE * fp, int *s, int *c, int *sc) { int ii, FIPS = 0, NUM_ZON, sfips, cfips; char STabbr[50], STabbr_prev[50], COname[50], answer[50], buff[256]; char *Tmp_file1, *Tmp_file2, *a, *b; FILE *Tmp_fd1 = NULL, *Tmp_fd2 = NULL; int in_stat; struct Key_Value *sf_keys, *cf_keys; *sc = 0; *s = 0; *c = 0; Tmp_file1 = G_tempfile(); if (NULL == (Tmp_fd1 = fopen(Tmp_file1, "w"))) G_fatal_error(_("Unable to open temporary file <%s>"), Tmp_file1); Tmp_file2 = G_tempfile(); if (NULL == (Tmp_fd2 = fopen(Tmp_file2, "w"))) G_fatal_error(_("Unable to open temporary file <%s>"), Tmp_file2); while (fgets(buff, 80, fp) != NULL) { sscanf(buff, "%d%d%s%s%d", &sfips, &cfips, STabbr, COname, &NUM_ZON); if (strncmp(STabbr, STabbr_prev, 2) != 0) { /* TODO CHECK THIS */ fprintf(Tmp_fd1, "%4d -- %s\n", sfips, STabbr); fprintf(Tmp_fd2, "%d:%s\n", sfips, STabbr); } sprintf(STabbr_prev, "%s", STabbr); } fclose(Tmp_fd1); fclose(Tmp_fd2); sf_keys = G_read_key_value_file(Tmp_file2, &in_stat); if (in_stat != 0) G_fatal_error(_("Reading sf key_value temp file")); for (;;) { do { fprintf(stderr, "\nSpecify State FIPS (numeric) code\n"); fprintf(stderr, "Enter 'list' for the list of states with corresponding FIPS codes\n"); fprintf(stderr, "Hit RETURN to cancel request\n"); fprintf(stderr, ">"); } while (!G_gets(answer)); G_strip(answer); if (strlen(answer) == 0) { *sc = -1; return 0; } if (strcmp(answer, "list") == 0) { char *pager; pager = getenv("GRASS_PAGER"); if (!pager || strlen(pager) == 0) pager = "cat"; /* Always print interactive output to stderr */ sprintf(buff, "%s \"%s\" 1>&2", pager, G_convert_dirseps_to_host(Tmp_file1)); G_system(buff); } else { a = G_find_key_value(answer, sf_keys); sprintf(buff, "You have chosen state %s, Correct", a); if (a == NULL) G_warning(_("Invalid State FIPS code")); else if (G_yes(buff, 1)) break; } } rewind(fp); sscanf(answer, "%d", s); FIPS = *s; /**** SPECIAL CASE FOR MICHIGAN ****, could be mercator or lambert */ if (FIPS == 26) { /* fprintf(stderr,"\nFor Michigan select- 1- East to West\n"); fprintf(stderr," 2- North to South\n: "); */ ii = 0; for (;;) { do { fprintf(stderr, "\nFor Michigan select- 1- East to West\n"); fprintf(stderr, " 2- North to South\n: "); fprintf(stderr, "Hit RETURN to cancel request\n> "); } while (!G_gets(answer)); G_strip(answer); if (strlen(answer) == 0) { *sc = -1; return 0; } sscanf(answer, "%d", &ii); if (ii != 1 && ii != 2) fprintf(stderr, "\n Invalid Entry\n "); else break; } *sc = ii; } /**** SPECIAL CASE FOR ALASKA ***** */ if (FIPS == 2) { ii = 0; for (;;) { do { fprintf(stderr, "\nFor Alaska enter the zone (1 through 9): \n"); fprintf(stderr, "Hit RETURN to cancel request\n"); fprintf(stderr, "> "); } while (!G_gets(answer)); G_strip(answer); if (strlen(answer) == 0) { *sc = -1; return 0; } sscanf(answer, "%d", &ii); if (ii < 1 || ii > 9) fprintf(stderr, "\n Invalid Entry\n "); else break; } *sc = ii; } unlink(Tmp_file1); unlink(Tmp_file2); Tmp_file1 = G_tempfile(); if (NULL == (Tmp_fd1 = fopen(Tmp_file1, "w"))) { G_fatal_error(_("Unable to open temporary file <%s>"), Tmp_file1); } Tmp_file2 = G_tempfile(); if (NULL == (Tmp_fd2 = fopen(Tmp_file2, "w"))) { G_fatal_error(_("Unable to open temporary file <%s>"), Tmp_file2); } while (fgets(buff, 80, fp) != NULL) { sscanf(buff, "%d%d%s%[A-Z ]%d", &sfips, &cfips, STabbr, COname, &NUM_ZON); G_strip(COname); if (sfips == *s) { fprintf(Tmp_fd1, "%4d -- %s\n", cfips, COname); fprintf(Tmp_fd2, "%d:%s\n", cfips, COname); } /* ADDED THESE BRACKETS - BB 5/2000 */ } fclose(Tmp_fd1); fclose(Tmp_fd2); cf_keys = G_read_key_value_file(Tmp_file2, &in_stat); if (in_stat != 0) G_fatal_error(_("Reading cf key_value temp file")); for (;;) { do { fprintf(stderr, "\nSpecify County FIPS (numeric) code for state %s\n", a); fprintf(stderr, "Enter 'list' for the list of counties in %s with corresponding FIPS codes\n", a); fprintf(stderr, "Hit RETURN to cancel request\n"); fprintf(stderr, ">"); } while (!G_gets(answer)); G_strip(answer); if (strlen(answer) == 0) { *sc = -1; return 0; } if (strcmp(answer, "list") == 0) { char *pager; pager = getenv("GRASS_PAGER"); if (!pager || strlen(pager) == 0) pager = "cat"; /* Always print interactive output to stderr */ sprintf(buff, "%s \"%s\" 1>&2", pager, G_convert_dirseps_to_host(Tmp_file1)); G_system(buff); } else { b = G_find_key_value(answer, cf_keys); sprintf(buff, "You have chosen %s county, correct", b); if (b == NULL) G_warning(_("Invalid County FIPS code")); else if (G_yes(buff, 1)) break; } } sscanf(answer, "%d", c); rewind(fp); unlink(Tmp_file1); unlink(Tmp_file2); return 0; }