ruletagger 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. data/COPYING +21 -0
  2. data/History.txt +4 -0
  3. data/LICENSE +21 -0
  4. data/License.txt +20 -0
  5. data/Manifest.txt +75 -0
  6. data/PostInstall.txt +7 -0
  7. data/README +7 -0
  8. data/README.txt +53 -0
  9. data/Rakefile +33 -0
  10. data/config/hoe.rb +75 -0
  11. data/config/requirements.rb +15 -0
  12. data/ext/rule_tagger/bool.h +38 -0
  13. data/ext/rule_tagger/darray.c +292 -0
  14. data/ext/rule_tagger/darray.h +125 -0
  15. data/ext/rule_tagger/darrayP.h +50 -0
  16. data/ext/rule_tagger/extconf.rb +14 -0
  17. data/ext/rule_tagger/lex.c +170 -0
  18. data/ext/rule_tagger/lex.h +49 -0
  19. data/ext/rule_tagger/memory.c +127 -0
  20. data/ext/rule_tagger/memory.h +20 -0
  21. data/ext/rule_tagger/rbtagger.c +252 -0
  22. data/ext/rule_tagger/registry.c +326 -0
  23. data/ext/rule_tagger/registry.h +129 -0
  24. data/ext/rule_tagger/registryP.h +46 -0
  25. data/ext/rule_tagger/ruby-compat.h +20 -0
  26. data/ext/rule_tagger/rules.c +525 -0
  27. data/ext/rule_tagger/rules.h +42 -0
  28. data/ext/rule_tagger/sysdep.h +20 -0
  29. data/ext/rule_tagger/tagger.c +110 -0
  30. data/ext/rule_tagger/tagger.h +46 -0
  31. data/ext/rule_tagger/useful.c +44 -0
  32. data/ext/rule_tagger/useful.h +51 -0
  33. data/ext/word_tagger/extconf.rb +7 -0
  34. data/ext/word_tagger/porter_stemmer.c +430 -0
  35. data/ext/word_tagger/porter_stemmer.h +19 -0
  36. data/ext/word_tagger/rtagger.cc +83 -0
  37. data/ext/word_tagger/tagger.cc +153 -0
  38. data/ext/word_tagger/tagger.h +27 -0
  39. data/ext/word_tagger/tagger.rb +8 -0
  40. data/ext/word_tagger/test/Makefile +22 -0
  41. data/ext/word_tagger/test/doc.txt +87 -0
  42. data/ext/word_tagger/test/test.cc +107 -0
  43. data/ext/word_tagger/test.rb +31 -0
  44. data/lib/brill/tagger.rb +225 -0
  45. data/lib/rbtagger/version.rb +9 -0
  46. data/lib/rbtagger.rb +6 -0
  47. data/script/console +10 -0
  48. data/script/destroy +14 -0
  49. data/script/generate +14 -0
  50. data/script/txt2html +82 -0
  51. data/setup.rb +1585 -0
  52. data/tasks/deployment.rake +34 -0
  53. data/tasks/environment.rake +7 -0
  54. data/tasks/website.rake +17 -0
  55. data/test/CONTEXTUALRULEFILE +284 -0
  56. data/test/LEXICALRULEFILE +148 -0
  57. data/test/LEXICON +93696 -0
  58. data/test/docs/doc0.txt +20 -0
  59. data/test/docs/doc1.txt +11 -0
  60. data/test/docs/doc2.txt +52 -0
  61. data/test/docs/doc3.txt +128 -0
  62. data/test/docs/doc4.txt +337 -0
  63. data/test/docs/doc5.txt +497 -0
  64. data/test/docs/doc6.txt +116 -0
  65. data/test/docs/doc7.txt +101 -0
  66. data/test/docs/doc8.txt +25 -0
  67. data/test/docs/doc9.txt +84 -0
  68. data/test/tagger_test.rb +60 -0
  69. data/test/test_helper.rb +2 -0
  70. data/tools/rakehelp.rb +113 -0
  71. data/website/index.html +113 -0
  72. data/website/index.txt +53 -0
  73. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  74. data/website/stylesheets/screen.css +138 -0
  75. data/website/template.html.erb +48 -0
  76. metadata +155 -0
