1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-02 21:10:27 +02:00
Commit graph

7681 commits

Author SHA1 Message Date
Ludovic Courtès
e578faea20 Tweak `read-line'.
* libguile/rdelim.c (LINE_BUFFER_SIZE): Set to 1 KiB instead of 4 KiB.
  (scm_read_line): Initialize STRING to #f so we actually use the fast
  path.
2011-01-26 23:03:17 +01:00
Andy Wingo
1cc0b6adde fix error-handling of apply to non-list
* libguile/vm-engine.c (vm_error_apply_to_non_list): Sync registers
  before erroring. Fix type of finish_args.  Thanks to Hans Aberg for
  the report.
2011-01-26 21:44:12 +01:00
Ludovic Courtès
a2c36371ce Rewrite read-line' in terms of scm_getc'.
As a result `read-line' handles decoding and decoding errors the same
way as `scm_getc'.  It's also simpler and free of `malloc' calls.

* libguile/rdelim.c (scm_do_read_line): Remove.
  (scm_read_line): Rewrite as a loop that calls `scm_getc'.

* test-suite/tests/rdelim.test: New file.
* test-suite/Makefile.am (SCM_TESTS): Add `tests/rdelim.test'.
2011-01-26 00:29:51 +01:00
Ludovic Courtès
cc540d0bbd Have `scm_getc' honor the port's conversion strategy.
* libguile/ports.c (get_codepoint): Reset `pt->input_cd' upon failure.
  If `pt->ilseq_handler' is `SCM_ICONVEH_QUESTION_MARK', then return a
  question mark.
  [failure]: Use `scm_encoding_error' when raising an error.

* test-suite/lib.scm (exception:encoding-error): Adjust regexp.

* test-suite/tests/ports.test ("string ports")["read-char, wrong
  encoding, error", "read-char, wrong encoding, escape", "read-char,
  wrong encoding, substitute"]: New tests.
2011-01-26 00:29:51 +01:00
Ludovic Courtès
647dc1ac23 Add `scm_{to,from}_utf32_string'.
* libguile/strings.c (scm_from_utf32_string, scm_from_utf32_stringn,
  scm_to_utf32_string, scm_to_utf32_stringn): New functions.

* libguile/strings.h (scm_from_utf32_string, scm_from_utf32_stringn,
  scm_to_utf32_string, scm_to_utf32_stringn): New declarations.

* doc/ref/api-data.texi (Conversion to/from C): Document
  `scm_{to,from}_{utf8,utf32}_stringn'.
2011-01-26 00:29:50 +01:00
Ludovic Courtès
e9a35a965b Optimize `scm_{to,from}_latin1_string'.
* libguile/strings.c (scm_from_latin1_stringn): Directly return a narrow
  string instead of going through `scm_from_stringn'.
  (scm_to_latin1_stringn): Directly return a copy of STR's raw bytes when
  it's narrow.
2011-01-26 00:29:50 +01:00
Ludovic Courtès
da288f50bf Remove useless branches in the port code.
* libguile/ports.c (scm_i_get_port_encoding): Remove useless `if'.
  (scm_set_port_encoding_x): Remove redundant `find_valid_encoding'
  call.
2011-01-24 23:15:18 +01:00
Ludovic Courtès
d9544bf012 Always initialize a port's encoding name.
* libguile/ports.c (scm_i_set_port_encoding_x): Always initialize
  PT->encoding to something non-NULL.  This fixes callers of
  `scm_encoding_error' such that they always pass a non-NULL encoding
  name.  Reported by Matei Conovici.
2011-01-24 23:15:18 +01:00
Ludovic Courtès
4325620f6d Rewrite scm_lfwrite_substr' in terms of scm_display'.
* libguile/ports.c (scm_lfwrite_substr): Rewrite in terms of
  `scm_display'.
2011-01-23 01:26:07 +01:00
Ludovic Courtès
a917871527 Remove `scm_lfwrite_str'.
* libguile/ports.c (scm_lfwrite_str): Remove.

* libguile/ports.h (scm_lfwrite_str): Remove declaration.

* libguile/numbers.c (scm_i_print_fraction): Use `scm_display' instead
  of `scm_lfwrite_str'.
2011-01-23 01:14:51 +01:00
Ludovic Courtès
31d4d02be7 Hide the string escaping hacks.
* libguile/strings.c (scm_i_unistring_escapes_to_guile_escapes): Rename
  to...
  (unistring_escapes_to_guile_escapes): ... this.  Make `static'.
  (scm_i_unistring_escapes_to_r6rs_escapes): Rename to...
  (unistring_escapes_to_r6rs_escapes): ... this.  Make `static'.

