/****************************************************************************** * * * sortcomp.c version 1.0 of 1 Januari 1989 (C) L.J.M. de Wit 1989 * * * * This software may be used and distributed freely if not used commercially * * and the originator (me) is mentioned in the source (just leave this 9 line * * header intact). * * * ****************************************************************************** * * sortcomp.c: comparision functions * * These functions contain the numeric comparision functions c_n and its * reverse, c_nr. The other 48 comparision functions are formed by combining * the following properties (take note of the Capitals): * a) either Dictionary, Ignore non-printables or Any other (3) * b) ignore leading Blanks, versus not ignoring them (2) * c) Fold upper case to lower, versus not folding (2) * d) Reverse the result of the comparision, versus not reversing (2) * e) Unbounded (bounded only by '\0'), versus upper limit bound (2) * * Since comparing is done a lot it is important for the compare functions * to be fast. As for using the 48 functions as it stands the following * arguments are used: * One could have combined functions and used flags to discern between options. * This would however involve passing more parameters to the function (the * flags) and would rdOÇOOπO ρO Opψτ03:14916727:427423:149*444012272490;:402:644712466<8922:21:946:44164642:776<7217447:2024622*427:410212402122721<0962071::4213:14 g  gS/H/INB o/o/H o /o /HN o/o/H o /o /HN /"/ @ /$/"@0Am4QHNuVgjpNupNu"o o` o"o g gS  g  gS/H/IN*"o o` o"o g gS  g  gS/H/IN o/o/HN o/o/HN"o o` o"o g gS  g  gS/H/IN"o o` o"o g gS  g  gS/H/INR o/o/HN o/o/HN."o o` o"o g gS  g  gS/H/IN~"o o` o"o g gS  g  gS/H/IN o/o/HN."o o` o"og"fgfgfg gHHNuHHNuB H&" *"* "X F  ^ ( > x>X* *(JZ TJ $td .2* PDJ^BDJ&~ ֎"B,P82.,>2&(*$ n(" h*$ n(" $,>p8>p8( &>(0R~ .  "  (    Pb:: :":V:l&$@T6(,j$&:P(J.z   H $ , Xd`$  J $0 4" & 0  D &B 4 T<@HD(ĮD@.x",ZR(>@@@X --bs; break; } } for ( ; bt < et; ) { /* Skip any more */ if (isdict(*++bt)) { /* non-dict chars in bt */ --bt; break; } } return (et - bt) - (es - bs); } int c_if(bs,bt,es,et) /* Normalized/Fold */ register char *bs, *bt; register char *es, *et; { --bs; --bt; --es; --et; for ( ; bs < es && bt < et; ) { if (fold[*++bs] != fold[*++bt]) { /* Increment & compare */ if (isnorm(*bs)) { if (isnorm(*bt)) { return fold[*bs] - fold[*bt]; } else { --bs; /* Effectively skip *bt */ } } else if (isnorm(*bt)) { --bt; /* Effectively skip *bs */ } /* (else: skip both) */ } } for ( ; bs < es; ) { /* Skip any more */ if (isnorm(*++bs)) { /* non-norm chars in bs */ --bs; break; } } for ( ; bt < et; ) { /* Skip any more */ if (isnorm(*++bt)) { /* non-norm chars in bt */ --bt; break; } } return (et - bt) - (es - bs); } int c_i(bs,bt,es,et) /* Normalized order */ register char *bs, *bt; register char *es, *et; { --bs; --bt; --es; --et; for ( ; bs < es && bt < et; ) { if (*++bs != *++bt) { /* Increment & compare */ if (isnorm(*bs)) { if (isnorm(*bt)) { return fold[*bs] - fold[*bt]; } else { --bs; /* Effectively skip *bt */ } } else if (isnorm(*bt)) { --bt; /* Effectively skip *bs */ } /* (else: skip both) */ } } for ( ; bs < es; ) { /* Skip any more */ if (isnorm(*++bs)) { /* non-norm chars in bs */ --bs; break; } } for ( ; bt < et; ) { /* Skip any more */ if (isnorm(*++bt)) { /* non-norm chars in bt */ --bt; break; } } return (et - bt) - (es - bs); } int c_af(bs,bt,es,et) /* Fold */ register char *bs, *bt; register char *es, *et; { register short minlen; minlen = ((es - bs) <= (et - bt)) ? (es - bs) : (et - bt); if (minlen == 0) { return (es - bs) - (et - bt); } if (fold[*bs] == fold[*bt]) { for ( ; --minlen != 0 && fold[*++bs] == fold[*++bt]; ) ; if (minlen == 0) { return 0; } } return fold[*bs] - fold[*bt]; } int c_dfu(bs,bt) /* Dictionary/Fold * pόAppτόOp@ @O@ pωOpπOÈ@@ O@O@@ O@)27241:>>19192)7744419=4441:=192 Difference found */ } else { --bs; /"3242<91:>>29=4441:=:"3242<919>>299174>;4292:7362-19362-1:.>4:1:191:"440<9221019 "  (    Pb:: :":V:l&$@T6(,j$&:P(J.z   H $ , Xd`$  J $0 4" & 0  D &B 4 T<@HD(ĮD@.x",ZR(>@@@X *es, *et; { SKIPSPACE(bs,bt); return c_i(bt,bs,et,es); } int c_ib(bs,bt,es,et) /* Normalized/Blank */ register char *bs, *bt; char *es, *et; { SKIPSPACE(bs,bt); return c_i(bs,bt,es,et); } int c_ifr(bs,bt,es,et) /* Normalized/Fold/Reverse */ char *bs, *bt; char *es, *et; { return c_if(bt,bs,et,es); } int c_ir(bs,bt,es,et) /* Normalized/Reversed */ char *bs, *bt; char *es, *et; { return c_i(bt,bs,et,es); } int c_abfr(bs,bt,es,et) /* Blank/Fold/Reverse */ register char *bs, *bt; char *es, *et; { SKIPSPACE(bs,bt); return c_af(bt,bs,et,es); } int c_abf(bs,bt,es,et) /* Blank/Fold */ register char *bs, *bt; char *es, *et; { SKIPSPACE(bs,bt); return c_af(bs,bt,es,et); } int c_abr(bs,bt,es,et) /* Blank/Reverse */ register char *bs, *bt; char *es, *et; { SKIPSPACE(bs,bt); return c_a(bt,bs,et,es); } int c_ab(bs,bt,es,et) /* Blank */ register char *bs, *bt; char *es, *et; { SKIPSPACE(bs,bt); return c_a(bs,bt,es,et); } int c_afr(bs,bt,es,et) /* Fold/Reverse */ char *bs, *bt; char *es, *et; { return c_af(bt,bs,et,es); } int c_ar(bs,bt,es,et) /* Reverse */ char *bs, *bt; char *es, *et; { return c_a(bt,bs,et,es); } /* Unbounded comparisions start here */ int c_dbfru(bs,bt) /* Dict/Blank/Fold/Reverse */ register char *bs, *bt; { SKIPSPACE(bs,bt); return c_dfu(bt,bs); } int c_dbfu(bs,bt) /* Dictionary/Blank/Fold */ register char *bs, *bt; { SKIPSPACE(bs,bt); return c_dfu(bs,bt); } int c_dbru(bs,bt) /* Dictionary/Blank/Reverse */ register char *bs, *bt; { SKIPSPACE(bs,bt); return c_du(bt,bs); } int c_dbu(bs,bt) /* Dictionary/Blank */ register char *bs, *bt; { SKIPSPACE(bs,bt); return c_du(bs,bt); } int c_dfru(bs,bt) /* Dictionary/Fold/Reverse */ char *bs, *bt; { return c_dfu(bt,bs); } int c_dru(bs,bt) /* Dictionary/Reverse */ char *bs, *bt; { return c_du(bt,bs); } int c_ibfru(bs,bt) /* Norm/Blank/Fold/Reverse */ register char *bs, *bt; { SKIPSPACE(bs,bt); return c_ifu(bt,bs); } int c_ibfu(bs,bt) /* Normalized/Blank/Fold */ register char *bs, *bt; { SKIPSPACE(bs,bt); return c_ifu(bs,bt); } int c_ibru(bs,bt) /* Normalized/Blank/Reverse */ register char *bs, *bt; { SKIPSPACE(bs,bt); return c_iu(bt,bs); } int c_ibu(bs,bt) /* Normalized/Blank */ register char *bs, *bt; { SKIPSPACE(bs,bt); return c_iu(bs,bt); } int c_ifru(bs,bt) /* Normalized/Fold/Reverse */ char *bs, *bt; { return c_ifu(bt,bs); } int c_iru(bs,bt) /* Normalized/Reverse */ char *bs, *bt; { return c_iu(bt,bs); } int c_abfru(bs,bt) /* Blank/Fold/Reverse */ register char *bs, *bt; { SKIPSPACE(bs,bt); return c_afu(bt,bs); } int c_abfu(bs,bt) /* Blank/Fold */ register char *bs, *bt; { SKIPSPACE(bs,bt); return c_afu(bs,bt); } int c_abru(bs,bt) /* Blank/Reverse */ register char *bs, *bt; { SKIPSPACE(bs,bt); return c_au(bt,bs); } int c_abu(bs,bt) /* Blank */ register char *bs, *bt; { SKIPSPACE(bs,bt); return c_au(bs,bt); } int c_afru(bs,bt) /* Fold/Reverse */ register char *bs, *bt; { register char *fld = fold; if (fld[*bs] == fld[*bt] && *bt) { for ( ; fld[*++bs] == fld[*++bt] && *bt; ) ; } return fld[*bt] - fld[*bs]; } int c_aru(bs,bt) /* Reverse */ register char *bs, *bt; { if (*bs == *bt && *bt) { for ( ; *++bs == *++bt && *bt; ) ; } return *bt - *bs; } int c_au(bs,bt) /* Ordinary sort */ register char *bs, *bt; { if (*bs == *bt && *bs) { /* Compare & skip eq. chars */ while (*++bs == *++bt && *bs) ; /* Compare & skip eq. chars */ } return *bs - *bt; } int c_a(bs,bt,es,et) /* Ordinary sort */ register char *bs, *bt; register char *es, *et; { register short minlen; minlen = ((es - bs) <= (et - bt)) ? (es - bs) : (et - bt); if (minlen == 0) { return (es - bs) - (et - bt); } if (*bs == *bt) { for ( ; --minlen != 0 && *++bs == *++bt; ) ; if (minlen == 0) { return 0; } } return *bs - *bt; } #endif not MC68000