dbsdupecheck.c
上传用户:tany51
上传日期:2013-06-12
资源大小:1397k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 2001 faster (lqx@cic.tsinghua.edu.cn)
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) 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 General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU 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. #include "common/setup_before.h"
  19. #include "setup.h"
  20. #include <stdio.h>
  21. #ifdef STDC_HEADERS
  22. # include <stdlib.h>
  23. #else
  24. # ifdef HAVE_MALLOC_H
  25. #  include <malloc.h>
  26. # endif
  27. #endif
  28. #ifdef HAVE_STRING_H
  29. # include <string.h>
  30. #else
  31. # ifdef HAVE_STRINGS_H
  32. #  include <strings.h>
  33. # endif
  34. # ifdef HAVE_MEMORY_H
  35. #  include <memory.h>
  36. # endif
  37. #endif
  38. #include "compat/strcasecmp.h"
  39. #include <ctype.h>
  40. #ifdef HAVE_LIMITS_H
  41. # include <limits.h>
  42. #endif
  43. #include "dbsdupecheck.h"
  44. #include "common/setup_after.h"
  45. #include "common/bn_type.h"
  46. #include "common/eventlog.h"
  47. const char * delimiter = "JM";
  48. int is_delimit(char * data)
  49. {
  50.   if ((data[0]==delimiter[0]) && (data[1]==delimiter[1])) return 1;
  51.   else return 0;
  52. }
  53. void * find_delimiter(char * data, unsigned int datalen)
  54. {
  55.   char * datap = data;
  56.   unsigned int count;
  57.   for (count=1; count<datalen;count++)
  58.   {
  59.     if (is_delimit(datap)) return datap;
  60.   }
  61.   return NULL;
  62. }
  63. #define SKIPLEN 750
  64. extern int dbsdupecheck(char * data, unsigned int datalen)
  65. {
  66.    char * pointer, * datap;
  67.    unsigned int restlen;
  68.    unsigned short itemcount, counter;
  69.    unsigned long uid;
  70.    // skip characters that have never played yet
  71.    if (datalen< SKIPLEN) return DBSDUPECHECK_CONTAINS_NO_DUPE;
  72.    // we skip the first SKIPLEN bytes containing various char infos wo don't care about
  73.    // this a) speeds things up
  74.    // and  b) prevents us from detecting our magic index in a bad charname ;-)
  75.    datap = data+SKIPLEN;
  76.    restlen = datalen-SKIPLEN;
  77.    do
  78.    {
  79.      pointer = find_delimiter(datap,restlen);
  80.      restlen -= (pointer-datap);
  81.      datap = pointer;
  82.    }
  83.    while ((is_delimit(datap)!=1) || (is_delimit(datap+4)!=1)); // now we should have found "JMxxJM"
  84.    
  85.    itemcount = bn_short_get(&datap[2]);
  86.    datap+=4;
  87.    restlen-=4;
  88.    for (counter=0; counter<itemcount; counter++)
  89.    {
  90.       if ((datap[4]&0x20)==0x20)
  91.       { 
  92.  eventlog(eventlog_level_info,__FUNCTION__,"simple item");
  93.  datap+=14;
  94.  restlen-=14;
  95.       }
  96.       else
  97.       {
  98. eventlog(eventlog_level_info,__FUNCTION__,"extended item");
  99. uid = bn_int_get(&datap[14]);
  100. eventlog(eventlog_level_info,__FUNCTION__,"unique ID: %lu",uid);
  101. pointer = find_delimiter(datap,restlen);
  102. restlen-= (pointer-datap);
  103. datap = pointer;
  104.       }
  105.    }
  106.    
  107.    return DBSDUPECHECK_CONTAINS_NO_DUPE;
  108. }