more work on sorting

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@1159 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Linas Vepstas 1998-09-13 10:05:53 +00:00
parent 497fa63f63
commit 4982b628a0
2 changed files with 318 additions and 0 deletions

View File

@ -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);
}

View File

@ -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__