diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /vendor/voclient/libvotable/examples/votcopy.c | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'vendor/voclient/libvotable/examples/votcopy.c')
-rw-r--r-- | vendor/voclient/libvotable/examples/votcopy.c | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/vendor/voclient/libvotable/examples/votcopy.c b/vendor/voclient/libvotable/examples/votcopy.c new file mode 100644 index 00000000..f8808752 --- /dev/null +++ b/vendor/voclient/libvotable/examples/votcopy.c @@ -0,0 +1,208 @@ +/** + * VOTCOPY -- Copy a VOTable to a different format. + * + * Usage: + * votcopp [-f <fmt>] [-o <fname>] <votable> + * Where + * -f <fmt> Output format (XML, CSV, TSV, HTML, etc) + * -h Print help summary + * -i <N> Indention at each level for VOTable output + * -o <fname> Name of output file + * + * --noheader Don't write a header + * --help Print help summary + * + * <votable> Name of input file to compress + */ + +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> + +#include "votParse.h" + + +int votcopy (int argc, char **argv); + +/** + * Program Main. This is just a wrapper around the interface routine. + */ +int +main (int argc, char **argv) +{ + return votcopy (argc, argv); +} + + + +/************************************************************************ + * * + * VOTCOPY -- Copy a votable to a new format, converting format if * + * needed. * + * * + ************************************************************************/ + +#define FORMATS "|vot|asv|bsv|csv|tsv|html|shtml|fits|xml" + +#define VOT 0 /* A new VOTable */ +#define ASV 1 /* ascii separated values */ +#define BSV 2 /* bar separated values */ +#define CSV 3 /* comma separated values */ +#define TSV 4 /* tab separated values */ +#define HTML 5 /* standalone HTML document */ +#define SHTML 6 /* single HTML <table> */ +#define FITS 7 /* FITS binary table */ +#define XML 8 /* VOTable alias */ + +#define SZ_FORMAT 32 + + +char *fmt = NULL; /* format string */ +int vot = 0; /* VOTable root handle */ +int indent = 0; /* indention at each level */ +int ofmt = CSV; /* format */ +int hdr = TRUE; + + +static int strdic (char *in_str, char *out_str, int maxchars, char *dict); + + +/** + * Application entry point. + */ +int +votcopy (int argc, char **argv) +{ + register int i; + int stat = OK; + char *ifname = NULL, *name = NULL, *ofname = NULL, format[SZ_FORMAT]; + + + /* Parse the argument list. + */ + if (argc < 2) { + fprintf (stderr, "Usage: votcopy [-o <fname>] [-f <fmt>] <votable>\n"); + return (1); + + } else if (argc >= 2) { + for (i=1; i < argc; i++) { + if (argv[i][0] == '-' && strlen (argv[i]) > 1) { + switch (argv[i][1]) { + case 'f': fmt = argv[++i]; break; + case 'i': indent = atoi (argv[++i]); break; + case 'o': name = argv[++i]; break; + default: + fprintf (stderr, "Invalid argument '%c'\n", argv[i][1]); + return (1); + } + } else + ifname = argv[i]; + } + } + ofname = (name ? name : "stdout"); + + + /* Open and parse the input table. + */ + if ( (vot = vot_openVOTABLE (ifname) ) <= 0) { + fprintf (stderr, "Error opening VOTable '%s'\n", ifname); + return (ERR); + } + + /* Output the new format. + */ + switch (strdic (fmt, format, SZ_FORMAT, FORMATS)) { + case VOT: vot_writeVOTable (vot, ofname, indent); break; + case ASV: vot_writeASV (vot, ofname); break; + case BSV: vot_writeBSV (vot, ofname); break; + case CSV: vot_writeCSV (vot, ofname); break; + case TSV: vot_writeTSV (vot, ofname); break; + case HTML: vot_writeHTML (vot, ifname, ofname); break; + case SHTML: vot_writeSHTML (vot, ifname, ofname); break; + case FITS: vot_writeFITS (vot, ofname); break; + case XML: vot_writeVOTable (vot, ofname, indent); break; + default: + fprintf (stderr, "Unknown output format '%s'\n", format); + stat = ERR; + } + vot_closeVOTABLE (vot); /* close the table */ + + return (stat); +} + + +/** + * STRDIC -- Search a dictionary string for a match with an input string. + * The input string may be an abbreviation of a dictionary entry, however, + * it is an error if the abbreviation is not unique. The entries in the + * dictionary string are separated by a delimiter character which is the + * first character of the dictionary string. The full name of the matched + * dictionary entry found is returned in out_str; the function value is + * the word index of the dictionary entry. The output string may be the + * same as the input string. + */ + +#include <ctype.h> + +static int strdic ( + char *in_str, /* Input string, always lower case */ + char *out_str, /* Output string as found in dictionary */ + int maxchars, /* Maximum length of output string */ + char *dict /* Dictionary string */ +) +{ + char ch, fch; + int start, len, ip, i, match, entry; + + + if (dict == NULL || dict[0] == '\0') + return (0); + + for (i=0; isspace(in_str[i]); i++) + ; + + start = i; + match = 0; + ip = 1; + len = strlen (&in_str[start]); + fch = in_str[start]; + + + /* Search the dictionary string. If the input string matches a + * dictionary entry it is either an exact match (len = dictionary + * entry length) or a legal abbreviation. If an abbreviation + * matches two entries it is ambiguous and an error. + */ + for (entry=0; dict[ip] != '\0'; entry=entry+1) { + if (dict[ip] == fch) { + if (strncmp (&dict[ip], &in_str[start], len) == 0) { + for (i=0; i < maxchars; i++) { + ch = dict[ip+i-1]; + if ((ch == dict[0]) || (ch == '\0')) + break; + out_str[i] = ch; + } + out_str[i] = '\0'; + + if ((dict[ip+len] == dict[0]) || (dict[ip+len] == '\0')) + return (entry); /* exact match */ + else { + /* If we already have a match and the new match is not + * exact, then the abbreviation is ambiguous. + */ + if (match != 0) + return (0); + else + match = entry; + } + } + } + + do { + ip = ip + 1; + } while (dict[ip-1] != dict[0] && dict[ip] != '\0'); + } + + return (match); +} |