cgen 0.16.1 → 0.16.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,6 +1,6 @@
1
1
  *.bck
2
- pkg/*
3
- doc/*
2
+ pkg
3
+ doc
4
4
  junk/*
5
5
  tmp/*
6
6
  tmp
data/History.txt CHANGED
@@ -1,3 +1,13 @@
1
+ cgen 0.16.2
2
+
3
+ - makedepend step uses gcc -MM if appropriate
4
+
5
+ - More documentation and refactoring thereof.
6
+
7
+ cgen 0.16.1
8
+
9
+ - More documentation and refactoring thereof.
10
+
1
11
  cgen 0.16.0
2
12
 
3
13
  - Moved to Mr. Bones, git, gems, rubyforge.
@@ -0,0 +1,43 @@
1
+ require 'cgen/cshadow'
2
+
3
+ class Complex < Numeric
4
+ include CShadow
5
+
6
+ shadow_attr_accessor :re => "double re"
7
+ shadow_attr_accessor :im => "double im"
8
+
9
+ def initialize re, im
10
+ self.re = re
11
+ self.im = im
12
+ end
13
+
14
+ define_c_method(:abs) {
15
+ include "<math.h>"
16
+ returns "rb_float_new(sqrt(pow(shadow->re, 2) + pow(shadow->im, 2)))"
17
+ }
18
+
19
+ define_c_method(:scale!) {
20
+ c_array_args {
21
+ optional :factor
22
+ default :factor => "INT2NUM(10)"
23
+ typecheck :factor => Numeric
24
+ }
25
+ body %{
26
+ shadow->re *= NUM2DBL(factor);
27
+ shadow->im *= NUM2DBL(factor);
28
+ }
29
+ returns "self"
30
+ }
31
+ end
32
+
33
+ Complex.commit
34
+
35
+ z = Complex.new 5, 1.3
36
+ p z # ==> #<Complex:0xb7dc0098 re=5.0, im=1.3>
37
+ puts z.abs # ==> 5.1662365412358
38
+ z.scale! 3.0 # float
39
+ p [z.re, z.im] # ==> [15.0, 3.9]
40
+ z.scale! 3 # int
41
+ p [z.re, z.im] # ==> [45.0, 11.7]
42
+ z.scale! # use default value
43
+ p [z.re, z.im] # ==> [450.0, 117]
data/lib/cgen/cgen.rb CHANGED
@@ -418,7 +418,7 @@ require 'cgen/inherit'
418
418
  # way that makes clear that the problem is really with commit.
419
419
  module CGenerator
420
420
 
421
- VERSION = '0.16.1'
421
+ VERSION = '0.16.2'
422
422
 
423
423
  class Accumulator ## should be a mixin? "Cumulative"?
424
424
 
@@ -888,10 +888,19 @@ class Library < Template
888
888
  build_wrapper do
889
889
  cfg = Config::CONFIG
890
890
  dirs = [cfg["sitearchdir"], cfg["archdir"], cfg["includedir"]]
891
+
892
+ makedepend_cmd =
893
+ case cfg["CC"]
894
+ when "gcc"
895
+ "gcc -MM -MF depend"
896
+ else
897
+ "makedepend -fdepend"
898
+ end
899
+
891
900
  result = system %{
892
901
  touch depend
893
- makedepend -fdepend *.c -I#{dirs.join " -I"} >#{@logname} 2>&1
894
- } ## what about "gcc -MM" as in step 6 in README.EXT ?
902
+ #{makedepend_cmd} *.c -I#{dirs.join " -I"} >#{@logname} 2>&1
903
+ }
895
904
  unless result
896
905
  log_data = File.read(@logname) rescue nil
897
906
  msg = "\n makedepend failed for #{@name}."
data/lib/cgen/cshadow.rb CHANGED
@@ -23,8 +23,10 @@ require "cgen/attribute"
23
23
  #
24
24
  # ==Usage
25
25
  #
26
- # class MyClass
27
- # include CShadow
26
+ # class MyClass
27
+ # include CShadow
28
+ # shadow_attr_accessor :x => "int x" # fox example
29
+ # end
28
30
  #
29
31
  # Include CShadow in the base class(es) that need to have shadow attributes. The
30
32
  # base class is assigned a CGenerator::Library, which can be accessed using
@@ -54,7 +56,7 @@ require "cgen/attribute"
54
56
  # Shadow classes that are placed in the same library can still be put in
55
57
  # separate C source files, using #shadow_library_file:
56
58
  #
57
- # shadow_library_file <CFile or String>
59
+ # shadow_library_file <CFile or String>
58
60
  #
59
61
  # This setting is inherited (and can be overridden) by subclasses of the current
60
62
  # class. If a class calls both #shadow_library and #shadow_library_file then
@@ -181,66 +183,66 @@ require "cgen/attribute"
181
183
  # ==Limitations:
182
184
  #
183
185
  # * Hash args are ordered unpredictably, so if struct member order is
184
- # significant (for example, because you want to pass the struct to C code that
185
- # expects it that way), use a separate declare statement for each member. Also,
186
- # take note of the self pointer at the beginning of the struct.
186
+ # significant (for example, because you want to pass the struct to C code that
187
+ # expects it that way), use a separate declare statement for each member.
188
+ # Also, take note of the self pointer at the beginning of the struct.
187
189
  #
188
190
  # * Creating a ruby+shadow object has a bit more time/space overhead than just a
189
- # C object, so CShadow may not be the best mechansism for managing heap
190
- # allocated data (for example, if you want lots of 2-element arrays). Also,
191
- # CShadow objects are fixed in size (though their members can point to other
192
- # structures).
191
+ # C object, so CShadow may not be the best mechansism for managing heap
192
+ # allocated data (for example, if you want lots of 2-element arrays). Also,
193
+ # CShadow objects are fixed in size (though their members can point to other
194
+ # structures).
193
195
  #
194
196
  # * CShadow attributes are, of course, not dynamic. They are fixed at the time
195
- # of #commit. Otherwise, they behave essentially like Ruby attributes, except
196
- # that they can be accessed only with methods or from C code; they cannot be
197
- # accessed with the @ notation. Of course, the reader and writer for a shadow
198
- # attribute can be flagged as protected or private. However, a private writer
199
- # cannot be used, since by definition private methods can only be called in the
200
- # receiverless form.
197
+ # of #commit. Otherwise, they behave essentially like Ruby attributes, except
198
+ # that they can be accessed only with methods or from C code; they cannot be
199
+ # accessed with the @ notation. Of course, the reader and writer for a shadow
200
+ # attribute can be flagged as protected or private. However, a private writer
201
+ # cannot be used, since by definition private methods can only be called in
202
+ # the receiverless form.
201
203
  #
202
204
  # * CShadow is designed for efficient in-memory structs, not packed,
203
- # network-ordered data as for example in network protocols. See the
204
- # bit-struct project for the latter.
205
+ # network-ordered data as for example in network protocols. See the
206
+ # bit-struct project for the latter.
205
207
  #
206
208
  # ==To do:
207
209
  #
208
210
  # * It should be easier to get a handle to entities. Below, shadow_attr has been
209
- # hacked to return a list of pairs of functions. But it should be easier and
210
- # more general.
211
+ # hacked to return a list of pairs of functions. But it should be easier and
212
+ # more general.
211
213
  #
212
214
  # * Optimization: if class A<B, and their free func have the same content, use
213
- # B's function in A, and don't generate a new function for A. Similarly for all
214
- # the other kinds of functions.
215
+ # B's function in A, and don't generate a new function for A. Similarly for
216
+ # all the other kinds of functions.
215
217
  #
216
218
  # * Allow
217
219
  #
218
- # shadow_attr "int x", "double y"
220
+ # shadow_attr "int x", "double y"
219
221
  #
220
- # or even
222
+ # or even
221
223
  #
222
- # attr_accessor :a, :b, "int x", "double y"
224
+ # attr_accessor :a, :b, "int x", "double y"
223
225
  #
224
- # and (in cgen)
226
+ # and (in cgen)
225
227
  #
226
- # declare "int x", "double y"
228
+ # declare "int x", "double y"
227
229
  #
228
- # The ruby name will be extracted from the string using the matching pattern.
230
+ # The ruby name will be extracted from the string using the matching pattern.
229
231
  #
230
232
  # * Generate documentation for the shadow class.
231
233
  #
232
234
  # * Change name to CStruct? CStructure?
233
235
  #
234
236
  # * Find a way to propagate append_features so that CShadow can be included in
235
- # modules and modules can contribute shadow_attrs.
237
+ # modules and modules can contribute shadow_attrs.
236
238
  #
237
239
  # * option to omit the "self" pointer, or put it at the end of the struct
238
- # automatically omit it in a class if no ShadowObjectAttributes point to it?
240
+ # automatically omit it in a class if no ShadowObjectAttributes point to it?
239
241
  #
240
242
  # * shadow_struct_constructor class method to use DATA_WRAP_STRUCT
241
243
  #
242
244
  # * Use CNativeAttribute as a default attribute? Or use the attr class hierarchy
243
- # to supply defaults?
245
+ # to supply defaults?
244
246
  #
245
247
  module CShadow
246
248
  SHADOW_SUFFIX = "_Shadow"
data/rakefile CHANGED
@@ -31,12 +31,11 @@ programs. Includes CShadow module for defining classes in terms of C structs
31
31
  with accessors and inheritance.
32
32
  END
33
33
  PROJ.changes = File.read(PROJ.history_file)[/^\w.*?(?=^\w)/m]
34
+ (PROJ.rdoc.dir = File.readlink(PROJ.rdoc.dir)) rescue nil
34
35
 
35
36
  PROJ.spec.opts << '--color'
36
37
  PROJ.test.files = Dir["test/test-*.rb"]
37
38
 
38
- ### pkg dir in tmp
39
-
40
39
  task :release => ["gem:release", "doc:release"]
41
40
 
42
41
  # EOF
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cgen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.1
4
+ version: 0.16.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel VanderWerf
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-07-26 00:00:00 -07:00
12
+ date: 2009-09-20 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -50,6 +50,7 @@ files:
50
50
  - examples/ctest3.rb
51
51
  - examples/ctest4.rb
52
52
  - examples/ctest5.rb
53
+ - examples/example-ruby-talk-26July2009.rb
53
54
  - examples/example-ruby-talk-30April2004.rb
54
55
  - examples/fixed-array.rb
55
56
  - examples/inherit-example.rb
@@ -118,6 +119,6 @@ signing_key:
118
119
  specification_version: 3
119
120
  summary: Library for packed binary data stored in ruby Strings
120
121
  test_files:
121
- - test/test-attribute.rb
122
122
  - test/test-cgen.rb
123
+ - test/test-attribute.rb
123
124
  - test/test-cshadow.rb