* libguile/strings.h (scm_i_unistring_escapes_to_guile_escapes,
  scm_i_unistring_escapes_to_r6rs_escapes): Remove declarations.
2011-01-23 00:37:25 +01:00
Ludovic Courtès
f4bc4e5934 Rewrite read-char', display', etc. using iconv calls instead of libunistring.
Thanks to Bruno Haible for his suggestions.  See
<http://lists.gnu.org/archive/html/bug-libunistring/2010-09/msg00007.html>,
for details.

* libguile/ports.c (register_finalizer_for_port): Always register a
  finalizer for PORT.
  (finalize_port): Close ENTRY->input_cd and ENTRY->output_cd.
  (scm_new_port_table_entry): Initialize the `input_cd' and `output_cd'
  fields.
  (utf8_to_codepoint): New function.
  (get_codepoint): Rewrite to use `iconv' instead of libunistring.
  (scm_i_set_port_encoding_x): Initialize the `input_cd' and `output_cd'
  fields.
  (update_port_lf): Move upward.  Use `switch' instead of `if's.

* libguile/ports.h (scm_t_port)[input_cd, output_cd]: New fields.

* libguile/print.c (codepoint_to_utf8, display_string): New functions.
  (display_character): Use `display_string'.
  (write_combining_character): Likewise.
  (iprin1): Use `display_string' instead of `scm_lfwrite_str', and
  `display_character' instead of `scm_putc'.
  (write_character): Likewise.
  (write_character_escaped): New function.

