/[MITgcm]/mitgcm.org/devel/buildweb/pkg/swish-e/src/proplimit.c
ViewVC logotype

Contents of /mitgcm.org/devel/buildweb/pkg/swish-e/src/proplimit.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1.1.1 - (show annotations) (download) (vendor branch)
Fri Sep 20 19:47:29 2002 UTC (22 years, 10 months ago) by adcroft
Branch: Import, MAIN
CVS Tags: baseline, HEAD
Changes since 1.1: +0 -0 lines
File MIME type: text/plain
Importing web-site building process.

1 /*
2 $Id: proplimit.c,v 1.32 2002/05/26 15:38:02 whmoseley Exp $
3 **
4 ** This program and library is free software; you can redistribute it and/or
5 ** modify it under the terms of the GNU (Library) General Public License
6 ** as published by the Free Software Foundation; either version 2
7 ** of the License, or any later version.
8 **
9 ** This program is distributed in the hope that it will be useful,
10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 ** GNU (Library) General Public License for more details.
13 **
14 ** You should have received a copy of the GNU (Library) General Public License
15 ** along with this program; if not, write to the Free Software
16 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 **
18 ** module to limit within a range of properties
19 ** Created June 10, 2001 - moseley
20 **
21 */
22
23 #include "swish.h"
24 #include "string.h"
25 #include "mem.h"
26 #include "merge.h" // why is this needed for docprop.h???
27 #include "docprop.h"
28 #include "index.h"
29 #include "metanames.h"
30 #include "compress.h"
31 #include "error.h"
32 #include "db.h"
33 #include "result_sort.h"
34 #include "swish_qsort.h"
35 #include "proplimit.h"
36
37
38 // #define DEBUGLIMIT
39
40 /*==================== These should be in other modules ================*/
41
42 /* Should be in docprop.c */
43
44 /*******************************************************************
45 * Fetch a doc's properties by file number and metaID
46 *
47 * Call with:
48 * *sw
49 * *indexf
50 * filenum
51 * metaID
52 *
53 * Returns:
54 * pointer to a docPropertyEntry or NULL if not found
55 *
56 ********************************************************************/
57
58 static propEntry *GetPropertyByFile( SWISH *sw, IndexFILE *indexf, int filenum, int metaID )
59 {
60 propEntry *d;
61 FileRec fi;
62 memset(&fi, 0, sizeof( FileRec ));
63 fi.filenum = filenum;
64
65
66 d = ReadSingleDocPropertiesFromDisk(sw, indexf, &fi, metaID, MAX_SORT_STRING_LEN );
67 freefileinfo(&fi);
68
69 return d;
70 }
71
72 #ifdef DEBUGLIMIT
73 static void printdocprop( propEntry *d )
74 {
75 char str[1000];
76 int j;
77
78 for (j=0; j < d->propLen; j++)
79 str[j] = (d->propValue)[j];
80
81 str[ d->propLen ] = '\0';
82
83 printf("%s (%d)", str, d->propLen );
84 }
85
86 static void printfileprop( SWISH *sw, IndexFILE *indexf, int filenum, int metaID )
87 {
88 propEntry *d;
89
90 if ( (d = GetPropertyByFile( sw, indexf, filenum,metaID )))
91 printdocprop( d );
92 else
93 printf("File %d does not have a property for metaID %d", filenum, metaID );
94
95 freeProperty( d );
96 }
97 #endif
98
99
100
101
102 /*==============================================================*/
103 /* typedefs and structures */
104 /*==============================================================*/
105
106 /* This is used to for inverting the metaEntry->sorted_data array */
107 typedef struct LOOKUP_TABLE
108 {
109 int filenum;
110 unsigned long sort;
111 } LOOKUP_TABLE;
112
113
114 /* This is the list of parameters supplied with the query */
115 typedef struct PARAMS
116 {
117 struct PARAMS *next;
118 unsigned char *propname;
119 unsigned char *lowrange;
120 unsigned char *highrange;
121 } PARAMS;
122
123
124
125
126 struct MOD_PropLimit
127 {
128 PARAMS *params; /* parameter */
129 };
130
131
132
133 /*==============================================================*/
134 /* Code */
135 /*==============================================================*/
136
137 void initModule_PropLimit (SWISH *sw)
138 {
139 /* local data */
140 struct MOD_PropLimit *self;
141 self =(struct MOD_PropLimit *) emalloc(sizeof(struct MOD_PropLimit));
142 sw->PropLimit = self;
143
144 self->params = NULL;
145 }
146
147 void ClearLimitParameter (SWISH *sw)
148 {
149 struct MOD_PropLimit *self = sw->PropLimit;
150 PARAMS *tmp;
151
152 while ( self->params ) {
153 efree( self->params->propname );
154 efree( self->params->lowrange );
155 efree( self->params->highrange );
156 tmp = (PARAMS *)self->params->next;
157 efree( self->params );
158 self->params = tmp;
159 }
160 }
161
162
163
164 void freeModule_PropLimit (SWISH *sw)
165 {
166 ClearLimitParameter( sw );
167 efree( sw->PropLimit );
168 sw->PropLimit = NULL;
169
170 }
171
172
173 /*******************************************************************
174 * Stores strings away for later processing
175 * called from someplace?
176 *
177 * Call with:
178 * Three strings, first must be metaname.
179 *
180 * Returns:
181 * returns false (0) on failure
182 * pointer to a PARAMS
183 * errors do not return (doesn't do many checks)
184 *
185 * ToDo:
186 * Error checking, and maybe pass in a StringList
187 *
188 ********************************************************************/
189 int SetLimitParameter(SWISH *sw, char *propertyname, char *low, char *hi)
190 {
191 PARAMS *newparam;
192 PARAMS *params;
193 struct MOD_PropLimit *self = sw->PropLimit;
194
195
196 /* Currently, can only limit by one property -- so check that one hasn't already been used */
197 for ( params = self->params; params && (strcmp( (char *)params->propname, propertyname ) != 0); params = (PARAMS *)params->next);
198 if ( params )
199 {
200 set_progerr( PROP_LIMIT_ERROR, sw, "Property '%s' is already limited", propertyname );
201 return 0;
202 }
203
204
205
206 newparam = emalloc( sizeof( PARAMS ) );
207
208 newparam->propname = (unsigned char *)estrdup( propertyname );
209 newparam->lowrange = (unsigned char *)estrdup( low );
210 newparam->highrange = (unsigned char *)estrdup( hi );
211
212 params = self->params;
213
214 /* put at head of list */
215 self->params = newparam;
216 newparam->next = (struct PARAMS *)params;
217
218 return 1;
219
220 }
221
222
223
224 /*******************************************************************
225 * This compares the user supplied value with a file's property
226 * The file's property is looked up and then Compare_Properties is called
227 *
228 * Call with:
229 * *SWISH
230 * *indexf
231 * *propEntry key - compare key
232 * *LOOKUP_TABLE - element containing file number
233 *
234 * Returns:
235 *
236 ********************************************************************/
237 static int test_prop( SWISH *sw, IndexFILE *indexf, struct metaEntry *meta_entry, propEntry *key, LOOKUP_TABLE *sort_array)
238 {
239 propEntry *fileprop;
240 int cmp_value;
241
242 #ifdef DEBUGLIMIT
243 {
244 char *p = DecodeDocProperty( meta_entry, key );
245 printf("test_prop comparing '%s' cmp '%s' with ", meta_entry->metaName, p);
246 efree( p );
247 }
248 #endif
249
250
251
252 if ( !(fileprop = GetPropertyByFile( sw, indexf, sort_array->filenum, meta_entry->metaID )) )
253 {
254 #ifdef DEBUGLIMIT
255 printf("(no prop found for filenum %d) - return +1\n", sort_array->filenum );
256 #endif
257
258 /* No property found, assume it's very, very, small */
259 return +1;
260 }
261
262 #ifdef DEBUGLIMIT
263 {
264 char *p = DecodeDocProperty( meta_entry, fileprop );
265 int i = Compare_Properties( meta_entry, key, fileprop );
266 printf("'%s' returning %d\n", p, i );
267 efree( p );
268 }
269 #endif
270
271
272 cmp_value = Compare_Properties( meta_entry, key, fileprop );
273 freeProperty( fileprop );
274 return cmp_value;
275
276 }
277
278
279
280
281 /************************************************************************
282 * Adapted from: msdn, I believe...
283 *
284 * Call with:
285 * See below
286 *
287 * Returns:
288 * Exact match, true (but could be more than one match location
289 * Between two, returns false and the lower position
290 * Below list, returns false and -1
291 * Above list, return false and numelements (one past end of array)
292 *
293 * ToDo:
294 * Check for out of bounds on entry as that may be reasonably common
295 *
296 ***************************************************************************/
297
298 static int binary_search(
299 SWISH *sw, // needed to lookup a file entry
300 IndexFILE *indexf, //
301 LOOKUP_TABLE *sort_array, // table to search through
302 int numelements, // size of table
303 propEntry *key, // property to compare against
304 struct metaEntry *meta_entry, // associated meta entry (for metaType)
305 int *result, // result is stored here
306 int direction, // looking up (positive) looking down (negative)
307 int *exact_match) // last exact match found
308 {
309 int low = 0;
310 int high = numelements - 1;
311 int num = numelements;
312 int mid;
313 int cmp;
314 unsigned int half;
315
316 *exact_match = -1;
317
318 #ifdef DEBUGLIMIT
319 printf("\nbinary_search looking for %s entry\n", ( direction > 0 ? "high" : "low" ) );
320 #endif
321
322 while ( low <= high )
323 {
324 if ( (half = num / 2) )
325 {
326 mid = low + (num & 1 ? half : half - 1);
327
328
329 if ( (cmp = test_prop( sw, indexf, meta_entry, key, &sort_array[mid] )) == 0 )
330 {
331 *exact_match = mid; // exact match
332 cmp = direction; // but still look for the lowest/highest exact match.
333 }
334
335 if ( cmp < 0 )
336 {
337 high = mid - 1;
338 num = (num & 1 ? half : half - 1);
339 }
340
341 else // cmp > 0
342 {
343 low = mid + 1;
344 num = half;
345 }
346 }
347 else if (num)
348 {
349 if( (cmp = test_prop( sw, indexf, meta_entry, key, &sort_array[low] )) ==0)
350 {
351 *result = low;
352 return 1;
353 }
354 if ( cmp < 0 ) // this breaks need another compare
355 {
356 /* less than current, but is is greater */
357 if ( low > 0 && (test_prop( sw, indexf, meta_entry, key, &sort_array[low-1] ) < 0))
358 *result = low - 1;
359 else
360 *result = low;
361 return 0;
362 }
363 else
364 {
365 *result = low + 1;
366 return 0;
367 }
368 }
369 else // if !num
370 {
371 /* I can't think of a case for this to match?? */
372 progwarn("Binary Sort issue - please report to swish-e list");
373 *result = -1;
374 return 0;
375 }
376 }
377 *result = low; // was high, but wasn't returning expected results
378 return 0;
379 }
380
381
382 /*******************************************************************
383 * This takes a *sort_array and the low/hi range of limits and marks
384 * which files are in that range
385 *
386 * Call with:
387 * pointer to SWISH
388 * pointer to the IndexFile
389 * pointer to the LOOKUP_TABLE
390 * *metaEntry
391 * PARAMS (low/hi range)
392 *
393 * Returns:
394 * true if any in range, otherwise false
395 *
396 ********************************************************************/
397 static int find_prop(SWISH *sw, IndexFILE *indexf, LOOKUP_TABLE *sort_array, int num, struct metaEntry *meta_entry )
398 {
399 int low, high, j;
400 int foundLo, foundHi;
401 int some_selected = 0;
402 int exact_match;
403
404
405 if ( !meta_entry->loPropRange )
406 {
407 foundLo = 1; /* signal exact match */
408 low = 0; /* and start at beginning */
409 }
410 else
411 {
412 foundLo = binary_search(sw, indexf, sort_array, num, meta_entry->loPropRange, meta_entry, &low, -1, &exact_match);
413
414 if ( !foundLo && exact_match >= 0 )
415 {
416 low = exact_match;
417 foundLo = 1; /* mark as an exact match */
418 }
419 }
420
421
422
423 if ( !meta_entry->hiPropRange )
424 {
425 foundHi = 1; /* signal exact match */
426 high = num -1; /* and end very end */
427 }
428 else
429 {
430 foundHi = binary_search(sw, indexf, sort_array, num, meta_entry->hiPropRange, meta_entry, &high, +1, &exact_match);
431
432 if ( !foundHi && exact_match >= 0 )
433 {
434 high = exact_match;
435 foundHi = 1;
436 }
437 }
438
439 #ifdef DEBUGLIMIT
440 printf("Returned range %d - %d (exact: %d %d) cnt: %u\n", low, high, foundLo, foundHi, num );
441 #endif
442
443 /* both inbetween two adjacent entries */
444 if ( !foundLo && !foundHi && low == high )
445 {
446 for ( j = 0; j < num; j++ )
447 sort_array[j].sort = 0;
448
449 return 0;
450 }
451
452
453 /* now, if not an exact match for the high range, decrease high by one
454 * because high is pointing to the *next* higher element, which is TOO high
455 */
456
457 if ( !foundHi && low < high )
458 high--;
459
460
461 for ( j = 0; j < num; j++ )
462 {
463 if ( j >= low && j <= high )
464 {
465 sort_array[j].sort = 1;
466 some_selected++;
467 }
468 else
469 sort_array[j].sort = 0;
470 }
471
472 return some_selected;
473
474 }
475
476 /* These sort the LOOKUP_TABLE */
477 int sortbysort(const void *s1, const void *s2)
478 {
479 LOOKUP_TABLE *a = (LOOKUP_TABLE *)s1;
480 LOOKUP_TABLE *b = (LOOKUP_TABLE *)s2;
481
482 return a->sort - b->sort;
483 }
484
485 int sortbyfile(const void *s1, const void *s2)
486 {
487 LOOKUP_TABLE *a = (LOOKUP_TABLE *)s1;
488 LOOKUP_TABLE *b = (LOOKUP_TABLE *)s2;
489
490 return a->filenum - b->filenum;
491 }
492
493
494 /*******************************************************************
495 * This creates the lookup table for the range of values selected
496 * and stores it in the MetaEntry
497 *
498 * Call with:
499 * pointer to SWISH
500 * pointer to the IndexFile
501 * *metaEntry
502 * PARAMS (low/hi range)
503 *
504 * Returns:
505 * true if any were marked as found
506 * false means no match
507 *
508 ********************************************************************/
509
510 static int create_lookup_array( SWISH *sw, IndexFILE *indexf, struct metaEntry *meta_entry )
511 {
512 LOOKUP_TABLE *sort_array;
513 int i;
514 int size = indexf->header.totalfiles;
515 int some_found;
516
517 /* Now do the work of creating the lookup table */
518
519 /* Create memory -- probably could do this once and use it over and over */
520 sort_array = (LOOKUP_TABLE *) emalloc( size * sizeof(LOOKUP_TABLE) );
521
522 /* copy in the data to the sort array */
523 for (i = 0; i < size; i++)
524 {
525 sort_array[i].filenum = i+1;
526 sort_array[i].sort = meta_entry->sorted_data[i];
527 }
528
529
530 /* now sort by it's sort value */
531 swish_qsort(sort_array, size, sizeof(LOOKUP_TABLE), &sortbysort);
532
533 /* This marks in the new array which ones are in range */
534 some_found = find_prop( sw, indexf, sort_array, size, meta_entry );
535
536
537 #ifdef DEBUGLIMIT
538 for (i = 0; i < size; i++)
539 {
540 printf("%d File: %d Sort: %lu : ", i, sort_array[i].filenum, sort_array[i].sort );
541 printfileprop( sw, indexf, sort_array[i].filenum, meta_entry->metaID );
542 printf("\n");
543 }
544 #endif
545
546 /* If everything in range, then don't even bother creating the lookup array */
547 if ( some_found && sort_array[0].sort && sort_array[size-1].sort )
548 {
549 efree( sort_array );
550 return 1;
551 }
552
553
554 /* sort back by file number */
555 swish_qsort(sort_array, size, sizeof(LOOKUP_TABLE), &sortbyfile);
556
557
558 /* allocate a place to save the lookup table */
559 meta_entry->inPropRange = (int *) emalloc( size * sizeof(int) );
560
561 /* populate the array in the metaEntry */
562 for (i = 0; i < size; i++)
563 meta_entry->inPropRange[i] = sort_array[i].sort;
564
565 efree( sort_array );
566
567 return some_found;
568
569 }
570
571 /*******************************************************************
572 * Encode parameters specified on -L command line into two propEntry's
573 * which can be used to compare with a file's property
574 *
575 * Call with:
576 * *metaEntry -> current meta entry
577 * *PARAMS -> associated parameters
578 *
579 * Returns:
580 * True if a range was found, otherwise false.
581 * sets sw->lasterror on failure
582 *
583 *
584 ********************************************************************/
585 static int params_to_props( SWISH *sw, struct metaEntry *meta_entry, PARAMS *param )
586 {
587 int error_flag;
588 unsigned char *lowrange = param->lowrange;
589 unsigned char *highrange = param->highrange;
590
591 /* properties do not have leading white space */
592
593
594 /* Allow <= and >= in limits. A NULL property means very low/very high */
595
596 if ( (strcmp( "<=", (char *)lowrange ) == 0) )
597 {
598 meta_entry->loPropRange = NULL; /* indicates very small */
599 meta_entry->hiPropRange = CreateProperty( meta_entry, highrange, strlen( (char *)highrange ), 0, &error_flag );
600 }
601
602 else if ( (strcmp( ">=", (char *)lowrange ) == 0) )
603 {
604 meta_entry->loPropRange = CreateProperty( meta_entry, highrange, strlen( (char *)highrange ), 0, &error_flag );
605 meta_entry->hiPropRange = NULL; /* indicates very big */
606 }
607
608 else
609 {
610 meta_entry->loPropRange = CreateProperty( meta_entry, lowrange, strlen( (char *)lowrange ), 0, &error_flag );
611 meta_entry->hiPropRange = CreateProperty( meta_entry, highrange, strlen( (char *)highrange ), 0, &error_flag );
612
613
614 if ( !(meta_entry->loPropRange && meta_entry->hiPropRange) )
615 {
616 set_progerr(PROP_LIMIT_ERROR, sw, "Failed to set range for property '%s' values '%s' and '%s'", meta_entry->metaName, lowrange, highrange );
617 return 0;
618 }
619
620 /* Validate range */
621
622 if ( Compare_Properties( meta_entry, meta_entry->loPropRange, meta_entry->hiPropRange ) > 0 )
623 {
624 set_progerr(PROP_LIMIT_ERROR, sw, "Property '%s' value '%s' must be <= '%s'", meta_entry->metaName, lowrange, highrange );
625 return 0;
626 }
627 }
628
629
630 return ( meta_entry->loPropRange || meta_entry->hiPropRange );
631 }
632
633
634 /*******************************************************************
635 * Scans all the meta entries to see if any are limited, and if so, creates the lookup array
636 *
637 * Call with:
638 * pointer to SWISH
639 * poinger to an IndexFile
640 * user supplied limit parameters
641 *
642 * Returns:
643 * false if any arrays are all zero
644 * no point in even searching.
645 * (meaning that no possible matches exist)
646 * but also return false on errors, caller must check sw->lasterror
647 *
648 * ToDo:
649 * This ONLY works if the limits are absolute -- that is
650 * that you can't OR limits. Will need fixing at some point
651 *
652 ********************************************************************/
653 static int load_index( SWISH *sw, IndexFILE *indexf, PARAMS *params )
654 {
655 struct metaEntry *meta_entry;
656 PARAMS *curp;
657 int found;
658
659
660 curp = params;
661
662 /* Look at each parameter */
663 for (curp = params; curp; curp = curp->next )
664 {
665 found = 0;
666
667 if ( !(meta_entry = getPropNameByName( &indexf->header, (char *)curp->propname )))
668 {
669 set_progerr( PROP_LIMIT_ERROR, sw, "Specified limit name '%s' is not a PropertyName", curp->propname );
670 return 0;
671 }
672
673
674 /* This, of course, is not the truth -- but the only slightly useful would be filenum */
675 /* indexfile can be specified on the command line, rank and reccount is not really known */
676
677 if ( is_meta_internal( meta_entry ) )
678 {
679 set_progerr( PROP_LIMIT_ERROR, sw, "Cannot limit by swish result property '%s'", curp->propname );
680 return 0;
681 }
682
683
684 /* see if array has already been allocated (cached) */
685 if ( meta_entry->inPropRange )
686 continue;
687
688
689 /* Encode the parameters into properties for comparing, and store in the metaEntry */
690
691 if ( !params_to_props( sw, meta_entry, curp ) )
692 {
693 if ( sw->lasterror ) // check for failure
694 return 0;
695
696 continue; /* This means that it failed to set a range */
697 }
698
699
700 /* load the sorted_data array, if not already done */
701 if ( !meta_entry->sorted_data )
702 if( !LoadSortedProps( sw, indexf, meta_entry ) )
703 continue; /* thus it will sort manually without pre-sorted index */
704
705
706 /* Now create the lookup table in the metaEntry */
707 /* A false return means that an array was built but it was all zero */
708 /* No need to check anything else at this time, since can only AND -L options */
709 /* i.e. = return No Results right away */
710 /* This allows search.c to bail out early */
711
712 if ( !create_lookup_array( sw, indexf, meta_entry ) )
713 return 0;
714 }
715
716 return 1; // ** flag that it's ok to continue the search.
717
718 }
719
720 /*******************************************************************
721 * Prepares the lookup tables for every index
722 *
723 * Call with:
724 * pointer to SWISH
725 *
726 * Returns:
727 * true if ok to continue search
728 * false indicates that a lookup array was created, but it is all zero
729 * indicating there will never be a match
730 * ( this falls apart if allow OR limits )
731 *
732 * ToDo:
733 * How to deal with non-presorted properties?
734 *
735 ********************************************************************/
736
737 int Prepare_PropLookup(SWISH *sw )
738 {
739 IndexFILE *indexf;
740 struct MOD_PropLimit *self = sw->PropLimit;
741 int total_indexes = 0;
742 int total_no_docs = 0;
743
744
745
746 /* nothing to limit by */
747 if ( !self->params )
748 return 1;
749
750
751
752
753 /* process each index file */
754 for( indexf = sw->indexlist; indexf; indexf = indexf->next)
755 {
756 total_indexes++;
757
758 if ( !load_index( sw, indexf, self->params ) )
759 {
760 if ( sw->lasterror ) // check for error
761 return 0;
762
763 total_no_docs++;
764 }
765 }
766
767 /* if all indexes are all no docs within limits, then return false */
768 return total_indexes != total_no_docs;
769
770 }
771
772 /*******************************************************************
773 * Removes results that don't fit within the limit
774 *
775 * Call with:
776 * *SWISH - to read a file entry if pre-sorted data not available
777 * IndexFILE = current index file
778 * File number
779 *
780 * Returns
781 * true if file should NOT be included in results
782 *
783 *
784 ********************************************************************/
785 int LimitByProperty( SWISH *sw, IndexFILE *indexf, int filenum )
786 {
787 int j;
788 struct metaEntry *meta_entry;
789 for ( j = 0; j < indexf->header.metaCounter; j++)
790 {
791 /* Look at all the properties */
792
793 /* Should cache this in the index file, or is this fast enough? */
794 if ( !(meta_entry = getPropNameByID( &indexf->header, indexf->header.metaEntryArray[j]->metaID )))
795 continue; /* continue if it's not a property */
796
797 /* anything to check? */
798 if ( !meta_entry->loPropRange && !meta_entry->hiPropRange )
799 continue;
800
801
802
803
804 /* If inPropRange is allocated then there is an array for limiting already created from the presorted data */
805
806 if ( meta_entry->inPropRange )
807 return !meta_entry->inPropRange[filenum-1];
808
809
810
811
812 /* Otherwise, if either range is set, then use a manual lookup of the property */
813
814 {
815 int limit = 0;
816 propEntry *prop = GetPropertyByFile( sw, indexf, filenum, meta_entry->metaID );
817
818 /* Return true (i.e. limit) if the file's prop is less than the low range */
819 /* or if its property is greater than the high range */
820 if (
821 (Compare_Properties( meta_entry, prop, meta_entry->loPropRange ) < 0 ) ||
822 (meta_entry->hiPropRange && (Compare_Properties( meta_entry, prop, meta_entry->hiPropRange ) > 0 ))
823 )
824 limit = 1;
825
826 freeProperty( prop );
827 /* If limit by this property, then return to limit right away */
828 if ( limit )
829 return 1;
830 }
831 }
832
833 return 0; /* don't limit by default */
834 }
835
836 /*******************************************************************
837 * Checks to see if ANY -L parameters were set
838 *
839 * This is just to avoid processing each result in the result list.
840 *
841 ********************************************************************/
842 int is_prop_limit_used( SWISH *sw )
843 {
844 struct MOD_PropLimit *self = sw->PropLimit;
845
846 return self->params ? 1 : 0;
847 }
848

  ViewVC Help
Powered by ViewVC 1.1.22