scws4r 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +13 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +65 -0
- data/LICENSE.txt +21 -0
- data/README.md +56 -0
- data/Rakefile +20 -0
- data/defaults/dict.utf8.xdb +0 -0
- data/defaults/rules.utf8.ini +291 -0
- data/ext/scws4r/Makefile +267 -0
- data/ext/scws4r/Makefile.am +15 -0
- data/ext/scws4r/charset.c +90 -0
- data/ext/scws4r/charset.h +14 -0
- data/ext/scws4r/config_win32.h +22 -0
- data/ext/scws4r/crc32.c +103 -0
- data/ext/scws4r/crc32.h +13 -0
- data/ext/scws4r/darray.c +35 -0
- data/ext/scws4r/darray.h +22 -0
- data/ext/scws4r/extconf.rb +3 -0
- data/ext/scws4r/lock.c +153 -0
- data/ext/scws4r/lock.h +44 -0
- data/ext/scws4r/pool.c +141 -0
- data/ext/scws4r/pool.h +53 -0
- data/ext/scws4r/rule.c +407 -0
- data/ext/scws4r/rule.h +83 -0
- data/ext/scws4r/scws.c +1581 -0
- data/ext/scws4r/scws.h +118 -0
- data/ext/scws4r/scws4r.c +207 -0
- data/ext/scws4r/scws4r.h +4 -0
- data/ext/scws4r/version.h.in +4 -0
- data/ext/scws4r/xdb.c +636 -0
- data/ext/scws4r/xdb.h +88 -0
- data/ext/scws4r/xdict.c +394 -0
- data/ext/scws4r/xdict.h +73 -0
- data/ext/scws4r/xtree.c +337 -0
- data/ext/scws4r/xtree.h +65 -0
- data/lib/scws4r/version.rb +5 -0
- data/lib/scws4r.rb +15 -0
- data/scws4r.gemspec +30 -0
- data/sig/scws.rbs +4 -0
- data/test.rb +16 -0
- metadata +88 -0
data/ext/scws4r/lock.c
ADDED
@@ -0,0 +1,153 @@
|
|
1
|
+
/*
|
2
|
+
+----------------------------------------------------------------------+
|
3
|
+
| PHP Version 5 |
|
4
|
+
+----------------------------------------------------------------------+
|
5
|
+
| Copyright (c) 1997-2007 The PHP Group |
|
6
|
+
+----------------------------------------------------------------------+
|
7
|
+
| This source file is subject to version 3.01 of the PHP license, |
|
8
|
+
| that is bundled with this package in the file LICENSE, and is |
|
9
|
+
| available through the world-wide-web at the following url: |
|
10
|
+
| http://www.php.net/license/3_01.txt |
|
11
|
+
| If you did not receive a copy of the PHP license and are unable to |
|
12
|
+
| obtain it through the world-wide-web, please send a note to |
|
13
|
+
| license@php.net so we can mail you a copy immediately. |
|
14
|
+
+----------------------------------------------------------------------+
|
15
|
+
| Author: Sascha Schumann <sascha@schumann.cx> |
|
16
|
+
+----------------------------------------------------------------------+
|
17
|
+
*/
|
18
|
+
|
19
|
+
/* $Id$ */
|
20
|
+
|
21
|
+
#ifdef HAVE_CONFIG_H
|
22
|
+
# include "config.h"
|
23
|
+
#endif
|
24
|
+
|
25
|
+
#include <errno.h>
|
26
|
+
#include "lock.h"
|
27
|
+
|
28
|
+
#if HAVE_STRUCT_FLOCK
|
29
|
+
# include <unistd.h>
|
30
|
+
# include <fcntl.h>
|
31
|
+
# include <sys/file.h>
|
32
|
+
#endif
|
33
|
+
|
34
|
+
#ifdef WIN32
|
35
|
+
# include "config_win32.h"
|
36
|
+
# include <winsock.h>
|
37
|
+
#endif
|
38
|
+
|
39
|
+
#ifdef NETWARE
|
40
|
+
# include <netinet/in.h>
|
41
|
+
#endif
|
42
|
+
|
43
|
+
|
44
|
+
int _xdb_flock(int fd, int operation)
|
45
|
+
#if HAVE_STRUCT_FLOCK
|
46
|
+
{
|
47
|
+
struct flock flck;
|
48
|
+
int ret;
|
49
|
+
|
50
|
+
flck.l_start = flck.l_len = 0;
|
51
|
+
flck.l_whence = SEEK_SET;
|
52
|
+
|
53
|
+
if (operation & LOCK_SH)
|
54
|
+
flck.l_type = F_RDLCK;
|
55
|
+
else if (operation & LOCK_EX)
|
56
|
+
flck.l_type = F_WRLCK;
|
57
|
+
else if (operation & LOCK_UN)
|
58
|
+
flck.l_type = F_UNLCK;
|
59
|
+
else {
|
60
|
+
errno = EINVAL;
|
61
|
+
return -1;
|
62
|
+
}
|
63
|
+
|
64
|
+
ret = fcntl(fd, operation & LOCK_NB ? F_SETLK : F_SETLKW, &flck);
|
65
|
+
|
66
|
+
if (operation & LOCK_NB && ret == -1 &&
|
67
|
+
(errno == EACCES || errno == EAGAIN))
|
68
|
+
errno = EWOULDBLOCK;
|
69
|
+
|
70
|
+
if (ret != -1) ret = 0;
|
71
|
+
|
72
|
+
return ret;
|
73
|
+
}
|
74
|
+
#elif defined(WIN32)
|
75
|
+
/*
|
76
|
+
* Program: Unix compatibility routines
|
77
|
+
*
|
78
|
+
* Author: Mark Crispin
|
79
|
+
* Networks and Distributed Computing
|
80
|
+
* Computing & Communications
|
81
|
+
* University of Washington
|
82
|
+
* Administration Building, AG-44
|
83
|
+
* Seattle, WA 98195
|
84
|
+
* Internet: MRC@CAC.Washington.EDU
|
85
|
+
*
|
86
|
+
* Date: 14 September 1996
|
87
|
+
* Last Edited: 14 August 1997
|
88
|
+
*
|
89
|
+
* Copyright 1997 by the University of Washington
|
90
|
+
*
|
91
|
+
* Permission to use, copy, modify, and distribute this software and its
|
92
|
+
* documentation for any purpose and without fee is hereby granted, provided
|
93
|
+
* that the above copyright notice appears in all copies and that both the
|
94
|
+
* above copyright notice and this permission notice appear in supporting
|
95
|
+
* documentation, and that the name of the University of Washington not be
|
96
|
+
* used in advertising or publicity pertaining to distribution of the software
|
97
|
+
* without specific, written prior permission. This software is made available
|
98
|
+
* "as is", and
|
99
|
+
* THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
|
100
|
+
* WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN
|
101
|
+
* NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL,
|
102
|
+
* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
103
|
+
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT
|
104
|
+
* (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION
|
105
|
+
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
106
|
+
*
|
107
|
+
*/
|
108
|
+
/* DEDICATION
|
109
|
+
|
110
|
+
* This file is dedicated to my dog, Unix, also known as Yun-chan and
|
111
|
+
* Unix J. Terwilliker Jehosophat Aloysius Monstrosity Animal Beast. Unix
|
112
|
+
* passed away at the age of 11 1/2 on September 14, 1996, 12:18 PM PDT, after
|
113
|
+
* a two-month bout with cirrhosis of the liver.
|
114
|
+
*
|
115
|
+
* He was a dear friend, and I miss him terribly.
|
116
|
+
*
|
117
|
+
* Lift a leg, Yunie. Luv ya forever!!!!
|
118
|
+
*/
|
119
|
+
{
|
120
|
+
HANDLE hdl = (HANDLE) _get_osfhandle(fd);
|
121
|
+
DWORD low = 1, high = 0;
|
122
|
+
OVERLAPPED offset =
|
123
|
+
{0, 0, 0, 0, NULL};
|
124
|
+
if (hdl < 0)
|
125
|
+
return -1; /* error in file descriptor */
|
126
|
+
/* bug for bug compatible with Unix */
|
127
|
+
UnlockFileEx(hdl, 0, low, high, &offset);
|
128
|
+
switch (operation & ~LOCK_NB) { /* translate to LockFileEx() op */
|
129
|
+
case LOCK_EX: /* exclusive */
|
130
|
+
if (LockFileEx(hdl, LOCKFILE_EXCLUSIVE_LOCK +
|
131
|
+
((operation & LOCK_NB) ? LOCKFILE_FAIL_IMMEDIATELY : 0),
|
132
|
+
0, low, high, &offset))
|
133
|
+
return 0;
|
134
|
+
break;
|
135
|
+
case LOCK_SH: /* shared */
|
136
|
+
if (LockFileEx(hdl, ((operation & LOCK_NB) ? LOCKFILE_FAIL_IMMEDIATELY : 0),
|
137
|
+
0, low, high, &offset))
|
138
|
+
return 0;
|
139
|
+
break;
|
140
|
+
case LOCK_UN: /* unlock */
|
141
|
+
return 0; /* always succeeds */
|
142
|
+
default: /* default */
|
143
|
+
break;
|
144
|
+
}
|
145
|
+
return -1;
|
146
|
+
}
|
147
|
+
#else
|
148
|
+
#warning no proper flock supported
|
149
|
+
{
|
150
|
+
errno = 0;
|
151
|
+
return 0;
|
152
|
+
}
|
153
|
+
#endif
|
data/ext/scws4r/lock.h
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
/*
|
2
|
+
+----------------------------------------------------------------------+
|
3
|
+
| PHP Version 5 |
|
4
|
+
+----------------------------------------------------------------------+
|
5
|
+
| Copyright (c) 1997-2007 The PHP Group |
|
6
|
+
+----------------------------------------------------------------------+
|
7
|
+
| This source file is subject to version 3.01 of the PHP license, |
|
8
|
+
| that is bundled with this package in the file LICENSE, and is |
|
9
|
+
| available through the world-wide-web at the following url: |
|
10
|
+
| http://www.php.net/license/3_01.txt |
|
11
|
+
| If you did not receive a copy of the PHP license and are unable to |
|
12
|
+
| obtain it through the world-wide-web, please send a note to |
|
13
|
+
| license@php.net so we can mail you a copy immediately. |
|
14
|
+
+----------------------------------------------------------------------+
|
15
|
+
| Author: Sascha Schumann <sascha@schumann.cx> |
|
16
|
+
+----------------------------------------------------------------------+
|
17
|
+
*/
|
18
|
+
|
19
|
+
/* $Id$ */
|
20
|
+
|
21
|
+
#ifndef LOCK_H
|
22
|
+
#define LOCK_H
|
23
|
+
|
24
|
+
/* php_flock internally uses fcntl whether or not flock is available
|
25
|
+
* This way our php_flock even works on NFS files.
|
26
|
+
* More info: /usr/src/linux/Documentation
|
27
|
+
*/
|
28
|
+
int _xdb_flock(int fd, int operation);
|
29
|
+
|
30
|
+
#ifndef HAVE_FLOCK
|
31
|
+
# define LOCK_SH 1
|
32
|
+
# define LOCK_EX 2
|
33
|
+
# define LOCK_NB 4
|
34
|
+
# define LOCK_UN 8
|
35
|
+
#endif
|
36
|
+
|
37
|
+
#ifdef WIN32
|
38
|
+
# define EWOULDBLOCK WSAEWOULDBLOCK
|
39
|
+
# define fsync _commit
|
40
|
+
# define ftruncate(a, b) chsize(a, b)
|
41
|
+
# include <windows.h>
|
42
|
+
#endif /* defined(WIN32) */
|
43
|
+
|
44
|
+
#endif /* LOCK_H */
|
data/ext/scws4r/pool.c
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
/**
|
2
|
+
* @file pool.c
|
3
|
+
* @author Hightman Mar
|
4
|
+
* @editor set number ; syntax on ; set autoindent ; set tabstop=4 (vim)
|
5
|
+
* $Id$
|
6
|
+
*/
|
7
|
+
|
8
|
+
#include "pool.h"
|
9
|
+
#include <stdio.h>
|
10
|
+
#include <stdlib.h>
|
11
|
+
#ifndef WIN32
|
12
|
+
# include <unistd.h>
|
13
|
+
#endif
|
14
|
+
#include <string.h>
|
15
|
+
|
16
|
+
/** pool memory management */
|
17
|
+
static void _pool_append_clean(pool_t p, void *obj)
|
18
|
+
{
|
19
|
+
struct pclean *c;
|
20
|
+
|
21
|
+
p->size += sizeof(struct pclean);
|
22
|
+
c = (struct pclean *) malloc(sizeof(struct pclean));
|
23
|
+
c->obj = obj;
|
24
|
+
c->nxt = p->clean;
|
25
|
+
p->clean = c;
|
26
|
+
}
|
27
|
+
|
28
|
+
static void _pool_heap_new(pool_t p)
|
29
|
+
{
|
30
|
+
if (p->heap != NULL)
|
31
|
+
p->dirty += (p->heap->size - p->heap->used);
|
32
|
+
|
33
|
+
p->heap = (struct pheap *) malloc(POOL_BLK_SIZ);
|
34
|
+
p->heap->size = POOL_BLK_SIZ - sizeof(struct pheap);
|
35
|
+
p->heap->used = 0;
|
36
|
+
p->size += POOL_BLK_SIZ;
|
37
|
+
|
38
|
+
_pool_append_clean(p, (void *) p->heap);
|
39
|
+
}
|
40
|
+
|
41
|
+
|
42
|
+
pool_t pool_new()
|
43
|
+
{
|
44
|
+
pool_t p;
|
45
|
+
|
46
|
+
p = (pool_t) malloc(sizeof(pool_st));
|
47
|
+
p->size = sizeof(pool_st);
|
48
|
+
p->dirty = 0;
|
49
|
+
p->heap = NULL;
|
50
|
+
p->clean = NULL;
|
51
|
+
_pool_heap_new(p);
|
52
|
+
return p;
|
53
|
+
}
|
54
|
+
|
55
|
+
void pool_free(pool_t p)
|
56
|
+
{
|
57
|
+
struct pclean *cur, *nxt;
|
58
|
+
|
59
|
+
cur = p->clean;
|
60
|
+
while (cur != NULL)
|
61
|
+
{
|
62
|
+
free(cur->obj);
|
63
|
+
nxt = cur->nxt;
|
64
|
+
free(cur);
|
65
|
+
cur = nxt;
|
66
|
+
}
|
67
|
+
free(p);
|
68
|
+
}
|
69
|
+
|
70
|
+
void *pmalloc(pool_t p, int size)
|
71
|
+
{
|
72
|
+
void *block;
|
73
|
+
|
74
|
+
/* big request */
|
75
|
+
if (size > (p->heap->size / 4))
|
76
|
+
{
|
77
|
+
block = malloc(size);
|
78
|
+
p->size += size;
|
79
|
+
_pool_append_clean(p, block);
|
80
|
+
return block;
|
81
|
+
}
|
82
|
+
|
83
|
+
/* memory align (>=4) */
|
84
|
+
if (size & 0x04)
|
85
|
+
{
|
86
|
+
while (p->heap->used & 0x03)
|
87
|
+
{
|
88
|
+
p->dirty++;
|
89
|
+
p->heap->used++;
|
90
|
+
}
|
91
|
+
}
|
92
|
+
|
93
|
+
/* not enough? */
|
94
|
+
if (size > (p->heap->size - p->heap->used))
|
95
|
+
_pool_heap_new(p);
|
96
|
+
|
97
|
+
block = (void *)((char *) p->heap->block + p->heap->used);
|
98
|
+
p->heap->used += size;
|
99
|
+
return block;
|
100
|
+
}
|
101
|
+
|
102
|
+
void *pmalloc_x(pool_t p, int size, char c)
|
103
|
+
{
|
104
|
+
void *result = pmalloc(p, size);
|
105
|
+
memset(result, c, size);
|
106
|
+
return result;
|
107
|
+
}
|
108
|
+
|
109
|
+
void *pmalloc_z(pool_t p, int size)
|
110
|
+
{
|
111
|
+
return pmalloc_x(p, size, 0);
|
112
|
+
}
|
113
|
+
|
114
|
+
char *pstrdup(pool_t p, const char *src)
|
115
|
+
{
|
116
|
+
char *dst;
|
117
|
+
int len;
|
118
|
+
|
119
|
+
if (src == NULL)
|
120
|
+
return NULL;
|
121
|
+
|
122
|
+
len = strlen(src) + 1;
|
123
|
+
dst = (char *) pmalloc(p, len);
|
124
|
+
memcpy(dst, src, len);
|
125
|
+
return dst;
|
126
|
+
}
|
127
|
+
|
128
|
+
char *pstrndup(pool_t p, const char *src, int len)
|
129
|
+
{
|
130
|
+
char *dst;
|
131
|
+
|
132
|
+
if (src == NULL)
|
133
|
+
return NULL;
|
134
|
+
|
135
|
+
dst = (char *) pmalloc(p, len + 1);
|
136
|
+
memcpy(dst, src, len);
|
137
|
+
dst[len] = '\0';
|
138
|
+
|
139
|
+
return dst;
|
140
|
+
}
|
141
|
+
|
data/ext/scws4r/pool.h
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
/**
|
2
|
+
* @file pool.h
|
3
|
+
* @author Hightman Mar
|
4
|
+
* @editor set number ; syntax on ; set autoindent ; set tabstop=4 (vim)
|
5
|
+
* $Id$
|
6
|
+
*/
|
7
|
+
|
8
|
+
#ifndef _SCWS_POOL_20070525_H_
|
9
|
+
#define _SCWS_POOL_20070525_H_
|
10
|
+
|
11
|
+
#ifdef __cplusplus
|
12
|
+
extern "C" {
|
13
|
+
#endif
|
14
|
+
|
15
|
+
/* block size for pool */
|
16
|
+
#define POOL_BLK_SIZ 4096
|
17
|
+
|
18
|
+
/* data structure for pool */
|
19
|
+
struct pheap
|
20
|
+
{
|
21
|
+
int size;
|
22
|
+
int used;
|
23
|
+
char block[0];
|
24
|
+
};
|
25
|
+
|
26
|
+
struct pclean
|
27
|
+
{
|
28
|
+
void *obj;
|
29
|
+
struct pclean *nxt;
|
30
|
+
};
|
31
|
+
|
32
|
+
typedef struct
|
33
|
+
{
|
34
|
+
int size; /* total allocated */
|
35
|
+
int dirty; /* total wasted */
|
36
|
+
struct pheap *heap;
|
37
|
+
struct pclean *clean;
|
38
|
+
} pool_st, *pool_t;
|
39
|
+
|
40
|
+
/* pool: api */
|
41
|
+
pool_t pool_new(); /* create a new memory pool with an initial heap size */
|
42
|
+
void pool_free(pool_t p); /* frees all the data on the pool & delete the pool itself */
|
43
|
+
void *pmalloc(pool_t p, int size); /* wrapper around malloc, takes from the pool */
|
44
|
+
void *pmalloc_x(pool_t p, int size, char c); /* wrapper around pmalloc which prefills buffer with c */
|
45
|
+
void *pmalloc_z(pool_t p, int size); /* wrapper around pmalloc, which prefills by zero */
|
46
|
+
char *pstrdup(pool_t p, const char *s); /* wrapper around strdup, gains the mem from the pool */
|
47
|
+
char *pstrndup(pool_t p, const char *s, int l);
|
48
|
+
|
49
|
+
#ifdef __cplusplus
|
50
|
+
}
|
51
|
+
#endif
|
52
|
+
|
53
|
+
#endif
|