more work on sorting

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@1159 57a11ea4-9604-0410-9ed3-97b8803252fd
zzzoldfeatures/xacc-12-patch
Linas Vepstas 28 years ago
parent 497fa63f63
commit 4982b628a0

@ -11,8 +11,24 @@
* created by Linas Vepstas Sept 1998
* Copyright (c) 1998 Linas Vepstas
*/
/********************************************************************\
* 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., 675 Mass Ave, Cambridge, MA 02139, USA. *
\********************************************************************/
#include <limits.h>
#include <strings.h>
#include "config.h"
@ -162,9 +178,295 @@ xaccQuerySetMaxSplits (Query *q, int max)
/* ================================================== */
#define PROLOG \
char *da, *db; \
Transaction *ta; \
Transaction *tb; \
int retval; \
\
if ( (*sa) && !(*sb) ) return -1; \
if ( !(*sa) && (*sb) ) return +1; \
if ( !(*sa) && !(*sb) ) return 0; \
\
ta = (*sa)->parent; \
tb = (*sb)->parent; \
\
if ( (ta) && !(tb) ) return -1; \
if ( !(ta) && (tb) ) return +1; \
if ( !(ta) && !(tb) ) return 0; \
#define CDATE { \
/* if dates differ, return */ \
if ( (ta->date_posted.tv_sec) < \
(tb->date_posted.tv_sec)) { \
return -1; \
} else \
if ( (ta->date_posted.tv_sec) > \
(tb->date_posted.tv_sec)) { \
return +1; \
} \
\
/* else, seconds match. check nanoseconds */ \
if ( (ta->date_posted.tv_nsec) < \
(tb->date_posted.tv_nsec)) { \
return -1; \
} else \
if ( (ta->date_posted.tv_nsec) > \
(tb->date_posted.tv_nsec)) { \
return +1; \
} \
}
#define CNUM { \
/* sort on transaction number */ \
da = ta->num; \
db = tb->num; \
if (da && db) { \
retval = strcmp (da, db); \
/* if strings differ, return */ \
if (retval) return retval; \
} else \
if (!da && db) { \
return -1; \
} else \
if (da && !db) { \
return +1; \
} \
}
#define CMEMO { \
/* sort on memo strings */ \
da = (*sa)->memo; \
db = (*sb)->memo; \
if (da && db) { \
retval = strcmp (da, db); \
/* if strings differ, return */ \
if (retval) return retval; \
} else \
if (!da && db) { \
return -1; \
} else \
if (da && !db) { \
return +1; \
} \
}
#define CDESC { \
/* sort on transaction strings */ \
da = ta->description; \
db = tb->description; \
if (da && db) { \
retval = strcmp (da, db); \
/* if strings differ, return */ \
if (retval) return retval; \
} else \
if (!da && db) { \
return -1; \
} else \
if (da && !db) { \
return +1; \
} \
}
#define CAMT { \
double fa, fb; \
fa = ((*sa)->damount) * ((*sa)->share_price); \
fb = ((*sb)->damount) * ((*sb)->share_price); \
if (fa < fb) { \
return -1; \
} else \
if (fa > fb) { \
return +1; \
} \
}
#define DECLARE(ONE,TWO,THREE,FOUR,FIVE) \
static int Sort_##ONE##_##TWO##_##THREE##_##FOUR##_##FIVE \
(Split **sa, Split **sb) \
{ \
PROLOG; \
C##ONE; C##TWO; C##THREE; C##FOUR; C##FIVE; \
return 0; \
}
/* ================================================== */
/*
#!/usr/bin/perl
#
# This is a short perl script that prints all permutations
# of five objects; should be easy to generalize to more.
sub rotate {
local ($n, $i);
$n = $_[0];
$tmp = $arr[0];
for ($i=0; $i<$n-1; $i++) {
$arr[$i] = $arr[$i+1];
}
$arr[$n-1] = $tmp;
}
sub recur {
local ($n, $i);
$n = $_[0];
if (2>=$n) {
print "DECLARE ($arr[0], $arr[1], $arr[2], $arr[3],$arr[4])\n";
return;
}
for ($i=0; $i<$n-1; $i++) {
&rotate ($n-1);
&recur ($n-1);
}
}
@arr=(DESC,MEMO,AMT,NUM,DATE);
&recur (6);
*/
/* ================================================== */
DECLARE (DATE, NUM, AMT, MEMO,DESC)
DECLARE (NUM, DATE, AMT, MEMO,DESC)
DECLARE (AMT, DATE, NUM, MEMO,DESC)
DECLARE (DATE, AMT, NUM, MEMO,DESC)
DECLARE (NUM, AMT, DATE, MEMO,DESC)
DECLARE (AMT, NUM, DATE, MEMO,DESC)
DECLARE (MEMO, DATE, NUM, AMT,DESC)
DECLARE (DATE, MEMO, NUM, AMT,DESC)
DECLARE (NUM, MEMO, DATE, AMT,DESC)
DECLARE (MEMO, NUM, DATE, AMT,DESC)
DECLARE (DATE, NUM, MEMO, AMT,DESC)
DECLARE (NUM, DATE, MEMO, AMT,DESC)
DECLARE (AMT, MEMO, DATE, NUM,DESC)
DECLARE (MEMO, AMT, DATE, NUM,DESC)
DECLARE (DATE, AMT, MEMO, NUM,DESC)
DECLARE (AMT, DATE, MEMO, NUM,DESC)
DECLARE (MEMO, DATE, AMT, NUM,DESC)
DECLARE (DATE, MEMO, AMT, NUM,DESC)
DECLARE (NUM, AMT, MEMO, DATE,DESC)
DECLARE (AMT, NUM, MEMO, DATE,DESC)
DECLARE (MEMO, NUM, AMT, DATE,DESC)
DECLARE (NUM, MEMO, AMT, DATE,DESC)
DECLARE (AMT, MEMO, NUM, DATE,DESC)
DECLARE (MEMO, AMT, NUM, DATE,DESC)
DECLARE (DESC, DATE, NUM, AMT,MEMO)
DECLARE (DATE, DESC, NUM, AMT,MEMO)
DECLARE (NUM, DESC, DATE, AMT,MEMO)
DECLARE (DESC, NUM, DATE, AMT,MEMO)
DECLARE (DATE, NUM, DESC, AMT,MEMO)
DECLARE (NUM, DATE, DESC, AMT,MEMO)
DECLARE (AMT, DESC, DATE, NUM,MEMO)
DECLARE (DESC, AMT, DATE, NUM,MEMO)
DECLARE (DATE, AMT, DESC, NUM,MEMO)
DECLARE (AMT, DATE, DESC, NUM,MEMO)
DECLARE (DESC, DATE, AMT, NUM,MEMO)
DECLARE (DATE, DESC, AMT, NUM,MEMO)
DECLARE (NUM, AMT, DESC, DATE,MEMO)
DECLARE (AMT, NUM, DESC, DATE,MEMO)
DECLARE (DESC, NUM, AMT, DATE,MEMO)
DECLARE (NUM, DESC, AMT, DATE,MEMO)
DECLARE (AMT, DESC, NUM, DATE,MEMO)
DECLARE (DESC, AMT, NUM, DATE,MEMO)
DECLARE (DATE, NUM, AMT, DESC,MEMO)
DECLARE (NUM, DATE, AMT, DESC,MEMO)
DECLARE (AMT, DATE, NUM, DESC,MEMO)
DECLARE (DATE, AMT, NUM, DESC,MEMO)
DECLARE (NUM, AMT, DATE, DESC,MEMO)
DECLARE (AMT, NUM, DATE, DESC,MEMO)
DECLARE (MEMO, DESC, DATE, NUM,AMT)
DECLARE (DESC, MEMO, DATE, NUM,AMT)
DECLARE (DATE, MEMO, DESC, NUM,AMT)
DECLARE (MEMO, DATE, DESC, NUM,AMT)
DECLARE (DESC, DATE, MEMO, NUM,AMT)
DECLARE (DATE, DESC, MEMO, NUM,AMT)
DECLARE (NUM, MEMO, DESC, DATE,AMT)
DECLARE (MEMO, NUM, DESC, DATE,AMT)
DECLARE (DESC, NUM, MEMO, DATE,AMT)
DECLARE (NUM, DESC, MEMO, DATE,AMT)
DECLARE (MEMO, DESC, NUM, DATE,AMT)
DECLARE (DESC, MEMO, NUM, DATE,AMT)
DECLARE (DATE, NUM, MEMO, DESC,AMT)
DECLARE (NUM, DATE, MEMO, DESC,AMT)
DECLARE (MEMO, DATE, NUM, DESC,AMT)
DECLARE (DATE, MEMO, NUM, DESC,AMT)
DECLARE (NUM, MEMO, DATE, DESC,AMT)
DECLARE (MEMO, NUM, DATE, DESC,AMT)
DECLARE (DESC, DATE, NUM, MEMO,AMT)
DECLARE (DATE, DESC, NUM, MEMO,AMT)
DECLARE (NUM, DESC, DATE, MEMO,AMT)
DECLARE (DESC, NUM, DATE, MEMO,AMT)
DECLARE (DATE, NUM, DESC, MEMO,AMT)
DECLARE (NUM, DATE, DESC, MEMO,AMT)
DECLARE (AMT, MEMO, DESC, DATE,NUM)
DECLARE (MEMO, AMT, DESC, DATE,NUM)
DECLARE (DESC, AMT, MEMO, DATE,NUM)
DECLARE (AMT, DESC, MEMO, DATE,NUM)
DECLARE (MEMO, DESC, AMT, DATE,NUM)
DECLARE (DESC, MEMO, AMT, DATE,NUM)
DECLARE (DATE, AMT, MEMO, DESC,NUM)
DECLARE (AMT, DATE, MEMO, DESC,NUM)
DECLARE (MEMO, DATE, AMT, DESC,NUM)
DECLARE (DATE, MEMO, AMT, DESC,NUM)
DECLARE (AMT, MEMO, DATE, DESC,NUM)
DECLARE (MEMO, AMT, DATE, DESC,NUM)
DECLARE (DESC, DATE, AMT, MEMO,NUM)
DECLARE (DATE, DESC, AMT, MEMO,NUM)
DECLARE (AMT, DESC, DATE, MEMO,NUM)
DECLARE (DESC, AMT, DATE, MEMO,NUM)
DECLARE (DATE, AMT, DESC, MEMO,NUM)
DECLARE (AMT, DATE, DESC, MEMO,NUM)
DECLARE (MEMO, DESC, DATE, AMT,NUM)
DECLARE (DESC, MEMO, DATE, AMT,NUM)
DECLARE (DATE, MEMO, DESC, AMT,NUM)
DECLARE (MEMO, DATE, DESC, AMT,NUM)
DECLARE (DESC, DATE, MEMO, AMT,NUM)
DECLARE (DATE, DESC, MEMO, AMT,NUM)
DECLARE (NUM, AMT, MEMO, DESC,DATE)
DECLARE (AMT, NUM, MEMO, DESC,DATE)
DECLARE (MEMO, NUM, AMT, DESC,DATE)
DECLARE (NUM, MEMO, AMT, DESC,DATE)
DECLARE (AMT, MEMO, NUM, DESC,DATE)
DECLARE (MEMO, AMT, NUM, DESC,DATE)
DECLARE (DESC, NUM, AMT, MEMO,DATE)
DECLARE (NUM, DESC, AMT, MEMO,DATE)
DECLARE (AMT, DESC, NUM, MEMO,DATE)
DECLARE (DESC, AMT, NUM, MEMO,DATE)
DECLARE (NUM, AMT, DESC, MEMO,DATE)
DECLARE (AMT, NUM, DESC, MEMO,DATE)
DECLARE (MEMO, DESC, NUM, AMT,DATE)
DECLARE (DESC, MEMO, NUM, AMT,DATE)
DECLARE (NUM, MEMO, DESC, AMT,DATE)
DECLARE (MEMO, NUM, DESC, AMT,DATE)
DECLARE (DESC, NUM, MEMO, AMT,DATE)
DECLARE (NUM, DESC, MEMO, AMT,DATE)
DECLARE (AMT, MEMO, DESC, NUM,DATE)
DECLARE (MEMO, AMT, DESC, NUM,DATE)
DECLARE (DESC, AMT, MEMO, NUM,DATE)
DECLARE (AMT, DESC, MEMO, NUM,DATE)
DECLARE (MEMO, DESC, AMT, NUM,DATE)
DECLARE (DESC, MEMO, AMT, NUM,DATE)
/* ================================================== */
static void
SortSplits (Query *q, Split **slist)
{
int nsplits =0;
nsplits = 0;
while (slist[nsplits]) nsplits ++;
/* run the sort routine on the array */
qsort (slist, nsplits, sizeof (Split *),
(int(*)(const void*, const void *)) xaccSplitOrder);
}

@ -10,6 +10,22 @@
* Copyright (c) 1998 Linas Vepstas
*/
/********************************************************************\
* 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., 675 Mass Ave, Cambridge, MA 02139, USA. *
\********************************************************************/
#ifndef __GNUCASH_QUERY_H__
#define __GNUCASH_QUERY_H__

Loading…
Cancel
Save