data/COPYING ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2008 Todd A. Fisher
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/History.txt ADDED
@@ -0,0 +1,4 @@
1
+ == 0.0.1 2008-05-14
2
+
3
+ * 1 major enhancement:
4
+ * Initial release
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2008 Todd A. Fisher
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/License.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 FIXME full name
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Manifest.txt ADDED
@@ -0,0 +1,75 @@
1
+ COPYING
2
+ History.txt
3
+ LICENSE
4
+ License.txt
5
+ Manifest.txt
6
+ PostInstall.txt
7
+ README
8
+ README.txt
9
+ Rakefile
10
+ config/hoe.rb
11
+ config/requirements.rb
12
+ ext/rule_tagger/bool.h
13
+ ext/rule_tagger/darray.c
14
+ ext/rule_tagger/darray.h
15
+ ext/rule_tagger/darrayP.h
16
+ ext/rule_tagger/extconf.rb
17
+ ext/rule_tagger/lex.c
18
+ ext/rule_tagger/lex.h
19
+ ext/rule_tagger/memory.c
20
+ ext/rule_tagger/memory.h
21
+ ext/rule_tagger/rbtagger.c
22
+ ext/rule_tagger/registry.c
23
+ ext/rule_tagger/registry.h
24
+ ext/rule_tagger/registryP.h
25
+ ext/rule_tagger/ruby-compat.h
26
+ ext/rule_tagger/rules.c
27
+ ext/rule_tagger/rules.h
28
+ ext/rule_tagger/sysdep.h
29
+ ext/rule_tagger/tagger.c
30
+ ext/rule_tagger/tagger.h
31
+ ext/rule_tagger/useful.c
32
+ ext/rule_tagger/useful.h
33
+ ext/word_tagger/extconf.rb
34
+ ext/word_tagger/porter_stemmer.c
35
+ ext/word_tagger/porter_stemmer.h
36
+ ext/word_tagger/rtagger.cc
37
+ ext/word_tagger/tagger.cc
38
+ ext/word_tagger/tagger.h
39
+ ext/word_tagger/tagger.rb
40
+ ext/word_tagger/test.rb
41
+ ext/word_tagger/test/Makefile
42
+ ext/word_tagger/test/doc.txt
43
+ ext/word_tagger/test/test.cc
44
+ lib/brill/tagger.rb
45
+ lib/rbtagger.rb
46
+ lib/rbtagger/version.rb
47
+ script/console
48
+ script/destroy
49
+ script/generate
50
+ script/txt2html
51
+ setup.rb
52
+ tasks/deployment.rake
53
+ tasks/environment.rake
54
+ tasks/website.rake
55
+ test/CONTEXTUALRULEFILE
56
+ test/LEXICALRULEFILE
57
+ test/LEXICON
58
+ test/docs/doc0.txt
59
+ test/docs/doc1.txt
60
+ test/docs/doc2.txt
61
+ test/docs/doc3.txt
62
+ test/docs/doc4.txt
63
+ test/docs/doc5.txt
64
+ test/docs/doc6.txt
65
+ test/docs/doc7.txt
66
+ test/docs/doc8.txt
67
+ test/docs/doc9.txt
68
+ test/tagger_test.rb
69
+ test/test_helper.rb
70
+ tools/rakehelp.rb
71
+ website/index.html
72
+ website/index.txt
73
+ website/javascripts/rounded_corners_lite.inc.js
74
+ website/stylesheets/screen.css
75
+ website/template.html.erb
data/PostInstall.txt ADDED
@@ -0,0 +1,7 @@
1
+
2
+ For more information on rb-brill-tagger, see http://rb-brill-tagger.rubyforge.org
3
+
4
+ NOTE: Change this information in PostInstall.txt
5
+ You can also delete it if you don't want it.
6
+
7
+
data/README ADDED
@@ -0,0 +1,7 @@
1
+ A Simple Ruby Rule-Based Part of Speech Tagger
2
+
3
+ This work is based on the work of Eric Brill
4
+
5
+ Credit for extracting Eric's work into a reusable library goes to Ken Williams as part of his work in creating the Lingua::BrillTagger perl module
6
+
7
+ This software is made available under the MIT License, see LICENSE
data/README.txt ADDED
@@ -0,0 +1,53 @@
1
+ = rbtagger
2
+
3
+ * http://github.com/taf2/rb-brill-tagger/tree/master
4
+
5
+ == DESCRIPTION:
6
+
7
+ A Simple Ruby Rule-Based Part of Speech Tagger
8
+
9
+ This work is based on the work of Eric Brill
10
+
11
+ Credit for extracting Eric's work into a reusable library goes to Ken Williams as part of his work in creating the Lingua::BrillTagger perl module
12
+
13
+ This software is made available under the MIT License, see LICENSE
14
+
15
+ == FEATURES/PROBLEMS:
16
+
17
+ * Rule based tagger
18
+ * Word matching tagger
19
+
20
+ == SYNOPSIS:
21
+
22
+ tagger = Brill::Tagger.new( File.join(File.dirname(__FILE__),"LEXICON"),
23
+ File.join(File.dirname(__FILE__),"LEXICALRULEFILE"),
24
+ File.join(File.dirname(__FILE__),"CONTEXTUALRULEFILE") )
25
+
26
+ == INSTALL:
27
+
28
+ * sudo gem install rbtagger
29
+
30
+ == LICENSE:
31
+
32
+ (The MIT License)
33
+
34
+ Copyright (c) 2008 Todd A. Fisher
35
+
36
+ Permission is hereby granted, free of charge, to any person obtaining
37
+ a copy of this software and associated documentation files (the
38
+ 'Software'), to deal in the Software without restriction, including
39
+ without limitation the rights to use, copy, modify, merge, publish,
40
+ distribute, sublicense, and/or sell copies of the Software, and to
41
+ permit persons to whom the Software is furnished to do so, subject to
42
+ the following conditions:
43
+
44
+ The above copyright notice and this permission notice shall be
45
+ included in all copies or substantial portions of the Software.
46
+
47
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
48
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
49
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
50
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
51
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
52
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
53
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,33 @@
1
+ require 'config/requirements'
2
+ require 'config/hoe' # setup Hoe + all gem configuration
3
+
4
+ Dir['tasks/**/*.rake'].each { |rake| load rake }
5
+
6
+ # redefine release
7
+
8
+ desc 'Package and upload the release to rubyforge.'
9
+ task :release_current => [:clean, :package] do |t|
10
+ require 'config/hoe'
11
+ version = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
12
+ name = $hoe.name
13
+ rubyforge_name = $hoe.rubyforge_name
14
+ description = $hoe.description
15
+ pkg = "pkg/#{name}-#{version}"
16
+ abort "Package doesn't exist => #{pkg}" if !File.exist?(pkg)
17
+
18
+ rf = RubyForge.new
19
+ puts "Logging in"
20
+ rf.login
21
+
22
+ c = rf.userconfig
23
+ c["release_notes"] = description if description
24
+ c["release_changes"] = $hoe.changes if $hoe.changes
25
+ c["preformatted"] = true
26
+
27
+ files = [(@need_tar ? "#{pkg}.tgz" : nil),
28
+ (@need_zip ? "#{pkg}.zip" : nil),
29
+ "#{pkg}.gem"].compact
30
+
31
+ puts "Releasing #{rubyforge_name} v. #{version}"
32
+ rf.add_release 'ruletagger', 'ruletagger', version, *files
33
+ end
data/config/hoe.rb ADDED
@@ -0,0 +1,75 @@
1
+ require 'rbtagger/version'
2
+
3
+ AUTHOR = 'Todd A. Fisher' # can also be an array of Authors
4
+ EMAIL = 'todd.fisher@gmail.com'
5
+ DESCRIPTION = "A Simple Ruby Rule-Based Part of Speech Tagger"
6
+ GEM_NAME = 'rbtagger' # what ppl will type to install your gem
7
+ RUBYFORGE_PROJECT = 'ruletagger' # The unix name for your project
8
+ HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
9
+ DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
10
+ EXTRA_DEPENDENCIES = [
11
+ # ['activesupport', '>= 1.3.1']
12
+ ] # An array of rubygem dependencies [name, version]
13
+
14
+ @config_file = "~/.rubyforge/user-config.yml"
15
+ @config = nil
16
+ RUBYFORGE_USERNAME = "unknown"
17
+ def rubyforge_username
18
+ unless @config
19
+ begin
20
+ @config = YAML.load(File.read(File.expand_path(@config_file)))
21
+ rescue
22
+ puts <<-EOS
23
+ ERROR: No rubyforge config file found: #{@config_file}
24
+ Run 'rubyforge setup' to prepare your env for access to Rubyforge
25
+ - See http://newgem.rubyforge.org/rubyforge.html for more details
26
+ EOS
27
+ exit
28
+ end
29
+ end
30
+ RUBYFORGE_USERNAME.replace @config["username"]
31
+ end
32
+
33
+
34
+ REV = nil
35
+ # UNCOMMENT IF REQUIRED:
36
+ # REV = YAML.load(`svn info`)['Revision']
37
+ VERS = RbTagger::VERSION::STRING + (REV ? ".#{REV}" : "")
38
+ RDOC_OPTS = ['--quiet', '--title', 'ruletagger documentation',
39
+ "--opname", "index.html",
40
+ "--line-numbers",
41
+ "--main", "README",
42
+ "--inline-source"]
43
+
44
+ class Hoe
45
+ def extra_deps
46
+ @extra_deps.reject! { |x| Array(x).first == 'hoe' }
47
+ @extra_deps
48
+ end
49
+ end
50
+
51
+ PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
52
+
53
+ # Generate all the Rake tasks
54
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
55
+ $hoe = Hoe.new(GEM_NAME, VERS) do |p|
56
+ p.developer(AUTHOR, EMAIL)
57
+ p.description = DESCRIPTION
58
+ p.summary = DESCRIPTION
59
+ p.url = HOMEPATH
60
+ p.name = RUBYFORGE_PROJECT
61
+ p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
62
+ p.test_globs = ["test/**/test_*.rb"]
63
+ p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store'] #An array of file patterns to delete on clean.
64
+
65
+ # == Optional
66
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
67
+ #p.extra_deps = EXTRA_DEPENDENCIES
68
+
69
+ #p.spec_extras = {} # A hash of extra values to set in the gemspec.
70
+ end
71
+
72
+ CHANGES = $hoe.paragraphs_of('History.txt', 0..1).join("\\n\\n")
73
+ $hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
74
+ $hoe.rsync_args = '-av --delete --ignore-errors'
75
+ $hoe.spec.post_install_message = File.open(File.dirname(__FILE__) + "/../PostInstall.txt").read rescue ""
@@ -0,0 +1,15 @@
1
+ require 'fileutils'
2
+ include FileUtils
3
+
4
+ require 'rubygems'
5
+ %w[rake hoe newgem rubigen].each do |req_gem|
6
+ begin
7
+ require req_gem
8
+ rescue LoadError
9
+ puts "This Rakefile requires the '#{req_gem}' RubyGem."
10
+ puts "Installation: gem install #{req_gem} -y"
11
+ exit
12
+ end
13
+ end
14
+
15
+ $:.unshift(File.join(File.dirname(__FILE__), %w[.. lib]))
@@ -0,0 +1,38 @@
1
+ #ifndef _BOOL_H_
2
+ #define _BOOL_H_
3
+
4
+ /* Note: It is an abstraction violation to use the C "boolean"
5
+ * operators (&&, ||, etc.) on Bool objects. Those operators
6
+ * really operate on type "int".
7
+ *
8
+ * Note: Bool_and() and Bool_or() do not short circuit.
9
+ * Bool_cand() and Bool_cor() do.
10
+ */
11
+
12
+ /* The identifier en_Bool and the values are private */
13
+
14
+ #ifdef Bool
15
+ #undef Bool
16
+ #endif
17
+
18
+ #ifdef __STDC__
19
+ typedef enum Bool_en {Bool_FALSE=0, Bool_TRUE=1} Bool;
20
+ #else
21
+ typedef int Bool;
22
+ #define Bool_FALSE 0
23
+ #define Bool_TRUE 1
24
+ #endif
25
+
26
+ /* The macro expansions are private */
27
+
28
+ #define Bool_to_int(a) ((int)a)
29
+ #define Bool_to_char(a) ((char)a)
30
+ #define Bool_create(integral_value) (((integral_value) != 0)?(Bool_TRUE):(Bool_FALSE))
31
+ /* Some type conversions are omitted for efficiency (with stupid compilers) */
32
+ #define Bool_or(a,b) ((a)|(b))
33
+ #define Bool_and(a,b) ((a)&(b))
34
+ #define Bool_cor(a,b) ((a)||(b))
35
+ #define Bool_cand(a,b) ((a)&&(b))
36
+ #define Bool_not(a) ((a)^(Bool_TRUE))
37
+
38
+ #endif
@@ -0,0 +1,292 @@
1
+ #include <stddef.h>
2
+ /*#include <stdlib.h>*/
3
+ #include <stdio.h>
4
+ #include <assert.h>
5
+
6
+ #include "sysdep.h"
7
+ #include "memory.h"
8
+ #include "bool.h"
9
+
10
+ #include "useful.h"
11
+ #include "darrayP.h"
12
+
13
+ /* Grow in the specified direction by the specified amount (number of
14
+ * new array slots). It amount is zero, grow by some default amount.
15
+ */
16
+ static NORET grow(array_rep, direction, amount)
17
+ Darray_rep *array_rep;
18
+ enum grow_direction direction;
19
+ unsigned amount;
20
+ {
21
+ int grow_amount;
22
+ int new_length;
23
+ VOIDP *temp_new_space;
24
+ VOIDP *p, *q;
25
+
26
+ assert(direction == GROW_HIGH || direction == GROW_LOW);
27
+
28
+ if (amount == 0)
29
+ grow_amount = (MAX_GROW_STEP < array_rep->storage_length) ?
30
+ MAX_GROW_STEP : array_rep->storage_length;
31
+ else
32
+ grow_amount = amount;
33
+
34
+ new_length = array_rep->storage_length + grow_amount;
35
+
36
+ /* sort of like realloc, but not really */
37
+ if (direction == GROW_HIGH) {
38
+ /* Maybe this should not use realloc, since there may be unused
39
+ slots at the low end of the darray (before storage_offset), and it
40
+ is a waste to copy them */
41
+ array_rep->storage = (VOIDP *)Memory_reallocate(array_rep->storage,
42
+ sizeof(VOIDP) * new_length);
43
+ array_rep->storage_length = new_length;
44
+ } else { /* direction == GROW_LOW */
45
+ temp_new_space = (VOIDP *)Memory_allocate(sizeof(VOIDP) * new_length);
46
+ for (p=temp_new_space+grow_amount+array_rep->storage_offset,
47
+ q=array_rep->storage+array_rep->storage_offset;
48
+ q < array_rep->storage+array_rep->storage_offset+array_rep->length;
49
+ ++p, ++q) {
50
+ *p = *q;
51
+ }
52
+ Memory_free(array_rep->storage);
53
+ array_rep->storage = temp_new_space;
54
+ array_rep->storage_length = new_length;
55
+ array_rep->storage_offset += grow_amount;
56
+ }
57
+ }
58
+
59
+ Darray Darray_create(NOARGS)
60
+ {
61
+ Darray_rep *temp = dcreate();
62
+
63
+ temp->length = 0;
64
+ temp->storage = (VOIDP *)Memory_allocate(sizeof(VOIDP));
65
+ temp->storage_length = 1;
66
+ temp->storage_offset = 0;
67
+ return draise(temp);
68
+ }
69
+
70
+ NORET Darray_destroy(dyn_ary)
71
+ Darray dyn_ary;
72
+ {
73
+ Darray_rep *temp = dlower(dyn_ary);
74
+
75
+ Memory_free((VOIDP)temp->storage);
76
+ Memory_free((VOIDP)temp);
77
+ }
78
+
79
+ NORET Darray_hint(dyn_ary, addl_hint, addh_hint)
80
+ Darray dyn_ary;
81
+ unsigned addl_hint, addh_hint;
82
+ {
83
+ Darray_rep *temp = dlower(dyn_ary);
84
+ int grow_amount;
85
+
86
+ grow_amount = addh_hint - (temp->storage_length - temp->storage_offset
87
+ - temp->length);
88
+ if (grow_amount > 0)
89
+ grow(temp, GROW_HIGH, (unsigned)grow_amount);
90
+
91
+ grow_amount = addl_hint - temp->storage_offset;
92
+ if (grow_amount > 0)
93
+ grow(temp, GROW_LOW, (unsigned)grow_amount);
94
+
95
+ }
96
+
97
+ NORET Darray_addh(dyn_ary, object)
98
+ Darray_rep *dyn_ary;
99
+ VOIDP object;
100
+ {
101
+ Darray_rep *temp = dlower(dyn_ary);
102
+ int add_posn = temp->storage_offset + temp->length;
103
+
104
+ if (add_posn >= temp->storage_length)
105
+ grow(temp, GROW_HIGH, (unsigned)0);
106
+
107
+ *(temp->storage + add_posn) = object;
108
+ ++temp->length;
109
+ }
110
+
111
+ NORET Darray_addl(dyn_ary, obj)
112
+ Darray dyn_ary;
113
+ VOIDP obj;
114
+ {
115
+ Darray_rep *temp = dlower(dyn_ary);
116
+
117
+ if (temp->storage_offset == 0)
118
+ grow(temp, GROW_LOW, (unsigned)0); /* Modifies storage_offset */
119
+
120
+ assert(temp->storage_offset > 0);
121
+
122
+ /* Note side-effect */
123
+ *(temp->storage + --temp->storage_offset) = obj;
124
+ ++temp->length;
125
+ }
126
+
127
+ VOIDP Darray_remh(dyn_ary)
128
+ Darray dyn_ary;
129
+ {
130
+ Darray_rep *temp = dlower(dyn_ary);
131
+
132
+ assert(temp->length > 0);
133
+
134
+ return *(temp->storage + temp->storage_offset + --temp->length);
135
+ }
136
+
137
+ VOIDP Darray_reml(dyn_ary)
138
+ Darray dyn_ary;
139
+ {
140
+ Darray_rep *temp = dlower(dyn_ary);
141
+ VOIDP return_value;
142
+
143
+ assert(temp->length > 0);
144
+
145
+ return_value = *(temp->storage + temp->storage_offset++);
146
+ --temp->length;
147
+ return return_value;
148
+ }
149
+
150
+ unsigned Darray_len(dyn_ary)
151
+ Darray dyn_ary;
152
+ {
153
+ assert(dyn_ary != (Darray)NULL);
154
+
155
+ return dlower(dyn_ary)->length;
156
+ }
157
+
158
+ Bool Darray_valid_index(dyn_ary, index)
159
+ Darray dyn_ary;
160
+ unsigned index;
161
+ {
162
+ return Bool_create(index < Darray_len(dyn_ary));
163
+ }
164
+
165
+ NORET Darray_set(dyn_ary, index, obj)
166
+ Darray dyn_ary;
167
+ unsigned index;
168
+ VOIDP obj;
169
+ {
170
+ Darray_rep *temp = dlower(dyn_ary);
171
+
172
+ assert(Darray_valid_index(dyn_ary, index)==Bool_TRUE);
173
+
174
+ *(temp->storage + temp->storage_offset + index) = obj;
175
+ }
176
+
177
+ VOIDP Darray_get(dyn_ary, index)
178
+ Darray dyn_ary;
179
+ unsigned index;
180
+ {
181
+ Darray_rep *temp = dlower(dyn_ary);
182
+
183
+ assert(Darray_valid_index(dyn_ary, index)==Bool_TRUE);
184
+
185
+ /* You should suppress the saber warning on the following line */
186
+ return *(temp->storage + temp->storage_offset + index);
187
+ }
188
+
189
+ NORET Darray_values(dyn_ary, c_ary)
190
+ Darray dyn_ary;
191
+ VOIDP *c_ary;
192
+ {
193
+ Darray_rep *temp = dlower(dyn_ary);
194
+ VOIDP *p, *q;
195
+
196
+ for (p=c_ary, q=temp->storage+temp->storage_offset;
197
+ q < temp->storage+temp->storage_offset+temp->length;
198
+ ++p, ++q) {
199
+ *p = *q;
200
+ }
201
+ }
202
+
203
+ Darray Darray_copy(dyn_ary)
204
+ Darray dyn_ary;
205
+ {
206
+ Darray temp = Darray_create();
207
+ unsigned int temp_len = Darray_len(dyn_ary);
208
+ unsigned int i;
209
+
210
+ Darray_hint(temp, (unsigned int)0, temp_len);
211
+ for (i = 0; i < temp_len; ++i)
212
+ Darray_addh(temp, Darray_get(dyn_ary, i));
213
+ return temp;
214
+ }
215
+
216
+
217
+ /*--------------------------------------------------*/
218
+ /* code added by Rich Pito */
219
+ /*--------------------------------------------------*/
220
+
221
+ /* Both of thes function has to be rewrutten to use the internal darray data */
222
+ /* structure. This is this way for ease of writing */
223
+
224
+ Darray Darray_remove(dar, index)
225
+ Darray dar;
226
+ int index;
227
+ {
228
+ int s, d, l;
229
+ l = Darray_len(dar);
230
+ if (index == (l - 1)) {
231
+ Darray_remh(dar);
232
+ return dar;
233
+ }
234
+ if (index == 0) {
235
+ Darray_reml(dar);
236
+ return dar;
237
+ }
238
+ s = index + 1; d = index;
239
+ while (s < l) {
240
+ Darray_set(dar, d, (VOIDP)Darray_get(dar, s));
241
+ s++; d++;
242
+ }
243
+ Darray_remh(dar);
244
+ return dar;
245
+ }
246
+
247
+ /*--------------------------------------------------*/
248
+ Darray Darray_insert(dar, index, data)
249
+ Darray dar;
250
+ int index;
251
+ VOIDP data;
252
+ {
253
+ int l = Darray_len(dar);
254
+ int source;
255
+ if (index <= 0)
256
+ Darray_addl(dar, data);
257
+ else if (index >= l)
258
+ Darray_addh(dar, data);
259
+ else {
260
+ Darray_addh(dar, NULL);
261
+ for (source = l - 1; source >= index; source--)
262
+ Darray_set(dar, source + 1, Darray_get(dar, source));
263
+ Darray_set(dar, index, data);
264
+ }
265
+ return dar;
266
+ }
267
+
268
+
269
+ /*--------------------------------------------------*/
270
+ Darray Darray_duplicate(a)
271
+ Darray a;
272
+ {
273
+ int i, l;
274
+ Darray ret;
275
+
276
+ l = Darray_len(a);
277
+ ret = Darray_create();
278
+ Darray_hint(ret, 0, l);
279
+ for (i = 0; i < l; i++) {
280
+ Darray_addh(ret, (char*)Darray_get(a, i));
281
+ }
282
+ return ret;
283
+ }
284
+
285
+ void Darray_clear(dyn_ary)
286
+ Darray dyn_ary;
287
+ {
288
+ Darray_rep *temp = dlower(dyn_ary);
289
+
290
+ temp->storage_offset = 0;
291
+ temp->length = 0;
292
+ }