Commit 38ae1f12 authored by Jerome Benoit's avatar Jerome Benoit

Merge tag 'upstream/0.999c'

Upstream version 0.999c
parents 02c54b93 be25710e
......@@ -8,6 +8,9 @@ https://github.com/b-k/Apophenia/commits/master
!!Big.
]
October 2014
** apop_model_stack --> apop_model_cross
August 2014
** default for apop_data_pack is .all_pages='y' (was 'n').
** remove apop_plot_lattice, apop_plot_triangle, apop_plot_line_and_scatter, apop_plot_qq.
......
This diff is collapsed.
This diff is collapsed.
......@@ -8,6 +8,9 @@ https://github.com/b-k/Apophenia/commits/master
!!Big.
]
October 2014
** apop_model_stack --> apop_model_cross
August 2014
** default for apop_data_pack is .all_pages='y' (was 'n').
** remove apop_plot_lattice, apop_plot_triangle, apop_plot_line_and_scatter, apop_plot_qq.
......
This diff is collapsed.
This diff is collapsed.
......@@ -216,8 +216,6 @@ freed location, and you can later safely test conditions like <tt>if (data) ...<
#define apop_data_free(freeme) (apop_data_free_base(freeme) ? 0 : ((freeme)= NULL))
char apop_data_free_base(apop_data *freeme);
apop_data * apop_matrix_to_data(gsl_matrix *m); //deprecated
apop_data * apop_vector_to_data(gsl_vector *v); //deprecated
#ifdef APOP_NO_VARIADIC
apop_data * apop_data_alloc(const size_t size1, const size_t size2, const int size3) ;
#else
......@@ -445,7 +443,7 @@ extern apop_model *apop_coordinate_transform;
extern apop_model *apop_composition;
extern apop_model *apop_dconstrain;
extern apop_model *apop_mixture;
extern apop_model *apop_stack;
extern apop_model *apop_cross;
/** Alias for the \ref apop_normal distribution, qv.
\hideinitializer */
......@@ -485,9 +483,9 @@ apop_model *apop_model_set_parameters_base(apop_model *in, double ap[]);
#define apop_model_mixture(...) apop_model_mixture_base((apop_model *[]){__VA_ARGS__, NULL})
apop_model *apop_model_mixture_base(apop_model **inlist);
//transform/apop_model_stack.c.
apop_model *apop_model_stack_base(apop_model *mlist[]);
#define apop_model_stack(...) apop_model_stack_base((apop_model *[]){__VA_ARGS__, NULL})
//transform/apop_model_cross.c.
apop_model *apop_model_cross_base(apop_model *mlist[]);
#define apop_model_cross(...) apop_model_cross_base((apop_model *[]){__VA_ARGS__, NULL})
//The variadic versions, with lots of options to input extra parameters to the
//function being mapped/applied
......@@ -2112,7 +2110,7 @@ typedef struct {
char *splitpage; /**< The name of the page at which to split the data. If \c NULL, I send the entire data set to both models as needed. */
apop_model *model1; /**< The first model in the stack.*/
apop_model *model2; /**< The second model.*/
} apop_stack_settings;
} apop_cross_settings;
typedef struct {
apop_data *(*base_to_transformed)(apop_data*);
......@@ -2169,7 +2167,7 @@ Apop_settings_declarations(apop_cdf)
Apop_settings_declarations(apop_arms)
Apop_settings_declarations(apop_mcmc)
Apop_settings_declarations(apop_loess)
Apop_settings_declarations(apop_stack)
Apop_settings_declarations(apop_cross)
Apop_settings_declarations(apop_mixture)
Apop_settings_declarations(apop_dconstrain)
Apop_settings_declarations(apop_composition)
......
......@@ -241,7 +241,7 @@ void invert(double prob, arms_state *env, POINT *p){
assert(isfinite(q->y));
/* guard against imprecision yielding point outside interval */
if ((p->x < xl) || (p->x > xr)) exit(1);
Apop_stopif( ((p->x < xl) || (p->x > xr)), return,-5, "imprecision yields point outside interval");
}
int test(arms_state *env, POINT *p, apop_arms_settings *params, gsl_rng *r){
......@@ -364,7 +364,8 @@ int update(arms_state *env, POINT *p, apop_arms_settings *params){
q->pl = p->pl;
m->pr->pl = m;
q->pl->pr = q;
} else exit(10);// this should be impossible
} else
Apop_stopif(1, return 1,-5, "unexpected event"); // this should be impossible
/* now adjust position of q within interval if too close to an endpoint */
ql = q->pl->pl ? q->pl->pl : q->pl;
......@@ -503,8 +504,8 @@ int meet (POINT *q, arms_state *env, apop_arms_settings *params){
double area(POINT *q){
/* To integrate piece of exponentiated envelope to left of POINT q */
if(q->pl == NULL) // this is leftmost point in envelope
exit(1);
if(q->pl == NULL) // this is leftmost point in envelope
Apop_stopif(1, return GSL_NAN,-5, "leftmost point in envelope");
if(q->pl->x == q->x) // interval is zero length
return 0.;
if (fabs(q->y - q->pl->y) < YEPS) // integrate straight line piece
......
......@@ -81,7 +81,7 @@ apop_varad_head(char *, apop_text_paste){
char * apop_text_paste_base(apop_data const *strings, char *between, char *before, char *after, char *between_cols, apop_fn_riip prune, void *prune_parameter){
#endif
char *prior_line=NULL, *oneline=NULL, *out = before ? strdup(before) : NULL;
for (int i=0; i< strings->textsize[0]; i++){
for (int i=0; i< ((!strings || !strings->textsize)? 0 : *strings->textsize); i++){
free(oneline); oneline = NULL;
for (int j=0; j< strings->textsize[1]; j++){
if (prune && !prune((apop_data*)strings, i, j, prune_parameter)) continue;
......
......@@ -443,7 +443,7 @@ extern char *apop_nul_string;
typedef struct {int ct; int eof;} line_parse_t;
static line_parse_t parse_a_fixed_line(FILE *infile, apop_data *fn, int const *field_ends){
char c = fgetc(infile);
int c = fgetc(infile);
int ct = 0, posn=0, thisflen=0, needfield=1;
while(c!='\n' && c !=EOF){
posn++;
......@@ -480,17 +480,19 @@ typedef struct{
} apop_char_info;
static const size_t bs=1e5;
static char get_next(char *buffer, size_t *ptr, FILE *infile){
static int get_next(char *buffer, size_t *ptr, FILE *infile){
int r;
if (*ptr>=bs){
size_t len=fread(buffer, 1, bs, infile);
if (len < bs) buffer[len]=EOF;
if (len < bs) buffer[len]=(char)-1;
*ptr=0;
}
return buffer[(*ptr)++];
r = buffer[(*ptr)++];
return r == (char)-1 ? EOF : r;
}
static apop_char_info parse_next_char(char *buffer, size_t *ptr, FILE *f, char const *delimiters){
char c = get_next(buffer, ptr, f);
int c = get_next(buffer, ptr, f);
int is_delimiter = !!strchr(delimiters, c);
return (apop_char_info){.c=c,
.type = (c==' '||c=='\r' ||c=='\t' || c==0)? (is_delimiter ? 'W' : 'w')
......@@ -517,7 +519,7 @@ static line_parse_t parse_a_line(FILE *infile, char *buffer, size_t *ptr, apop_d
ci = parse_next_char(buffer, ptr, infile, delimiters);
//comments are to end of line, so they're basically a newline.
if (ci.type=='#' && !(inq||inqq)){
for(char c='x'; (c!='\n' && c!=EOF); )
for(int c='x'; (c!='\n' && c!=EOF); )
c = get_next(buffer, ptr, infile);
ci.type='n';
}
......
......@@ -123,49 +123,6 @@ apop_varad_head(apop_data *, apop_data_calloc){
return setme;
}
/** Deprecated; please do not use. Just use a compound literal:
\code
//Given:
gsl_vector *v;
gsl_matrix *m;
// Then this form wraps the elements into \ref apop_data structs. Note that
// these are not pointers: they're automatically allocated and therefore
// the extra memory use for the wrapper is cleaned up on exit from scope.
apop_data *dv = &(apop_data){.vector=v};
apop_data *dm = &(apop_data){.matrix=m};
apop_data *v_dot_m = apop_dot(dv, dm);
//Here is a macro to hide C's ugliness:
#define As_data(...) (&(apop_data){__VA_ARGS__})
apop_data *v_dot_m2 = apop_dot(As_data(.vector=v), As_data(.matrix=m));
//The wrapped object is an automatically-allocated structure pointing to the
//original data. If it needs to persist or be separate from the original,
//make a copy:
apop_data *dm_copy = apop_data_copy(As_data(.vector=v, .matrix=m));
\endcode
*/
apop_data * apop_matrix_to_data(gsl_matrix *m){
Apop_stopif(!m, return apop_data_alloc(), 1, "Converting a NULL matrix to a blank apop_data structure.");
apop_data *setme = apop_data_alloc();
setme->matrix = m;
return setme;
}
/** Deprecated; please do not use. Just use a compound literal, as in the code sample in
the documentation for \ref apop_matrix_to_data. */
apop_data * apop_vector_to_data(gsl_vector *v){
Apop_stopif(!v, return apop_data_alloc(), 1, "Converting a NULL vector to a blank apop_data structure.");
apop_data *setme = apop_data_alloc();
setme->vector = v;
return setme;
}
/*For a touch of space saving, blank strings in a text grid
all point to the same nul string. */
char *apop_nul_string = "";
......@@ -455,7 +412,7 @@ apop_varad_head(apop_data *, apop_data_stack){
"The first data set has %zu columns of text and the second has %zu columns. "
"I can't stack that.", out->textsize[1], m2->textsize[1]);
int basetextsize = out->textsize[0];
apop_text_alloc(out, basetextsize+m2->textsize[0], out->textsize[1]);
apop_text_alloc(out, basetextsize+m2->textsize[0], m2->textsize[1]);
Apop_stopif(out->error, return out, 0, "Allocation error.");
for(int i=0; i< m2->textsize[0]; i++)
for(int j=0; j< m2->textsize[1]; j++)
......@@ -468,7 +425,7 @@ apop_varad_head(apop_data *, apop_data_stack){
"The first data set has %zu rows of text and the second has %zu rows. "
"I can't stack that.", out->textsize[0], m2->textsize[0]);
int basetextsize = out->textsize[1];
apop_text_alloc(out, out->textsize[0], basetextsize+m2->textsize[1]);
apop_text_alloc(out, m2->textsize[0], basetextsize+m2->textsize[1]);
Apop_stopif(out->error, out->error='a'; return out, 0, "Allocation error.");
for(int i=0; i< m2->textsize[0]; i++)
for(int j=0; j< m2->textsize[1]; j++)
......
......@@ -538,7 +538,7 @@ static int run_prepared_statements(apop_data const *set, sqlite3_stmt *p_stmt){
Get_vmsizes(set) //firstcol, msize1, maxsize
for (size_t row=0; row < maxsize; row++){
size_t field =1;
if (set->names->rowct>row){
if (set->names && set->names->rowct>row){
if (!strlen(set->names->row[row])) field++; //leave NULL and cleared
Apop_stopif(sqlite3_bind_text(p_stmt, field++, set->names->row[row], -1, SQLITE_TRANSIENT),
return -1, apop_errorlevel,
......@@ -612,7 +612,7 @@ int apop_data_to_db(const apop_data *set, const char *tabname, const char output
int i,j;
char *q;
char comma = ' ';
int use_row = strlen(apop_opts.db_name_column)
int use_row = strlen(apop_opts.db_name_column) && set->names
&& ((set->matrix && set->names->rowct == set->matrix->size1)
|| (set->vector && set->names->rowct == set->vector->size));
......@@ -630,7 +630,7 @@ int apop_data_to_db(const apop_data *set, const char *tabname, const char output
comma = ',';
}
if (set->vector){
if(!set->names->vector)
if(!set->names || !set->names->vector)
qxprintf(&q, "%s%c\n vector double ", q, comma);
else
qxprintf(&q, "%s%c\n %s double ", q,comma, set->names->vector);
......@@ -638,14 +638,14 @@ int apop_data_to_db(const apop_data *set, const char *tabname, const char output
}
if (set->matrix)
for(i=0;i< set->matrix->size2; i++){
if(set->names->colct <= i)
if(!set->names || set->names->colct <= i)
qxprintf(&q, "%s%c\n c%i double ", q, comma,i);
else
qxprintf(&q, "%s%c\n %s double ", q, comma, set->names->col[i]);
comma = ',';
}
for(i=0;i< set->textsize[1]; i++){
if (set->names->textct <= i)
if (!set->names || set->names->textct <= i)
qxprintf(&q, "%s%c\n tc%i varchar(1000) ", q, comma,i);
else
qxprintf(&q, "%s%c\n %s varchar(1000) ", q, comma, set->names->text[i]);
......@@ -668,20 +668,20 @@ int apop_data_to_db(const apop_data *set, const char *tabname, const char output
comma = ',';
}
if (set->vector){
if (!set->names->vector) qxprintf(&q, "%s%c\n vector numeric", q, comma);
if (!set->names || !set->names->vector) qxprintf(&q, "%s%c\n vector numeric", q, comma);
else qxprintf(&q, "%s%c\n \"%s\"", q, comma, set->names->vector);
comma = ',';
}
if (set->matrix)
for(i=0;i< set->matrix->size2; i++){
if(set->names->colct <= i)
if(!set->names || set->names->colct <= i)
qxprintf(&q, "%s%c\n c%i numeric", q, comma,i);
else
qxprintf(&q, "%s%c\n \"%s\" numeric", q, comma, set->names->col[i]);
comma = ',';
}
for(i=0; i< set->textsize[1]; i++){
if(set->names->textct <= i) qxprintf(&q, "%s%c\n tc%i ", q, comma, i);
if(!set->names || set->names->textct <= i) qxprintf(&q, "%s%c\n tc%i ", q, comma, i);
else qxprintf(&q, "%s%c\n %s ", q, comma, set->names->text[i]);
comma = ',';
}
......@@ -693,7 +693,7 @@ int apop_data_to_db(const apop_data *set, const char *tabname, const char output
}
Get_vmsizes(set) //firstcol, msize2, maxsize
int col_ct = !!set->names->rowct + set->textsize[1] + msize2 - firstcol + !!set->weights;
int col_ct = (set->names ? !!set->names->rowct : 0) + set->textsize[1] + msize2 - firstcol + !!set->weights;
Apop_stopif(!col_ct, return -1, 0, "Input data set has zero columns of data (no rownames, text, matrix, vector, or weights). I can't create a table like that, sorry.");
if(apop_use_sqlite_prepared_statements(col_ct)){
sqlite3_stmt *statement;
......
......@@ -271,7 +271,8 @@ apop_varad_head(apop_data *, apop_model_numerical_covariance){
printf("The estimated Hessian:\n");
apop_data_show(hessian);
}
apop_data *out = apop_matrix_to_data(apop_matrix_inverse(hessian->matrix));
apop_data *out = apop_data_alloc();
out->matrix = apop_matrix_inverse(hessian->matrix);
gsl_matrix_scale(out->matrix, -1);
if (hessian->names->row){
apop_name_stack(out->names, hessian->names, 'r');
......
......@@ -253,11 +253,11 @@ static void apop_data_print_core(const apop_data *data, FILE *f, char displaytyp
start = (data->vector)? -1 : 0,
end = (data->matrix)? data->matrix->size2 : 0,
rowend = (data->matrix)? data->matrix->size1 : (data->vector) ? data->vector->size : data->text ? data->textsize[0] : -1;
if (data->names->title && strlen(data->names->title))
if (data->names && data->names->title && strlen(data->names->title))
fprintf(f, "\t%s\n\n", data->names->title);
if (data->names->rowct)
if (data->names && data->names->rowct)
L = get_max_strlen(data->names->row, data->names->rowct);
if (data->names->rowct && (data->names->vector || data->names->colct || data->names->textct))
if (data->names && data->names->rowct && (data->names->vector || data->names->colct || data->names->textct))
fprintf(f, "%*s ", L+2, " ");
if (data->vector && data->names->vector){
fprintf(f, "%s", data->names->vector);
......@@ -267,7 +267,8 @@ static void apop_data_print_core(const apop_data *data, FILE *f, char displaytyp
fprintf(f, "%c ", data->names->vector ? ' ' : '\t' );
a_pipe(f, displaytype);
}
for(i=0; i< data->names->colct; i++){
if (data->names)
for(i=0; i< data->names->colct; i++){
if (i < data->names->colct -1)
fprintf(f, "%s%s", data->names->col[i], apop_opts.output_delimiter);
else
......@@ -277,17 +278,18 @@ static void apop_data_print_core(const apop_data *data, FILE *f, char displaytyp
if (data->textsize[1] && data->names->textct){
if ((data->vector && data->names->vector) || (data->matrix && data->names->colct))
a_pipe(f, displaytype);
for(i=0; i< data->names->textct; i++){
if (data->names)
for(i=0; i< data->names->textct; i++){
if (i < data->names->textct -1)
fprintf(f, "%s%s", data->names->text[i], apop_opts.output_delimiter);
else
fprintf(f, "%s", data->names->text[i]);
}
}
if(data->names->vector || data->names->colct || data->names->textct)
if(data->names && (data->names->vector || data->names->colct || data->names->textct))
fprintf(f, "\n");
for(j=0; j< rowend; j++){
if (data->names->rowct > j)
if (data->names && data->names->rowct > j)
fprintf(f, "%*s%s", L+2, data->names->row[j], apop_opts.output_delimiter);
for(i=start; i< end; i++){
if ((i < 0 && j < data->vector->size) || (i>= 0 && j < data->matrix->size1 && i < data->matrix->size2))
......@@ -372,20 +374,11 @@ apop_varad_head(void, apop_matrix_print){
fprintf(output_pipe, "NULL\n");
return;
}
apop_data *d = apop_data_alloc();
d->matrix=(gsl_matrix *) data; //cheating on the const qualifier
apop_data_print(d, Output_vars);
d->matrix=NULL;
apop_data_free(d);
apop_data_print(&(apop_data){.matrix=(gsl_matrix*)data}, Output_vars); //cheating on the const qualifier
}
/** Dump a <tt>gsl_matrix</tt> to the screen.
You may want to set \ref apop_opts_type "apop_opts.output_delimiter".
\li This function uses the \ref designated syntax for inputs.
/** Convenience function to dump a <tt>gsl_matrix</tt> to the screen.
\ingroup apop_print */
void apop_matrix_show(const gsl_matrix *data){
apop_data *dtmp = apop_matrix_to_data((gsl_matrix*) data);
apop_data_print_core(dtmp, stdout, 's');
dtmp->matrix = NULL;
apop_data_free(dtmp);
apop_data_print_core(&(apop_data){.matrix=(gsl_matrix*)data}, stdout, 's');
}
......@@ -11,8 +11,6 @@ apop_name_copy;
apop_name_find;
apop_data_add_names_base;
apop_data_free_base;
apop_matrix_to_data;
apop_vector_to_data;
apop_data_alloc_base;
variadic_apop_data_alloc;
apop_data_calloc_base;
......@@ -99,7 +97,7 @@ apop_coordinate_transform;
apop_composition;
apop_dconstrain;
apop_mixture;
apop_stack;
apop_cross;
apop_model_free;
apop_model_print;
apop_model_show;
......@@ -117,7 +115,7 @@ apop_predict;
apop_beta_from_mean_var;
apop_model_set_parameters_base;
apop_model_mixture_base;
apop_model_stack_base;
apop_model_cross_base;
apop_map_base;
variadic_apop_map;
apop_map_sum_base;
......@@ -312,9 +310,9 @@ apop_mcmc_settings_free;
apop_loess_settings_init;
apop_loess_settings_copy;
apop_loess_settings_free;
apop_stack_settings_init;
apop_stack_settings_copy;
apop_stack_settings_free;
apop_cross_settings_init;
apop_cross_settings_copy;
apop_cross_settings_free;
apop_mixture_settings_init;
apop_mixture_settings_copy;
apop_mixture_settings_free;
......
prefix=/usr
exec_prefix=${prefix}
bindir=${exec_prefix}/bin
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: Apophenia
Description: The Apophenia library
Version: 0.999
Libs: -L${exec_prefix}/lib -lapophenia -lsqlite3 -lgsl -lgslcblas -lm
Cflags: -g -O2
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
#! /bin/sh
# test-driver - basic testsuite driver script.
scriptversion=2012-06-27.10; # UTC
# Copyright (C) 2011-2013 Free Software Foundation, Inc.
#
# 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, 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, see <http://www.gnu.org/licenses/>.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# This file is maintained in Automake, please report
# bugs to <bug-automake@gnu.org> or send patches to
# <automake-patches@gnu.org>.
# Make unconditional expansion of undefined variables an error. This
# helps a lot in preventing typo-related bugs.
set -u
usage_error ()
{
echo "$0: $*" >&2
print_usage >&2
exit 2
}
print_usage ()
{
cat <<END
Usage:
test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
[--expect-failure={yes|no}] [--color-tests={yes|no}]
[--enable-hard-errors={yes|no}] [--] TEST-SCRIPT
The '--test-name', '--log-file' and '--trs-file' options are mandatory.
END
}
# TODO: better error handling in option parsing (in particular, ensure
# TODO: $log_file, $trs_file and $test_name are defined).
test_name= # Used for reporting.
log_file= # Where to save the output of the test script.
trs_file= # Where to save the metadata of the test run.
expect_failure=no
color_tests=no
enable_hard_errors=yes
while test $# -gt 0; do
case $1 in
--help) print_usage; exit $?;;
--version) echo "test-driver $scriptversion"; exit $?;;
--test-name) test_name=$2; shift;;
--log-file) log_file=$2; shift;;
--trs-file) trs_file=$2; shift;;
--color-tests) color_tests=$2; shift;;
--expect-failure) expect_failure=$2; shift;;
--enable-hard-errors) enable_hard_errors=$2; shift;;
--) shift; break;;
-*) usage_error "invalid option: '$1'";;
esac
shift
done
if test $color_tests = yes; then
# Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
red='' # Red.
grn='' # Green.
lgn='' # Light green.
blu='' # Blue.
mgn='' # Magenta.
std='' # No color.
else
red= grn= lgn= blu= mgn= std=
fi
do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
trap "st=129; $do_exit" 1
trap "st=130; $do_exit" 2
trap "st=141; $do_exit" 13
trap "st=143; $do_exit" 15
# Test script is run here.
"$@" >$log_file 2>&1
estatus=$?
if test $enable_hard_errors = no && test $estatus -eq 99; then
estatus=1
fi
case $estatus:$expect_failure in
0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
0:*) col=$grn res=PASS recheck=no gcopy=no;;
77:*) col=$blu res=SKIP recheck=no gcopy=yes;;
99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;;
*:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;;
*:*) col=$red res=FAIL recheck=yes gcopy=yes;;
esac
# Report outcome to console.
echo "${col}${res}${std}: $test_name"
# Register the test result, and other relevant metadata.
echo ":test-result: $res" > $trs_file
echo ":global-test-result: $res" >> $trs_file
echo ":recheck: $recheck" >> $trs_file
echo ":copy-in-global-log: $gcopy" >> $trs_file
# Local Variables:
# mode: shell-script
# sh-indentation: 2
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-time-zone: "UTC"
# time-stamp-end: "; # UTC"
# End:
This diff is collapsed.
......@@ -7,7 +7,8 @@ Command line utility to convert a three-column table to a crosstab.*/
#include <unistd.h>
int main(int argc, char **argv){
char c, verbose=0;
int c;
char verbose=0;
char const *msg="Usage: %s [opts] dbname table_name rows columns data\n"
"\n"
"A command-line wrapper for the apop_db_to_crosstab function.\n"
......
......@@ -89,7 +89,8 @@ void print_out(FILE *f, char *outfile, gsl_matrix *m){
}
int main(int argc, char **argv){
char c, *q = NULL,
int c;
char *q = NULL,
*d = NULL,
*outfile = NULL;
int sf = 0,
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.