1extern void exit (int); 2extern void abort (void); 3 4typedef unsigned int u_int32_t; 5typedef unsigned char u_int8_t; 6typedef int int32_t; 7 8typedef enum { 9 TXNLIST_DELETE, 10 TXNLIST_LSN, 11 TXNLIST_TXNID, 12 TXNLIST_PGNO 13} db_txnlist_type; 14 15struct __db_lsn; typedef struct __db_lsn DB_LSN; 16struct __db_lsn { 17 u_int32_t file; 18 u_int32_t offset; 19}; 20struct __db_txnlist; typedef struct __db_txnlist DB_TXNLIST; 21 22struct __db_txnlist { 23 db_txnlist_type type; 24 struct { struct __db_txnlist *le_next; struct __db_txnlist **le_prev; } links; 25 union { 26 struct { 27 u_int32_t txnid; 28 int32_t generation; 29 int32_t aborted; 30 } t; 31 struct { 32 33 34 u_int32_t flags; 35 int32_t fileid; 36 u_int32_t count; 37 char *fname; 38 } d; 39 struct { 40 int32_t ntxns; 41 int32_t maxn; 42 DB_LSN *lsn_array; 43 } l; 44 struct { 45 int32_t nentries; 46 int32_t maxentry; 47 char *fname; 48 int32_t fileid; 49 void *pgno_array; 50 u_int8_t uid[20]; 51 } p; 52 } u; 53}; 54 55int log_compare (const DB_LSN *a, const DB_LSN *b) 56{ 57 return 1; 58} 59 60 61int 62__db_txnlist_lsnadd(int val, DB_TXNLIST *elp, DB_LSN *lsnp, u_int32_t flags) 63{ 64 int i; 65 66 for (i = 0; i < (!(flags & (0x1)) ? 1 : elp->u.l.ntxns); i++) 67 { 68 int __j; 69 DB_LSN __tmp; 70 val++; 71 for (__j = 0; __j < elp->u.l.ntxns - 1; __j++) 72 if (log_compare(&elp->u.l.lsn_array[__j], &elp->u.l.lsn_array[__j + 1]) < 0) 73 { 74 __tmp = elp->u.l.lsn_array[__j]; 75 elp->u.l.lsn_array[__j] = elp->u.l.lsn_array[__j + 1]; 76 elp->u.l.lsn_array[__j + 1] = __tmp; 77 } 78 } 79 80 *lsnp = elp->u.l.lsn_array[0]; 81 return val; 82} 83 84#if defined (STACK_SIZE) && STACK_SIZE < 12350 85#define VLEN (STACK_SIZE/10) 86#else 87#define VLEN 1235 88#endif 89 90int main (void) 91{ 92 DB_TXNLIST el; 93 DB_LSN lsn, lsn_a[VLEN]; 94 95 el.u.l.ntxns = VLEN-1; 96 el.u.l.lsn_array = lsn_a; 97 98 if (__db_txnlist_lsnadd (0, &el, &lsn, 0) != 1) 99 abort (); 100 101 if (__db_txnlist_lsnadd (0, &el, &lsn, 1) != VLEN-1) 102 abort (); 103 104 exit (0); 105} 106