pike.git / src / modules / _WhiteFish / whitefish.c

version» Context lines:

pike.git/src/modules/_WhiteFish/whitefish.c:1:   #include "global.h"   #include "stralloc.h"   #include "global.h" - RCSID("$Id: whitefish.c,v 1.3 2001/05/22 13:29:21 per Exp $"); + RCSID("$Id: whitefish.c,v 1.4 2001/05/22 13:52:27 per Exp $");   #include "pike_macros.h"   #include "interpret.h"   #include "program.h"   #include "program_id.h"   #include "object.h"   #include "operators.h" -  + #include "array.h" + #include "module_support.h"      #include "config.h"      #include "whitefish.h"   #include "resultset.h"   #include "blob.h"      /* must be included last */   #include "module_magic.h"    -  + struct tofree + { +  Blob **blobs; +  int nblobs; +  struct object *res; + };    -  + void free_stuff( void *_t ) + { +  struct tofree *t= (struct tofree *)_t; +  int i; +  if( t->res ) free_object( t->res ); +  for( i = 0; i<t->nblobs; i++ ) +  wf_blob_free( t->blobs[i] ); +  free( t ); + } +  + static struct object *low_do_query_merge( Blob **blobs, +  int nblobs, +  int field_c[68], +  int prox_c[8], +  int field ) + { +  struct object *res = wf_resultset_new(); +  struct tofree *__f = malloc( sizeof( struct tofree ) ); +  ONERROR e; +  +  __f->res = res; +  __f->blobs = blobs; +  __f->nblobs = nblobs; +  SET_ONERROR( e, free_stuff, __f ); +  +  UNSET_ONERROR( e ); +  __f->res = 0; +  free_stuff( __f ); +  return res; + } +  +    static void f_do_query_merge( INT32 args )   /*! @decl ResultSet do_query_merge( array(int) musthave, @    *! array(int) field_coefficients, @    *! array(int) proximity_coefficients, @    *! function(int:string) blobfeeder, @    *! int field)    *! @[musthave]    *!    *! Arrays of word ids. Note that the order is significant    *! for the ranking.
pike.git/src/modules/_WhiteFish/whitefish.c:74:    *! match any field.    *!    *! Index Field    *! ----- ---------------------    *! -1 Any field    *! 0..63 Special field 0..63    *! 64 Body text    */   {    int proximity_coefficients[8]; -  int field_cofficients[68]; +  int field_coefficients[68]; +  int numblobs, i; +  Blob **blobs;    -  Blob *blobs; +  struct svalue *cb; +  struct array *_words, *_field, *_prox; +  int field; +  +  /* 1: Get all arguments. */ +  get_all_args( "do_query_merge", args, "%a%a%a%O%d", +  &_words, &_field, &_prox, &cb, &field ); +  +  if( _field->size != 68 ) +  Pike_error("Illegal size of field_coefficients array (expected 68)\n" ); +  if( _prox->size != 8 ) +  Pike_error("Illegal size of proximity_coefficients array (expected 8)\n" ); +  +  numblobs = _words->size; +  if( !numblobs ) +  { +  struct object *o = wf_resultset_new( ); +  pop_n_elems( args ); +  push_object( o ); +  return;    }    -  +  blobs = malloc( sizeof(Blob *) * numblobs ); +  +  for( i = 0; i<numblobs; i++ ) +  blobs[i] = wf_blob_new( cb, _words->item[i].u.integer ); +  +  for( i = 0; i<8; i++ ) +  proximity_coefficients[i] = _prox->item[i].u.integer; +  +  for( i = 0; i<48; i++ ) +  field_coefficients[i] = _field->item[i].u.integer; +  +  push_object(low_do_query_merge(blobs,numblobs, +  field_coefficients, +  proximity_coefficients,field )); + } +    void pike_module_init(void)   {    init_resultset_program();       add_function( "do_query_merge", f_do_query_merge,    "function(array(int),array(int),array(int)"    ",function(int:string),int",    0 );   }      void pike_module_exit(void)   {    exit_resultset_program();   }