/* rmap - vector based global map generating program * Copyright (C) 2000 Reza Naima * * http://www.reza.net/rmap/ * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #include "rmap.h" #include "functions.h" int main (int argc, char **argv) { // default values struct options o; short transparent = 0; struct imageLayout scene = {500,500,0}; //and some guesses at a random initializer // misc variables char *string; char *string2; struct stat buf; int i; //the various structs for the data file // the default behaviour bzero(&o, sizeof(o)); o.zoom = 1.; o.gridlines = 1; o.desired_categories =0xFFFFFFFF; //default is all o.desired_continents =0xFFFFFFFF; //default is all // Process command line options if (argc == 1) { printf("Try `rmap -h' for more information.\n"); exit(-1); } while(1) { int c, option_index; static struct option long_options[] = { {"zoom", 1, 0, 0}, {"xrot", 1, 0, 0}, {"yrot", 1, 0, 0}, {"zrot", 1, 0, 0}, {"datafile", 1, 0, 0}, {"outfile", 1, 0, 0}, {"colorfile", 1, 0, 0}, {"continent", 1, 0, 0}, {"category", 1, 0, 0}, {"height", 1, 0, 0}, {"width", 1, 0, 0}, {"transparent", 0, 0, 0}, {"cities", 0, 0, 0}, {"nogridlines", 0, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "hv", long_options, &option_index); if (c == -1) break; switch (c) { case 0: if (!strcmp(long_options[option_index].name, "transparent")) scene.transparent = 1; if (!strcmp(long_options[option_index].name, "zoom")) o.zoom = strtod(optarg, NULL); if (!strcmp(long_options[option_index].name, "xrot")) o.xrot = strtod(optarg, NULL); //THE OPPOSITE OF THE RIGHT HAND RULE if (!strcmp(long_options[option_index].name, "yrot")) o.yrot = strtod(optarg, NULL); if (!strcmp(long_options[option_index].name, "zrot")) o.zrot = strtod(optarg, NULL); if (!strcmp(long_options[option_index].name, "height")) scene.height = atoi(optarg); if (!strcmp(long_options[option_index].name, "width")) scene.width = atoi(optarg); if (!strcmp(long_options[option_index].name, "cities")) o.cities = 1; if (!strcmp(long_options[option_index].name, "nogridlines")) o.gridlines = 0; if (!strcmp(long_options[option_index].name, "datafile")) o.mapfile = (char*) strdup(optarg); if (!strcmp(long_options[option_index].name, "colorfile")) o.colorfile = (char*) strdup(optarg); if (!strcmp(long_options[option_index].name, "outfile")) o.outfile = (char*) strdup(optarg); if (!strcmp(long_options[option_index].name, "continent")) { if (!strcmp(optarg,"all")) { o.desired_continents = 0xFFFFFFFF; break; } string = (char*) strtok(optarg, ","); if (string == NULL) { fprintf(stderr, "Invalid option to --continent, skipping\n"); break; } i = atoi(string); if (i < 1 || i > 5) { fprintf(stderr,"Continents must be in the range of 1-5\n"); break; } o.desired_continents |= (0x00000001 << (i-1)); while ((string = (char*) strtok(NULL,",")) != NULL) { i = atoi(string); if (i < 1 || i > 5) { fprintf(stderr,"Continents must be in the range of 1-5\n"); break; } o.desired_continents |= (0x00000001 << (i-1)); } } if (!strcmp(long_options[option_index].name, "category")) { if (!strcmp(optarg,"all")) { o.desired_categories = 0xFFFFFFFF; break; } string = (char*) strtok(optarg, ","); if (string == NULL) { fprintf(stderr, "Invalid option to --categories, skipping\n"); break; } i = atoi(string); if (i < 1 || i > 4) { fprintf(stderr,"Catagories must be in the range of 1-4\n"); break; } o.desired_categories |= (0x00000001 << (i-1)); while ((string = (char*) strtok(NULL,",")) != NULL) { i = atoi(string); if (i < 1 || i > 4) { fprintf(stderr,"Catagories must be in the range of 1-4\n"); break; } o.desired_categories |= (0x00000001 << (i-1)); } } break; case 'v': printf("%s version %s\n",PACKAGE,VERSION); break; case 'h': printf("Usage: rmap [--zoom=VALUE] [--xrot=VALUE] [--yrot=VALUE] [--zrot=VALUE]\n"); printf(" [--datafile=FILENAME] [--continent=LIST] [--category=LIST]\n"); printf(" [--outfile=FILENAME] [--height=PIXELS] [--width=PIXELS]\n"); printf(" [--colorfile=FILENAME] [--nogridlines] [--cities] [-h] [-v]\n"); printf("\n"); printf("\t--zoom= Zoom Value, 1=whole earth\n"); printf("\t--xrot= Rotates the earth (LATITUDE)\n"); printf("\t--yrot= Rotates the earth (LONGITUDE)\n"); printf("\t--zrot= Rotates the earth\n"); printf("\t--datafile= The datafile containing the vector data\n"); printf("\t--outfile= The filename to the image to be generated\n"); printf("\t--colorfile= The filename of the color mapping file\n"); printf("\t--continent= `all' or comma seperated list of numbers ...\n"); printf("\t\t1=Africa, 2=Asia, 3=Europe, 4=N. America, 5=S. America\n"); printf("\t--category= `all' or comma seperated list of numbers ...\n"); printf("\t\t1=US State Boundaries, 2=Rivers, 3=International Boundaries,\n\t\t4=Coasts, Islands, Lakes\n"); printf("\t--height= The height of the generated image\n"); printf("\t--width= The width of the generated image\n"); printf("\t--nogridlines Do not display grid lines\n"); printf("\t--cities Display some major cities\n"); printf("\t-h This screen\n"); printf("\t-v Version information\n"); exit(-1); break; default : printf("Try `rmap -h' for more information.\n"); exit(-1); } } // set some default values if (o.mapfile == NULL) o.mapfile = (char*) strdup(MAPFILE); //default if (o.outfile == NULL) o.outfile = (char*) strdup(OUTFILE); //default // if ~/.rmaprc exists, use that file instead (for a colormap file) if (o.colorfile == NULL) { string = getenv("HOME"); if (string != NULL) { string2 = (char*) malloc(strlen(string) + 10); if (string2 == NULL) { fprintf(stderr,"Malloc error?"); exit(-3); } strcpy(string2, string); strcat(string2, "/.rmaprc"); if (!stat(string2, &buf)) o.colorfile = string2; else { o.colorfile = (char*) strdup(COLORFILE); //default free(string2); } } } // generate the image generate(&scene, &o); return 0; }