* test-suite/tests/encoding-escapes.test ("display output
  escapes")["Rashomon"]: Use lower-case escapes.
  ["fake escape"]: New test.
2011-01-23 00:37:25 +01:00
Andy Wingo
8e43ed5d0b infinities are no longer integers
* libguile/numbers.c (scm_is_integer): Infinities are not integers, per
  the R6RS.
  (scm_even_p, scm_odd_p): Passing an infinity to even? or odd? is an
  error.

* test-suite/tests/numbers.test ("integer?"): Adapt test.
  ("expt"): Add tests for +inf.0 and -inf.0 exponents.

* NEWS: Add NEWS entries.
2011-01-23 00:06:24 +01:00
Andy Wingo
cde24ce12b scm_with_guile calls GC_call_with_gc_active
* configure.ac: Check for GC_call_with_gc_active.

* libguile/threads.h (scm_i_thread): Remove "top", as it's not used.

* libguile/threads.c (with_gc_inactive, with_gc_active): Define shims to
  GC_do_blocking and GC_call_with_gc_active.
  (scm_i_init_thread_for_guile): Don't do thread base adjustment here,
  do it in scm_i_with_guile_and_parent.  The previous logic would never
  be run.
  (scm_i_with_guile_and_parent): If we enter Guile mode, leave it too.
  Take care of adjusting the thread stack base here too.  Also, call
  with_gc_active.
  (scm_without_guile): Refactor.
2011-01-22 19:55:31 +01:00
Andy Wingo
684d664e39 implement r6rs hungry escaped EOL
* libguile/private-options.h (SCM_HUNGRY_EOL_ESCAPES_P): New private
  option.
* libguile/read.c: Define SCM_HUNGRY_EOL_ESCAPES_P, defaulting to #f.
  (skip_intraline_whitespace): New helper.
  (scm_read_string): If SCM_HUNGRY_EOL_ESCAPES_P,
  skip_intraline_whitespace after an escaped EOL.

* test-suite/tests/reader.test ("read-options"): Add test.
2011-01-21 09:24:32 +01:00
Mark H Weaver
01c7284ae5 Fix bugs in expt and integer-expt
* libguile/numbers.c (scm_expt): Fix bug that caused expt to throw an
  exception whenever the base was exact and the exponent was an
  inexact integer, e.g. (expt 5 6.0).

  (scm_expt): Fix bug that caused expt to introduce spurious imaginary
  parts in the result when the base was an inexact negative real and
  the exponent was an integer, e.g. (expt -1.0 2)

  (scm_integer_expt, scm_expt): Change behavior of (integer-expt 0 -1),
  and therefore also (expt 0 -1), to return NaN, per R6RS (actually,
  R6RS says we should throw an exception or return an "unspecified
  number object", but for now we use NaN).  Formerly we returned 0, per
  R5RS. R5RS claims that 0^x=0 for all non-zero x, but that's
  mathematically incorrect, and probably an oversight.

  (scm_integer_expt): Consistently throw a wrong-argument-type exception
  when the exponent is inexact.  Formerly, it didn't always check this
  if the base was 0, 1, or -1.

* test-suite/tests/numbers.test ("integer-expt", "expt"): Add tests.
2011-01-20 23:28:37 +01:00
Andy Wingo
a574564c24 fix scm_from_stringn empty string case
* libguile/strings.c (scm_from_stringn): Fix empty string case
  (oops...).
2011-01-07 22:16:10 -08:00
Andy Wingo
2dd7d8ce7a fix tab completion in repl (doh)
* libguile/hashtab.c: Fix remaining vector hash table support.
* module/ice-9/session.scm (apropos-fold): Use a hash table instead of a
  vector for the completions.
2011-01-07 22:01:27 -08:00
Andy Wingo
4a655e50a3 use scm_from_latin1_symboln for string literals and load-symbol
* libguile/bytevectors.c:
* libguile/eval.c:
* libguile/goops.c:
* libguile/i18n.c:
* libguile/load.c:
* libguile/memoize.c:
* libguile/modules.c:
* libguile/ports.c:
* libguile/print.c:
* libguile/procs.c:
* libguile/programs.c:
* libguile/read.c:
* libguile/script.c:
* libguile/srfi-14.c:
* libguile/stacks.c:
* libguile/strings.c:
* libguile/throw.c:
* libguile/vm.c: Use scm_from_latin1_symboln to make symbols from string
  literals, because they aren't in the user's locale -- they are in
  ASCII, and we can optimize this case.

* libguile/vm-i-loader.c: Also use scm_from_latin1_symboln when loading
  narrow symbols.
2011-01-07 09:18:41 -08:00
Andy Wingo
30c282bf93 optimize scm_from_latin1_symboln
* libguile/symbols.c (lookup_interned_latin1_symbol): New helper.
  (scm_from_latin1_symboln): Use lookup_interned_latin1_symbol, so we
  avoid allocating a string in that case.
2011-01-07 09:18:41 -08:00
Andy Wingo
17072fd2c6 lookup_interned_symbol uses get_handle_by_hash
* libguile/symbols.c (lookup_interned_symbol): Change to use
  scm_hash_fn_get_handle_by_hash.
2011-01-07 09:18:37 -08:00
Andy Wingo
6efbc280c5 add scm_hash_fn_get_handle_by_hash
* libguile/hashtab.h:
* libguile/hashtab.c (scm_hash_fn_get_handle_by_hash): New internal
  procedure, which should make symbol table lookup faster.
2011-01-07 09:18:37 -08:00
Andy Wingo
f0554ee74a remove vector hash table code
* libguile/hashtab.c: Remove deprecated hash-tables-as-vectors support
  code.
2011-01-07 09:18:36 -08:00
Andy Wingo
328255e4f4 hashtab cleanups
* libguile/hashtab.c: Update comments.
  (hashtable_size): Allow bigger vectors on 64-bit machines.
2011-01-07 09:18:36 -08:00
Andy Wingo
e0c83bf500 fix symbol garbage collection
* libguile/symbols.c (lookup_interned_symbol, intern_symbol): Refactor
  to use hashtab.[ch] interfaces.
2011-01-07 09:18:36 -08:00
Andy Wingo
622415380c add hash functions for locale, latin1, and utf8 strings
* libguile/hash.c (scm_i_locale_string_hash)
  (scm_i_latin1_string_hash, scm_i_utf8_string_hash): New functions.
2011-01-07 09:18:36 -08:00
Andy Wingo
f756cd3076 multibyte regex error handling fix
* libguile/regex-posix.c (fixup_multibyte_match): Fix mbrlen error
  handling.
2011-01-07 09:18:36 -08:00
Andy Wingo
247a56fa5a hash.c cleanup
* libguile/hash.c (scm_hasher): Remove needless remember_upto_here.
2011-01-07 09:18:36 -08:00
Andy Wingo
ad5cbc470f add scm_from_{latin1,utf8}_symbol{n,}
* libguile/symbols.c (scm_from_latin1_symbol, scm_from_latin1_symboln)
  (scm_from_utf8_symbol, scm_from_utf8_symboln): New functions.
2011-01-07 09:18:36 -08:00
Andy Wingo
d40e1ca893 add scm_{to,from}_{utf8,latin1}_string{n,}
* libguile/strings.h:
* libguile/strings.c (scm_from_latin1_string, scm_to_latin1_string): New
  functions, in terms of the latin1_stringn variants.
  (scm_from_utf8_string, scm_from_utf8_stringn)
  (scm_to_utf8_string, scm_to_utf8_stringn): New functions.
  (scm_i_from_utf8_string, scm_i_to_utf8_string): Removed these internal
  functions.
  (scm_from_stringn): Handle -1 as a length. Unlike the previous
  behavior of scm_from_locale_string (NULL), which returned the empty
  string, we now raise an error.  The null pointer is not the same as
  the empty string.

* libguile/stime.c (scm_strftime, scm_strptime): Adapt to publishing of
  utf8 functions.
2011-01-07 09:18:36 -08:00
Ludovic Courtès
66d8613108 Change getaddrinfo' test to handle the GNU-specific EAI_NODATA'.
* doc/ref/posix.texi (Network Databases): Mention `EAI_NODATA'.

* libguile/net_db.c (scm_getaddrinfo): Likewise for the docstring.

* test-suite/tests/net-db.test ("getaddrinfo")["no name"]: Handle
  `EAI_NODATA'.
2011-01-05 22:17:26 +01:00
Ludovic Courtès
bf7c2e964e Improve doc of string-index', string-index-right', and `string-rindex'.
Suggested by Noah Lavine <noah.b.lavine@gmail.com>.

* doc/ref/api-data.texi (String Searching): Mention the return value of
  `string-index', `string-index-right', and `string-rindex' when no
  match is found.

* libguile/srfi-13.c (scm_string_index, scm_string_index_right,
  scm_string_rindex): Adjust docstring accordingly.
2011-01-04 18:08:58 +01:00
Ludovic Courtès
8aa47f2609 Have lookahead-u8' and get-u8' actually do binary input.
* libguile/r6rs-ports.c (scm_lookahead_u8): Use `scm_get_byte_or_eof'
  instead of `scm_peek_char'.
  (scm_get_u8): Likewise.

* test-suite/tests/r6rs-ports.test ("7.2.8 Binary
  Input")["lookahead-u8"]: Fix typo.
  ["lookahead-u8 non-ASCII"]: New test.
2010-12-21 00:50:22 +01:00
Ludovic Courtès
6bf623ca34 Remove conflicting `scm_is_string' declaration.
* libguile/strings.h: Move `scm_is_string' declaration...
* libguile/inline.h: ... here.
  Reported by Noah Lavine <noah.b.lavine@gmail.com>.
2010-12-17 14:34:22 +01:00
Andy Wingo
e01163b5f1 rename make-undefined-fluid to make-unbound-fluid
* libguile/fluids.c (scm_make_unbound_fluid): Rename from
  scm_make_undefined_fluid.

* libguile/fluids.h:
* module/language/elisp/runtime.scm: Update referrers.
2010-12-17 13:10:03 +01:00
Ludovic Courtès
70249b9857 Rehash weak hash tables less frequently.
* libguile/hashtab.c (weak_bucket_assoc): Call `scm_i_rehash' only when
  REMAINING is below `SCM_HASHTABLE_LOWER (table)'.
2010-12-16 23:45:23 +01:00
Ludovic Courtès
3854d5fd23 Fix `hash' for pointer objects.
Previously all pointer objects would hash to the same value.

* libguile/hash.c (scm_hasher): Add case for `scm_tc7_pointer'.
2010-12-16 23:45:23 +01:00
Ludovic Courtès
183f784947 Inline `scm_is_string'.
* libguile/strings.c (scm_is_string): Move to...
* libguile/inline.h (scm_is_string): ... here.  Inline.
2010-12-16 23:45:23 +01:00
Andy Wingo
557abc4978 fix bugs in primitive-poll
* libguile/poll.c (scm_primitive_poll): Only mark POLLOUT for output
  ports. Don't override results from the syscall, add to them.
2010-12-13 20:25:36 +01:00
Ludovic Courtès
f0c0141fe4 Add total-processor-count' and current-processor-count'.
* libguile/posix.c (scm_total_processor_count,
  scm_current_processor_count): New functions.

* libguile/posix.h (scm_total_processor_count,
  scm_current_processor_count): New declarations.

* test-suite/tests/posix.test ("nproc"): New test prefix.

* doc/ref/posix.texi (Processes): Document `total-processor-count' and
  `current-processor-count'.
2010-12-07 23:13:20 +01:00
Ludovic Courtès
3ae78cac88 Improve doc of getaffinity' and setaffinity'.
* doc/ref/posix.texi (Processes): Add cross-reference from `setaffinity'
  and `getaffinity' to the corresponding node in the glibc manual.

* libguile/posix.c (scm_getaffinity, scm_setaffinity): Likewise.
2010-12-07 23:13:20 +01:00
Brian Templeton
a8aa4c0b56 variable-unset!
* libguile/variable.c (scm_variable_unset_x): New function.
* libguile/variable.h (scm_variable_unset_x): New prototype.
2010-12-07 13:21:01 +01:00
Brian Templeton
ef94624eaf unbound fluids
* libguile/fluids.c (scm_make_undefined_fluid, scm_fluid_unset_x)
  (scm_fluid_bound_p): New functions.

  (fluid_ref): New function; like scm_fluid_ref, but will not throw an
  error for unbound fluids.
  (scm_fluid_ref, swap_fluid): Use `fluid_ref'.

* libguile/fluids.h (scm_make_undefined_fluid, scm_fluid_unset_x)
  (scm_fluid_bound_p): New prototypes.

* libguile/vm-i-system.c (fluid_ref): If fluid is unbound, jump to
  `vm_error_unbound_fluid'.
* libguile/vm-engine.c (VM_NAME)[vm_error_unbound_fluid]: New error
  message.

* test-suite/tests/fluids.test ("unbound fluids")["fluid-ref of unbound
  fluid", "fluid-bound? of bound fluid", "fluid-bound? of unbound
  fluid", "unbound fluids can be set", "bound fluids can be unset"]: New
  tests.
2010-12-07 13:21:01 +01:00
Andy Wingo
d107921794 better unbound variable errors in the vm
* libguile/vm-i-system.c (variable-ref, toplevel-ref)
  (long-toplevel-ref): Fixup callers.

* libguile/vm-engine.c (vm_error_unbound): Don't use vm-error for
  unbound vars, use misc-error. Don't include VM: in the string. Take
  the name directly in finish_args, not as a list.
2010-12-07 13:21:01 +01:00
Andy Wingo
67a72dc13c scm_setvbuf doesn't throw away current buffers
* libguile/ports.c (scm_drain_input): Slight optimization.

* libguile/fports.c (scm_setvbuf): If there is buffered output, flush
  it.  If there is input, drain it, and then unread it after updating
  the buffers.  Much more sensible than dropping it silently...
2010-12-06 19:59:15 +01:00
Andy Wingo
e9634465e3 ice-9 poll handles buffered io too
* libguile/poll.c (scm_primitive_poll): Account for buffered I/O.

* module/ice-9/poll.scm (poll): Adapt to call primitive-poll with the
  port vector too.
2010-12-06 19:27:22 +01:00
Andy Wingo
3ef6650def make-string et al nulls memory if not given an initializer
* libguile/gc-malloc.c: Add a note that the gc-malloc does not clear the
  memory block, so users need to make sure it is initialized.

* libguile/bitvectors.c (scm_c_make_bitvector):
* libguile/bytevectors.c (scm_make_bytevector):
* libguile/strings.c (scm_c_make_string): If no initializer is given,
  initialize the bytes to 0. Prevents information leakage if an app uses
  make-string et al without initializers.

* libguile/foreign.c (make_cif): Initialize this too, to prevent leakage
  in the struct holes. Paranoia...
2010-12-04 19:31:20 +01:00
Andy Wingo
51c1dba88a ASYNC_TICK after catching EINTR in SCM_SYSCALL
* libguile/_scm.h (SCM_SYSCALL): As in scm_syserror, do a SCM_ASYNC_TICK
  before resuming the syscall after an EINTR.
2010-12-03 15:17:35 +01:00
Andy Wingo
6f81b18abe add (ice-9 poll), a poll wrapper
* libguile/poll.c:
* libguile/poll.h:
* module/ice-9/poll.scm: New module, (ice-9 poll).

* module/Makefile.am:
* libguile/init.c:
* libguile/Makefile.am: Adapt.

* configure.ac: Check for poll.h and poll.
2010-12-03 15:16:37 +01:00
Ludovic Courtès
fe613fe25d Add bindings to GNU sched_setaffinity' and sched_getaffinity'.
* configure.ac: Add checks for `sched_setaffinity' and
  `sched_getaffinity'.

* doc/ref/posix.texi (Processes): Document `getaffinity' and
  `setaffinity'.

* libguile/posix.c (cpu_set_to_bitvector,
  scm_getaffinity)[HAVE_SCHED_GETAFFINITY]: New functions.
  (scm_setaffinity)[HAVE_SCHED_SETAFFINITY]: New function.

* libguile/posix.h (scm_getaffinity, scm_setaffinity): New declarations.

* test-suite/tests/posix.test ("affinity"): New test prefix.
2010-12-03 00:38:29 +01:00