public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* libobjc: remove deprecated API (patch 2)
@ 2011-06-03  0:45 Nicola Pero
  0 siblings, 0 replies; only message in thread
From: Nicola Pero @ 2011-06-03  0:45 UTC (permalink / raw)
  To: gcc-patches

This patch (second in the sequence of libobjc deprecated API removal patches) removes
the deprecated typedstream and archive functions, methods and types from libobjc.

Committed to trunk.

Thanks

PS: Tested on gnu/linux i686 by running both the ObjC/ObjC++ GCC testsuite, and the
GNUstep-base one.

Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog     (revision 174587)
+++ gcc/testsuite/ChangeLog     (working copy)
@@ -1,3 +1,8 @@
+2011-06-03  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       * objc.dg/type-stream-1.m: Test removed.
+       * objc.dg/headers.m: Do not include typedstream.h.
+       
 2011-06-02  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        * objc.dg/torture/forward-1.m (main): Updated testcase.
Index: gcc/testsuite/objc.dg/headers.m
===================================================================
--- gcc/testsuite/objc.dg/headers.m     (revision 174586)
+++ gcc/testsuite/objc.dg/headers.m     (working copy)
@@ -27,5 +27,4 @@
 #ifndef __NEXT_RUNTIME__
 #include <objc/sarray.h>
 #include <objc/thr.h>
-#include <objc/typedstream.h>
 #endif
Index: gcc/testsuite/objc.dg/type-stream-1.m
===================================================================
--- gcc/testsuite/objc.dg/type-stream-1.m       (revision 174586)
+++ gcc/testsuite/objc.dg/type-stream-1.m       (working copy)
@@ -1,17 +0,0 @@
-/* { dg-do compile } */
-/* { dg-skip-if "" { *-*-* } { "-fnext-runtime" } { "" } } */
-
-/* Test warning for deprecated typedstream functions.  These functions
-   will be removed in the release after 4.6.0, at which point this
-   testcase can be removed too.
- */
-
-#include <objc/typedstream.h>
-
-void dummy (void)
-{
-  TypedStream* t = objc_open_typed_stream_for_file ("dummy", 0); /* { dg-warning "deprecated" } */
-
-  objc_write_object (t, nil); /* { dg-warning "deprecated" } */
-  objc_read_object (t, NULL);  /* { dg-warning "deprecated" } */
-}
Index: libobjc/Makefile.in
===================================================================
--- libobjc/Makefile.in (revision 174587)
+++ libobjc/Makefile.in (working copy)
@@ -126,8 +126,7 @@ OBJC_H = \
   \
   hash.h \
   objc-list.h \
-  sarray.h \
-  typedstream.h
+  sarray.h
 
 # User-visible header files containing deprecated APIs, from the
 # objc/deprecated directory
@@ -157,8 +156,7 @@ OBJC_DEPRECATED_H = \
   struct_objc_protocol_list.h \
   struct_objc_selector.h \
   struct_objc_static_instances.h \
-  struct_objc_symtab.h \
-  typedstream.h 
+  struct_objc_symtab.h
 
 # Objective-C source files to compile
 OBJC_SOURCE_FILES = \
@@ -170,7 +168,6 @@ OBJC_SOURCE_FILES = \
 
 # C source files to compile
 C_SOURCE_FILES = \
-   archive.c \
    class.c \
    encoding.c \
    error.c \
@@ -278,28 +275,7 @@ sendmsg_gc.lo: sendmsg.c runtime-info.h
 
 # These files have separate rules because they require special
 # compiler flags.
-archive.lo: archive.c
-       $(LIBTOOL_COMPILE) $(CC) $< -c \
-          $(ALL_CFLAGS) $(INCLUDES) -Wno-deprecated-declarations \
-          -o $@
 
-archive_gc.lo: archive.c
-       $(LIBTOOL_COMPILE) $(CC) $< -c \
-          $(ALL_CFLAGS) $(INCLUDES) $(OBJC_GCFLAGS) -Wno-deprecated-declarations \
-          -o $@
-
-# -Wno-deprecated-declarations is for the objc/typedstream.h functions.
-Object.lo: Object.m
-       $(LIBTOOL_COMPILE) $(CC) $< -c \
-          $(ALL_CFLAGS) $(INCLUDES) -fgnu-runtime -Wno-deprecated-declarations \
-          -o $@
-
-# -Wno-deprecated-declarations is for the objc/typedstream.h functions.
-Object_gc.lo: Object.m
-       $(LIBTOOL_COMPILE) $(CC) $< -c \
-          $(ALL_CFLAGS) $(INCLUDES) $(OBJC_GCFLAGS) -fgnu-runtime -Wno-deprecated-declarations \
-          -o $@
-
 # -Wno-deprecated-declarations is to silence warnings from using 
 # _objc_unexpected_exception.
 exception.lo: exception.c
Index: libobjc/libobjc.def
===================================================================
--- libobjc/libobjc.def (revision 174587)
+++ libobjc/libobjc.def (working copy)
@@ -85,48 +85,6 @@ objc_skip_argspec
 objc_skip_offset
 objc_skip_type_qualifiers
 objc_skip_typespec
-__objc_read_nbyte_uint
-__objc_read_nbyte_ulong
-__objc_write_class
-__objc_write_object
-__objc_write_selector
-objc_close_typed_stream
-objc_end_of_typed_stream
-objc_flush_typed_stream
-objc_get_stream_class_version
-objc_open_typed_stream
-objc_open_typed_stream_for_file
-objc_read_array
-objc_read_char
-objc_read_int
-objc_read_long
-objc_read_object
-objc_read_selector
-objc_read_short
-objc_read_string
-objc_read_type
-objc_read_types
-objc_read_unsigned_char
-objc_read_unsigned_int
-objc_read_unsigned_long
-objc_read_unsigned_short
-objc_write_array
-objc_write_char
-objc_write_int
-objc_write_long
-objc_write_object
-objc_write_object_reference
-objc_write_root_object
-objc_write_selector
-objc_write_short
-objc_write_string
-objc_write_string_atomic
-objc_write_type
-objc_write_types
-objc_write_unsigned_char
-objc_write_unsigned_int
-objc_write_unsigned_long
-objc_write_unsigned_short
 __objc_exec_class
 __objc_init_dispatch_tables
 __objc_install_premature_dtable
Index: libobjc/ChangeLog
===================================================================
--- libobjc/ChangeLog   (revision 174587)
+++ libobjc/ChangeLog   (working copy)
@@ -1,3 +1,37 @@
+2011-06-03  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       * Makefile.in (OBJC_H): Removed typedstream.h.
+       (OBJC_DEPRECATED_H): Removed typedstream.h.
+       (C_SOURCE_FILES): Removed archive.c.
+       (Object.lo): Rule removed.
+       (Object_gc.lo): Likewise.
+       (archive.lo): Likewise.
+       (archive_gc.lo): Likewise.
+       * objc/deprecated/Object.h ([+streamVersion:], [-read], [-write],
+       [-awake]): Removed.
+       Do not include deprecated/typedstream.h.
+       * Object.m: Removed the same methods.
+       * archive.c: File removed.
+       * objc/typedstream.h: File removed.
+       * objc/deprecated/typedstream.h: File removed.
+       * libobjc.def (__objc_read_nbyte_uint, __objc_read_nbyte_ulong,
+       __objc_write_class, __objc_write_object, __objc_write_selector,
+       objc_close_typed_stream, objc_end_of_typed_stream,
+       objc_flush_typed_stream, objc_get_stream_class_version,
+       objc_open_typed_stream, objc_open_typed_stream_for_file,
+       objc_read_array, objc_read_char, objc_read_int, objc_read_long,
+       objc_read_object, objc_read_selector, objc_read_short,
+       objc_read_string, objc_read_type, objc_read_types,
+       objc_read_unsigned_char, objc_read_unsigned_int,
+       objc_read_unsigned_long, objc_read_unsigned_short,
+       objc_write_array, objc_write_char, objc_write_int,
+       objc_write_long, objc_write_object, objc_write_object_reference,
+       objc_write_root_object, objc_write_selector, objc_write_short,
+       objc_write_string, objc_write_string_atomic, objc_write_type,
+       objc_write_types, objc_write_unsigned_char,
+       objc_write_unsigned_int, objc_write_unsigned_long,
+       objc_write_unsigned_short): Removed.
+       
 2011-06-02  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        * Makefile.in (OBJC_DEPRECATED_H): Removed objc_error.h.
Index: libobjc/Object.m
===================================================================
--- libobjc/Object.m    (revision 174587)
+++ libobjc/Object.m    (working copy)
@@ -289,38 +289,4 @@ see the files COPYING3 and COPYING.RUNTIME respect
   return self;
 }
 
-+ (int)streamVersion: (TypedStream*)aStream
-{
-  if (aStream->mode == OBJC_READONLY)
-    return objc_get_stream_class_version (aStream, self);
-  else
-    return class_get_version (self);
-}
-
-// These are used to write or read the instance variables 
-// declared in this particular part of the object.  Subclasses
-// should extend these, by calling [super read/write: aStream]
-// before doing their own archiving.  These methods are private, in
-// the sense that they should only be called from subclasses.
-
-- read: (TypedStream*)aStream
-{
-  (void) aStream; /* UNUSED */
-  // [super read: aStream];  
-  return self;
-}
-
-- write: (TypedStream*)aStream
-{
-  (void) aStream; /* UNUSED */
-  // [super write: aStream];
-  return self;
-}
-
-- awake
-{
-  // [super awake];
-  return self;
-}
-
 @end
Index: libobjc/archive.c
===================================================================
--- libobjc/archive.c   (revision 174586)
+++ libobjc/archive.c   (working copy)
@@ -1,1656 +0,0 @@
- /* GNU Objective C Runtime archiving
-   Copyright (C) 1993, 1995, 1996, 1997, 2002, 2004, 2009,
-   2010 Free Software Foundation, Inc.
-   Contributed by Kresten Krab Thorup
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3, or (at your option) any later version.
-
-GCC is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-details.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-<http://www.gnu.org/licenses/>.  */
-
-/* This file is entirely deprecated and will be removed.  */
-
-#include "objc-private/common.h"
-#include "objc-private/error.h"
-#include "tconfig.h"
-#include "objc/objc-api.h"
-#include "objc/hash.h"
-#include "objc/objc-list.h" 
-#include "objc-private/runtime.h"
-#include "objc/typedstream.h"
-#include "objc/encoding.h"
-#include <stdlib.h>
-
-extern int fflush (FILE *);
-
-#define ROUND(V, A) \
-  ({ typeof (V) __v = (V); typeof (A) __a = (A);  \
-     __a * ((__v + __a - 1)/__a); })
-
-#define PTR2LONG(P) (((char *) (P))-(char *) 0)
-#define LONG2PTR(L) (((char *) 0) + (L))
-
-/* Declare some functions... */
-
-static int
-objc_read_class (struct objc_typed_stream *stream, Class *class);
-
-int objc_sizeof_type (const char *type);
-
-static int
-objc_write_use_common (struct objc_typed_stream *stream, unsigned long key);
-
-static int
-objc_write_register_common (struct objc_typed_stream *stream,
-                           unsigned long key);
-
-static int 
-objc_write_class (struct objc_typed_stream *stream,
-                        struct objc_class *class);
-
-const char *objc_skip_type (const char *type);
-
-static void __objc_finish_write_root_object (struct objc_typed_stream *);
-static void __objc_finish_read_root_object (struct objc_typed_stream *);
-
-static inline int
-__objc_code_unsigned_char (unsigned char *buf, unsigned char val)
-{
-  if ((val&_B_VALUE) == val)
-    {
-      buf[0] = val|_B_SINT;
-      return 1;
-    }
-  else
-    {
-      buf[0] = _B_NINT|0x01;
-      buf[1] = val;
-      return 2;
-    }
-}
-
-int
-objc_write_unsigned_char (struct objc_typed_stream *stream,
-                         unsigned char value)
-{
-  unsigned char buf[sizeof (unsigned char) + 1];
-  int len = __objc_code_unsigned_char (buf, value);
-  return (*stream->write) (stream->physical, (char*)buf, len);
-}
-
-static inline int
-__objc_code_char (unsigned char *buf, signed char val)
-{
-  if (val >= 0)
-    return __objc_code_unsigned_char (buf, val);
-  else
-    {
-      buf[0] = _B_NINT|_B_SIGN|0x01;
-      buf[1] = -val;
-      return 2;
-    }
-}
-
-int
-objc_write_char (struct objc_typed_stream *stream, signed char value)
-{
-  unsigned char buf[sizeof (char) + 1];
-  int len = __objc_code_char (buf, value);
-  return (*stream->write) (stream->physical, (char*)buf, len);
-}
-
-static inline int
-__objc_code_unsigned_short (unsigned char *buf, unsigned short val)
-{
-  if ((val&_B_VALUE) == val)
-    {
-      buf[0] = val|_B_SINT;
-      return 1;
-    }
-  else 
-    {
-      int c, b;
-
-      buf[0] = _B_NINT;
-
-      for (c = sizeof (short); c != 0; c -= 1)
-       if (((val >> (8*(c - 1)))%0x100) != 0)
-         break;
-
-      buf[0] |= c;
-
-      for (b = 1; c != 0; c--, b++)
-       {
-         buf[b] = (val >> (8*(c - 1)))%0x100;
-       }
-
-      return b;
-    }
-}
-
-int
-objc_write_unsigned_short (struct objc_typed_stream *stream, 
-                          unsigned short value)
-{
-  unsigned char buf[sizeof (unsigned short) + 1];
-  int len = __objc_code_unsigned_short (buf, value);
-  return (*stream->write) (stream->physical, (char*)buf, len);
-}
-      
-static inline int
-__objc_code_short (unsigned char *buf, short val)
-{
-  int sign = (val < 0);
-  int size = __objc_code_unsigned_short (buf, sign ? -val : val);
-  if (sign)
-    buf[0] |= _B_SIGN;
-  return size;
-}
-
-int
-objc_write_short (struct objc_typed_stream *stream, short value)
-{
-  unsigned char buf[sizeof (short) + 1];
-  int len = __objc_code_short (buf, value);
-  return (*stream->write) (stream->physical, (char*)buf, len);
-}
-      
-
-static inline int
-__objc_code_unsigned_int (unsigned char *buf, unsigned int val)
-{
-  if ((val&_B_VALUE) == val)
-    {
-      buf[0] = val|_B_SINT;
-      return 1;
-    }
-  else 
-    {
-      int c, b;
-
-      buf[0] = _B_NINT;
-
-      for (c = sizeof (int); c != 0; c -= 1)
-       if (((val >> (8*(c - 1)))%0x100) != 0)
-         break;
-
-      buf[0] |= c;
-
-      for (b = 1; c != 0; c--, b++)
-       {
-         buf[b] = (val >> (8*(c-1)))%0x100;
-       }
-
-      return b;
-    }
-}
-
-int
-objc_write_unsigned_int (struct objc_typed_stream *stream, unsigned int value)
-{
-  unsigned char buf[sizeof (unsigned int) + 1];
-  int len = __objc_code_unsigned_int (buf, value);
-  return (*stream->write) (stream->physical, (char*)buf, len);
-}
-
-static inline int
-__objc_code_int (unsigned char *buf, int val)
-{
-  int sign = (val < 0);
-  int size = __objc_code_unsigned_int (buf, sign ? -val : val);
-  if (sign)
-    buf[0] |= _B_SIGN;
-  return size;
-}
-
-int
-objc_write_int (struct objc_typed_stream *stream, int value)
-{
-  unsigned char buf[sizeof (int) + 1];
-  int len = __objc_code_int (buf, value);
-  return (*stream->write) (stream->physical, (char*)buf, len);
-}
-
-static inline int
-__objc_code_unsigned_long (unsigned char *buf, unsigned long val)
-{
-  if ((val&_B_VALUE) == val)
-    {
-      buf[0] = val|_B_SINT;
-      return 1;
-    }
-  else 
-    {
-      int c, b;
-
-      buf[0] = _B_NINT;
-
-      for (c = sizeof (long); c != 0; c -= 1)
-       if (((val >> (8*(c - 1)))%0x100) != 0)
-         break;
-
-      buf[0] |= c;
-
-      for (b = 1; c != 0; c--, b++)
-       {
-         buf[b] = (val >> (8*(c - 1)))%0x100;
-       }
-
-      return b;
-    }
-}
-
-int
-objc_write_unsigned_long (struct objc_typed_stream *stream, 
-                         unsigned long value)
-{
-  unsigned char buf[sizeof (unsigned long) + 1];
-  int len = __objc_code_unsigned_long (buf, value);
-  return (*stream->write) (stream->physical, (char*)buf, len);
-}
-
-static inline int
-__objc_code_long (unsigned char *buf, long val)
-{
-  int sign = (val < 0);
-  int size = __objc_code_unsigned_long (buf, sign ? -val : val);
-  if (sign)
-    buf[0] |= _B_SIGN;
-  return size;
-}
-
-int
-objc_write_long (struct objc_typed_stream *stream, long value)
-{
-  unsigned char buf[sizeof (long) + 1];
-  int len = __objc_code_long (buf, value);
-  return (*stream->write) (stream->physical, (char*)buf, len);
-}
-
-
-int
-objc_write_string (struct objc_typed_stream *stream,
-                  const unsigned char *string, unsigned int nbytes)
-{
-  unsigned char buf[sizeof (unsigned int) + 1];
-  int len = __objc_code_unsigned_int (buf, nbytes);
-  
-  if ((buf[0]&_B_CODE) == _B_SINT)
-    buf[0] = (buf[0]&_B_VALUE)|_B_SSTR;
-
-  else /* _B_NINT */
-    buf[0] = (buf[0]&_B_VALUE)|_B_NSTR;
-
-  if ((*stream->write) (stream->physical, (char*)buf, len) != 0)
-    return (*stream->write) (stream->physical, (char*)string, nbytes);
-  else
-    return 0;
-}
-
-int
-objc_write_string_atomic (struct objc_typed_stream *stream,
-                         unsigned char *string, unsigned int nbytes)
-{
-  unsigned long key;
-  if ((key = PTR2LONG(objc_hash_value_for_key (stream->stream_table, string))))
-    return objc_write_use_common (stream, key);
-  else
-    {
-      int length;
-      objc_hash_add (&stream->stream_table,
-                    LONG2PTR(key=PTR2LONG(string)), string);
-      if ((length = objc_write_register_common (stream, key)))
-       return objc_write_string (stream, string, nbytes);
-      return length;
-    }
-}
-
-static int
-objc_write_register_common (struct objc_typed_stream *stream, 
-                           unsigned long key)
-{
-  unsigned char buf[sizeof (unsigned long)+2];
-  int len = __objc_code_unsigned_long (buf + 1, key);
-  if (len == 1)
-    {
-      buf[0] = _B_RCOMM|0x01;
-      buf[1] &= _B_VALUE;
-      return (*stream->write) (stream->physical, (char*)buf, len + 1);
-    }
-  else
-    {
-      buf[1] = (buf[1]&_B_VALUE)|_B_RCOMM;
-      return (*stream->write) (stream->physical, (char*)buf + 1, len);
-    }
-}
-
-static int
-objc_write_use_common (struct objc_typed_stream *stream, unsigned long key)
-{
-  unsigned char buf[sizeof (unsigned long)+2];
-  int len = __objc_code_unsigned_long (buf + 1, key);
-  if (len == 1)
-    {
-      buf[0] = _B_UCOMM|0x01;
-      buf[1] &= _B_VALUE;
-      return (*stream->write) (stream->physical, (char*)buf, 2);
-    }
-  else
-    {
-      buf[1] = (buf[1]&_B_VALUE)|_B_UCOMM;
-      return (*stream->write) (stream->physical, (char*)buf + 1, len);
-    }
-}
-
-static inline int
-__objc_write_extension (struct objc_typed_stream *stream, unsigned char code)
-{
-  if (code <= _B_VALUE)
-    {
-      unsigned char buf = code|_B_EXT;
-      return (*stream->write) (stream->physical, (char*)&buf, 1);
-    }
-  else 
-    {
-      _objc_abort ("__objc_write_extension: bad opcode %c\n", code);
-      return -1;
-    }
-}
-
-int
-__objc_write_object (struct objc_typed_stream *stream, id object)
-{
-  unsigned char buf = '\0';
-  SEL write_sel = sel_get_any_uid ("write:");
-  if (object)
-    {
-      __objc_write_extension (stream, _BX_OBJECT);
-      objc_write_class (stream, object->class_pointer);
-      (*objc_msg_lookup (object, write_sel)) (object, write_sel, stream);
-      return (*stream->write) (stream->physical, (char*)&buf, 1);
-    }
-  else
-    return objc_write_use_common (stream, 0);
-}
-
-int 
-objc_write_object_reference (struct objc_typed_stream *stream, id object)
-{
-  unsigned long key;
-  if ((key = PTR2LONG(objc_hash_value_for_key (stream->object_table, object))))
-    return objc_write_use_common (stream, key);
-
-  __objc_write_extension (stream, _BX_OBJREF);
-  return objc_write_unsigned_long (stream, PTR2LONG (object));
-}
-
-int 
-objc_write_root_object (struct objc_typed_stream *stream, id object)
-{
-  int len = 0;
-  if (stream->writing_root_p)
-    _objc_abort ("objc_write_root_object called recursively");
-  else
-    {
-      stream->writing_root_p = 1;
-      __objc_write_extension (stream, _BX_OBJROOT);
-      if ((len = objc_write_object (stream, object)))
-       __objc_finish_write_root_object (stream);
-      stream->writing_root_p = 0;
-    }
-  return len;
-}
-
-int 
-objc_write_object (struct objc_typed_stream *stream, id object)
-{
-  unsigned long key;
-  if ((key = PTR2LONG(objc_hash_value_for_key (stream->object_table, object))))
-    return objc_write_use_common (stream, key);
-
-  else if (object == nil)
-    return objc_write_use_common (stream, 0);
-
-  else
-    {
-      int length;
-      objc_hash_add (&stream->object_table,
-                    LONG2PTR(key=PTR2LONG(object)), object);
-      if ((length = objc_write_register_common (stream, key)))
-       return __objc_write_object (stream, object);
-      return length;
-    }
-}
-
-int
-__objc_write_class (struct objc_typed_stream *stream, struct objc_class *class)
-{
-  __objc_write_extension (stream, _BX_CLASS);
-  objc_write_string_atomic (stream, (unsigned char *) class->name,
-                          strlen ((char *) class->name));
-  return objc_write_unsigned_long (stream, class->version);
-}
-
-
-static int 
-objc_write_class (struct objc_typed_stream *stream,
-                        struct objc_class *class)
-{
-  unsigned long key;
-  if ((key = PTR2LONG(objc_hash_value_for_key (stream->stream_table, class))))
-    return objc_write_use_common (stream, key);
-  else
-    {
-      int length;
-      objc_hash_add (&stream->stream_table,
-                    LONG2PTR(key = PTR2LONG(class)), class);
-      if ((length = objc_write_register_common (stream, key)))
-       return __objc_write_class (stream, class);
-      return length;
-    }
-}
-
-
-int 
-__objc_write_selector (struct objc_typed_stream *stream, SEL selector)
-{
-  const char *sel_name;
-  __objc_write_extension (stream, _BX_SEL);
-  /* to handle NULL selectors */
-  if ((SEL)0 == selector)
-    return objc_write_string (stream, (unsigned char*)"", 0);
-  sel_name = sel_get_name (selector);
-  return objc_write_string (stream, (unsigned char*)sel_name, strlen ((char*)sel_name));
-}
-
-int 
-objc_write_selector (struct objc_typed_stream *stream, SEL selector)
-{
-  const char *sel_name;
-  unsigned long key;
-
-  /* to handle NULL selectors */
-  if ((SEL)0 == selector)
-    return __objc_write_selector (stream, selector);
-
-  sel_name = sel_get_name (selector);
-  if ((key = PTR2LONG(objc_hash_value_for_key (stream->stream_table,
-                                              sel_name))))
-    return objc_write_use_common (stream, key);
-  else
-    {
-      int length;
-      objc_hash_add (&stream->stream_table, 
-               LONG2PTR(key = PTR2LONG(sel_name)), (char *) sel_name);
-      if ((length = objc_write_register_common (stream, key)))
-       return __objc_write_selector (stream, selector);
-      return length;
-    }
-}
-
-
-
-/*
-** Read operations 
-*/
-
-int
-objc_read_char (struct objc_typed_stream *stream, char *val)
-{
-  unsigned char buf;
-  int len;
-  len = (*stream->read) (stream->physical, (char*)&buf, 1);
-  if (len != 0)
-    {
-      if ((buf & _B_CODE) == _B_SINT)
-       (*val) = (buf & _B_VALUE);
-
-      else if ((buf & _B_NUMBER) == 1)
-       {
-         len = (*stream->read) (stream->physical, val, 1);
-         if (buf&_B_SIGN)
-           (*val) = -1 * (*val);
-       }
-
-      else
-       _objc_abort ("expected 8bit signed int, got %dbit int",
-                    (int) (buf&_B_NUMBER)*8);
-    }
-  return len;
-}
-
-
-int
-objc_read_unsigned_char (struct objc_typed_stream *stream, unsigned char *val)
-{
-  unsigned char buf;
-  int len;
-  if ((len = (*stream->read) (stream->physical, (char*)&buf, 1)))
-    {
-      if ((buf & _B_CODE) == _B_SINT)
-       (*val) = (buf & _B_VALUE);
-
-      else if ((buf & _B_NUMBER) == 1)
-       len = (*stream->read) (stream->physical, (char*)val, 1);
-
-      else
-       _objc_abort ("expected 8bit unsigned int, got %dbit int",
-                    (int) (buf&_B_NUMBER)*8);
-    }
-  return len;
-}
-
-int
-objc_read_short (struct objc_typed_stream *stream, short *value)
-{
-  unsigned char buf[sizeof (short) + 1];
-  int len;
-  if ((len = (*stream->read) (stream->physical, (char*)buf, 1)))
-    {
-      if ((buf[0] & _B_CODE) == _B_SINT)
-       (*value) = (buf[0] & _B_VALUE);
-
-      else
-       {
-         int pos = 1;
-         int nbytes = buf[0] & _B_NUMBER;
-         if (nbytes > (int) sizeof (short))
-           _objc_abort ("expected short, got bigger (%dbits)", nbytes*8);
-         len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes);
-         (*value) = 0;
-         while (pos <= nbytes)
-           (*value) = ((*value)*0x100) + buf[pos++];
-         if (buf[0] & _B_SIGN)
-           (*value) = -(*value);
-       }
-    }
-  return len;
-}
-
-int
-objc_read_unsigned_short (struct objc_typed_stream *stream,
-                         unsigned short *value)
-{
-  unsigned char buf[sizeof (unsigned short) + 1];
-  int len;
-  if ((len = (*stream->read) (stream->physical, (char*)buf, 1)))
-    {
-      if ((buf[0] & _B_CODE) == _B_SINT)
-       (*value) = (buf[0] & _B_VALUE);
-
-      else
-       {
-         int pos = 1;
-         int nbytes = buf[0] & _B_NUMBER;
-         if (nbytes > (int) sizeof (short))
-           _objc_abort ("expected short, got int or bigger");
-         len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes);
-         (*value) = 0;
-         while (pos <= nbytes)
-           (*value) = ((*value)*0x100) + buf[pos++];
-       }
-    }
-  return len;
-}
-
-
-int
-objc_read_int (struct objc_typed_stream *stream, int *value)
-{
-  unsigned char buf[sizeof (int) + 1];
-  int len;
-  if ((len = (*stream->read) (stream->physical, (char*)buf, 1)))
-    {
-      if ((buf[0] & _B_CODE) == _B_SINT)
-       (*value) = (buf[0] & _B_VALUE);
-
-      else
-       {
-         int pos = 1;
-         int nbytes = buf[0] & _B_NUMBER;
-         if (nbytes > (int) sizeof (int))
-           _objc_abort ("expected int, got bigger");
-         len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes);
-         (*value) = 0;
-         while (pos <= nbytes)
-           (*value) = ((*value)*0x100) + buf[pos++];
-         if (buf[0] & _B_SIGN)
-           (*value) = -(*value);
-       }
-    }
-  return len;
-}
-
-int
-objc_read_long (struct objc_typed_stream *stream, long *value)
-{
-  unsigned char buf[sizeof (long) + 1];
-  int len;
-  if ((len = (*stream->read) (stream->physical, (char*)buf, 1)))
-    {
-      if ((buf[0] & _B_CODE) == _B_SINT)
-       (*value) = (buf[0] & _B_VALUE);
-
-      else
-       {
-         int pos = 1;
-         int nbytes = buf[0] & _B_NUMBER;
-         if (nbytes > (int) sizeof (long))
-           _objc_abort ("expected long, got bigger");
-         len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes);
-         (*value) = 0;
-         while (pos <= nbytes)
-           (*value) = ((*value)*0x100) + buf[pos++];
-         if (buf[0] & _B_SIGN)
-           (*value) = -(*value);
-       }
-    }
-  return len;
-}
-
-int
-__objc_read_nbyte_uint (struct objc_typed_stream *stream,
-                       unsigned int nbytes, unsigned int *val)
-{
-  int len;
-  unsigned int pos = 0;
-  unsigned char buf[sizeof (unsigned int) + 1];
-
-  if (nbytes > sizeof (int))
-    _objc_abort ("expected int, got bigger");
-
-  len = (*stream->read) (stream->physical, (char*)buf, nbytes);
-  (*val) = 0;
-  while (pos < nbytes)
-    (*val) = ((*val)*0x100) + buf[pos++];
-  return len;
-}
-  
-
-int
-objc_read_unsigned_int (struct objc_typed_stream *stream,
-                       unsigned int *value)
-{
-  unsigned char buf[sizeof (unsigned int) + 1];
-  int len;
-  if ((len = (*stream->read) (stream->physical, (char*)buf, 1)))
-    {
-      if ((buf[0] & _B_CODE) == _B_SINT)
-       (*value) = (buf[0] & _B_VALUE);
-
-      else
-       len = __objc_read_nbyte_uint (stream, (buf[0] & _B_VALUE), value);
-
-    }
-  return len;
-}
-
-int
-__objc_read_nbyte_ulong (struct objc_typed_stream *stream,
-                      unsigned int nbytes, unsigned long *val)
-{
-  int len;
-  unsigned int pos = 0;
-  unsigned char buf[sizeof (unsigned long) + 1];
-
-  if (nbytes > sizeof (long))
-    _objc_abort ("expected long, got bigger");
-
-  len = (*stream->read) (stream->physical, (char*)buf, nbytes);
-  (*val) = 0;
-  while (pos < nbytes)
-    (*val) = ((*val)*0x100) + buf[pos++];
-  return len;
-}
-  
-
-int
-objc_read_unsigned_long (struct objc_typed_stream *stream,
-                        unsigned long *value)
-{
-  unsigned char buf[sizeof (unsigned long) + 1];
-  int len;
-  if ((len = (*stream->read) (stream->physical, (char*)buf, 1)))
-    {
-      if ((buf[0] & _B_CODE) == _B_SINT)
-       (*value) = (buf[0] & _B_VALUE);
-
-      else
-       len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), value);
-
-    }
-  return len;
-}
-
-int
-objc_read_string (struct objc_typed_stream *stream,
-                 char **string)
-{
-  unsigned char buf[sizeof (unsigned int) + 1];
-  int len;
-  if ((len = (*stream->read) (stream->physical, (char*)buf, 1)))
-    {
-      unsigned long key = 0;
-
-      if ((buf[0]&_B_CODE) == _B_RCOMM)        /* register following */
-       {
-         len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
-         len = (*stream->read) (stream->physical, (char*)buf, 1);
-       }
-
-      switch (buf[0]&_B_CODE) {
-      case _B_SSTR:
-       {
-         int length = buf[0]&_B_VALUE;
-         (*string) = (char*)objc_malloc (length + 1);
-         if (key)
-           objc_hash_add (&stream->stream_table, LONG2PTR(key), *string);
-         len = (*stream->read) (stream->physical, *string, length);
-         (*string)[length] = '\0';
-       }
-       break;
-
-      case _B_UCOMM:
-       {
-         char *tmp;
-         len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
-         tmp = objc_hash_value_for_key (stream->stream_table, LONG2PTR (key));
-         *string = objc_malloc (strlen (tmp) + 1);
-         strcpy (*string, tmp);
-       }
-       break;
-
-      case _B_NSTR:
-       {
-         unsigned int nbytes = buf[0]&_B_VALUE;
-         len = __objc_read_nbyte_uint (stream, nbytes, &nbytes);
-         if (len) {
-           (*string) = (char*)objc_malloc (nbytes + 1);
-           if (key)
-             objc_hash_add (&stream->stream_table, LONG2PTR(key), *string);
-           len = (*stream->read) (stream->physical, *string, nbytes);
-           (*string)[nbytes] = '\0';
-         }
-       }
-       break;
-       
-      default:
-       _objc_abort ("expected string, got opcode %c\n", (buf[0]&_B_CODE));
-      }
-    }
-
-  return len;
-}
-
-
-int
-objc_read_object (struct objc_typed_stream *stream, id *object)
-{
-  unsigned char buf[sizeof (unsigned int)];
-  int len;
-  if ((len = (*stream->read) (stream->physical, (char*)buf, 1)))
-    {
-      SEL read_sel = sel_get_any_uid ("read:");
-      unsigned long key = 0;
-
-      if ((buf[0]&_B_CODE) == _B_RCOMM)        /* register common */
-       {
-         len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
-         len = (*stream->read) (stream->physical, (char*)buf, 1);
-       }
-
-      if (buf[0] == (_B_EXT | _BX_OBJECT))
-       {
-         Class class;
-
-         /* get class */
-         len = objc_read_class (stream, &class);
-
-         /* create instance */
-         (*object) = class_create_instance (class);
-
-         /* register? */
-         if (key)
-           objc_hash_add (&stream->object_table, LONG2PTR(key), *object);
-
-         /* send -read: */
-         if (__objc_responds_to (*object, read_sel))
-           (*get_imp (class, read_sel)) (*object, read_sel, stream);
-
-         /* check null-byte */
-         len = (*stream->read) (stream->physical, (char*)buf, 1);
-         if (buf[0] != '\0')
-           _objc_abort ("expected null-byte, got opcode %c", buf[0]);
-       }
-
-      else if ((buf[0]&_B_CODE) == _B_UCOMM)
-       {
-         if (key)
-           _objc_abort ("cannot register use upcode...");
-         len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
-         (*object) = objc_hash_value_for_key (stream->object_table,
-                                              LONG2PTR(key));
-       }
-
-      else if (buf[0] == (_B_EXT | _BX_OBJREF))        /* a forward reference */
-       {
-         struct objc_list *other;
-         len = objc_read_unsigned_long (stream, &key);
-         other 
-           = (struct objc_list *) objc_hash_value_for_key (stream->object_refs, 
-                                                          LONG2PTR(key));
-         objc_hash_add (&stream->object_refs, LONG2PTR(key), 
-                        (void *)list_cons (object, other));
-       }
-
-      else if (buf[0] == (_B_EXT | _BX_OBJROOT)) /* a root object */
-       {
-         if (key)
-           _objc_abort ("cannot register root object...");
-         len = objc_read_object (stream, object);
-         __objc_finish_read_root_object (stream);
-       }
-
-      else
-       _objc_abort ("expected object, got opcode %c", buf[0]);
-    }
-  return len;
-}
-
-static int
-objc_read_class (struct objc_typed_stream *stream, Class *class)
-{
-  unsigned char buf[sizeof (unsigned int)];
-  int len;
-  if ((len = (*stream->read) (stream->physical, (char*)buf, 1)))
-    {
-      unsigned long key = 0;
-
-      if ((buf[0]&_B_CODE) == _B_RCOMM)        /* register following */
-       {
-         len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
-         len = (*stream->read) (stream->physical, (char*)buf, 1);
-       }
-
-      if (buf[0] == (_B_EXT | _BX_CLASS))
-       {
-         char temp[1] = "";
-         char *class_name = temp;
-         unsigned long version;
-
-         /* get class */
-         len = objc_read_string (stream, &class_name);
-         (*class) = objc_get_class (class_name);
-         objc_free (class_name);
-
-         /* register */
-         if (key)
-           objc_hash_add (&stream->stream_table, LONG2PTR(key), *class);
-
-         objc_read_unsigned_long (stream, &version);
-         objc_hash_add (&stream->class_table,
-                        (*class)->name, (void *) ((size_t) version));
-       }
-
-      else if ((buf[0]&_B_CODE) == _B_UCOMM)
-       {
-         if (key)
-           _objc_abort ("cannot register use upcode...");
-         len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
-         *class = objc_hash_value_for_key (stream->stream_table,
-                                           LONG2PTR(key));
-         if (! *class)
-           _objc_abort ("cannot find class for key %lu", key);
-       }
-
-      else
-       _objc_abort ("expected class, got opcode %c", buf[0]);
-    }
-  return len;
-}
-
-int
-objc_read_selector (struct objc_typed_stream *stream, SEL* selector)
-{
-  unsigned char buf[sizeof (unsigned int)];
-  int len;
-  if ((len = (*stream->read) (stream->physical, (char*)buf, 1)))
-    {
-      unsigned long key = 0;
-
-      if ((buf[0]&_B_CODE) == _B_RCOMM)        /* register following */
-       {
-         len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
-         len = (*stream->read) (stream->physical, (char*)buf, 1);
-       }
-
-      if (buf[0] == (_B_EXT|_BX_SEL)) /* selector! */
-       {
-         char temp[1] = "";
-         char *selector_name = temp;
-
-         /* get selector */
-         len = objc_read_string (stream, &selector_name);
-         /* To handle NULL selectors */
-         if (0 == strlen (selector_name))
-           {
-             (*selector) = (SEL)0;
-             return 0;
-           }
-         else 
-           (*selector) = sel_get_any_uid (selector_name);
-         objc_free (selector_name);
-
-         /* register */
-         if (key)
-           objc_hash_add (&stream->stream_table,
-                          LONG2PTR(key), (void *) *selector);
-       }
-
-      else if ((buf[0]&_B_CODE) == _B_UCOMM)
-       {
-         if (key)
-           _objc_abort ("cannot register use upcode...");
-         len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
-         (*selector) = objc_hash_value_for_key (stream->stream_table, 
-                                                LONG2PTR(key));
-       }
-
-      else
-       _objc_abort ("expected selector, got opcode %c", buf[0]);
-    }
-  return len;
-}
-
-/*
-** USER LEVEL FUNCTIONS
-*/
-
-/*
-** Write one object, encoded in TYPE and pointed to by DATA to the
-** typed stream STREAM.  
-*/
-
-int
-objc_write_type (TypedStream *stream, const char *type, const void *data)
-{
-  switch (*type) {
-  case _C_ID:
-    return objc_write_object (stream, *(id *) data);
-    break;
-
-  case _C_CLASS:
-    return objc_write_class (stream, *(Class *) data);
-    break;
-
-  case _C_SEL:
-    return objc_write_selector (stream, *(SEL *) data);
-    break;
-
-  case _C_CHR:
-    return objc_write_char (stream, *(signed char *) data);
-    break;
-    
-  case _C_UCHR:
-    return objc_write_unsigned_char (stream, *(unsigned char *) data);
-    break;
-
-  case _C_SHT:
-    return objc_write_short (stream, *(short *) data);
-    break;
-
-  case _C_USHT:
-    return objc_write_unsigned_short (stream, *(unsigned short *) data);
-    break;
-
-  case _C_INT:
-    return objc_write_int (stream, *(int *) data);
-    break;
-
-  case _C_UINT:
-    return objc_write_unsigned_int (stream, *(unsigned int *) data);
-    break;
-
-  case _C_LNG:
-    return objc_write_long (stream, *(long *) data);
-    break;
-
-  case _C_ULNG:
-    return objc_write_unsigned_long (stream, *(unsigned long *) data);
-    break;
-
-  case _C_CHARPTR:
-    return objc_write_string (stream,
-                             *(unsigned char **) data, strlen (*(char **) data));
-    break;
-
-  case _C_ATOM:
-    return objc_write_string_atomic (stream, *(unsigned char **) data, 
-                                    strlen (*(char **) data));
-    break;
-
-  case _C_ARY_B:
-    {
-      int len = atoi (type + 1);
-      while (isdigit ((unsigned char) *++type))
-       ;
-      return objc_write_array (stream, type, len, data);
-    }
-    break; 
-
-  case _C_STRUCT_B:
-    {
-      int acc_size = 0;
-      int align;
-      while (*type != _C_STRUCT_E && *type++ != '=')
-       ; /* skip "<name>=" */
-      while (*type != _C_STRUCT_E)
-       {
-         align = objc_alignof_type (type);       /* padd to alignment */
-         acc_size = ROUND (acc_size, align);
-         objc_write_type (stream, type, ((char *) data) + acc_size);
-         acc_size += objc_sizeof_type (type);   /* add component size */
-         type = objc_skip_typespec (type);      /* skip component */
-       }
-      return 1;
-    }
-
-  default:
-    {
-      _objc_abort ("objc_write_type: cannot parse typespec: %s\n", type);
-      return 0;
-    }
-  }
-}
-
-/*
-** Read one object, encoded in TYPE and pointed to by DATA to the
-** typed stream STREAM.  DATA specifies the address of the types to
-** read.  Expected type is checked against the type actually present
-** on the stream. 
-*/
-
-int
-objc_read_type(TypedStream *stream, const char *type, void *data)
-{
-  char c;
-  switch (c = *type) {
-  case _C_ID:
-    return objc_read_object (stream, (id*)data);
-    break;
-
-  case _C_CLASS:
-    return objc_read_class (stream, (Class*)data);
-    break;
-
-  case _C_SEL:
-    return objc_read_selector (stream, (SEL*)data);
-    break;
-
-  case _C_CHR:
-    return objc_read_char (stream, (char*)data);
-    break;
-    
-  case _C_UCHR:
-    return objc_read_unsigned_char (stream, (unsigned char*)data);
-    break;
-
-  case _C_SHT:
-    return objc_read_short (stream, (short*)data);
-    break;
-
-  case _C_USHT:
-    return objc_read_unsigned_short (stream, (unsigned short*)data);
-    break;
-
-  case _C_INT:
-    return objc_read_int (stream, (int*)data);
-    break;
-
-  case _C_UINT:
-    return objc_read_unsigned_int (stream, (unsigned int*)data);
-    break;
-
-  case _C_LNG:
-    return objc_read_long (stream, (long*)data);
-    break;
-
-  case _C_ULNG:
-    return objc_read_unsigned_long (stream, (unsigned long*)data);
-    break;
-
-  case _C_CHARPTR:
-  case _C_ATOM:
-    return objc_read_string (stream, (char**)data);
-    break;
-
-  case _C_ARY_B:
-    {
-      int len = atoi (type + 1);
-      while (isdigit ((unsigned char) *++type))
-       ;
-      return objc_read_array (stream, type, len, data);
-    }
-    break; 
-
-  case _C_STRUCT_B:
-    {
-      int acc_size = 0;
-      int align;
-      while (*type != _C_STRUCT_E && *type++ != '=')
-       ; /* skip "<name>=" */
-      while (*type != _C_STRUCT_E)
-       {
-         align = objc_alignof_type (type);       /* padd to alignment */
-         acc_size = ROUND (acc_size, align);
-         objc_read_type (stream, type, ((char*)data)+acc_size);
-         acc_size += objc_sizeof_type (type);   /* add component size */
-         type = objc_skip_typespec (type);      /* skip component */
-       }
-      return 1;
-    }
-
-  default:
-    {
-      _objc_abort ("objc_read_type: cannot parse typespec: %s\n", type);
-      return 0;
-    }
-  }
-}
-
-/*
-** Write the object specified by the template TYPE to STREAM.  Last
-** arguments specify addresses of values to be written.  It might 
-** seem surprising to specify values by address, but this is extremely
-** convenient for copy-paste with objc_read_types calls.  A more
-** down-to-the-earth cause for this passing of addresses is that values
-** of arbitrary size is not well supported in ANSI C for functions with
-** variable number of arguments.
-*/
-
-int 
-objc_write_types (TypedStream *stream, const char *type, ...)
-{
-  va_list args;
-  const char *c;
-  int res = 0;
-
-  va_start(args, type);
-
-  for (c = type; *c; c = objc_skip_typespec (c))
-    {
-      switch (*c) {
-      case _C_ID:
-       res = objc_write_object (stream, *va_arg (args, id*));
-       break;
-
-      case _C_CLASS:
-       res = objc_write_class (stream, *va_arg (args, Class*));
-       break;
-
-      case _C_SEL:
-       res = objc_write_selector (stream, *va_arg (args, SEL*));
-       break;
-       
-      case _C_CHR:
-       res = objc_write_char (stream, *va_arg (args, char*));
-       break;
-       
-      case _C_UCHR:
-       res = objc_write_unsigned_char (stream,
-                                       *va_arg (args, unsigned char*));
-       break;
-       
-      case _C_SHT:
-       res = objc_write_short (stream, *va_arg (args, short*));
-       break;
-
-      case _C_USHT:
-       res = objc_write_unsigned_short (stream,
-                                        *va_arg (args, unsigned short*));
-       break;
-
-      case _C_INT:
-       res = objc_write_int(stream, *va_arg (args, int*));
-       break;
-       
-      case _C_UINT:
-       res = objc_write_unsigned_int(stream, *va_arg (args, unsigned int*));
-       break;
-
-      case _C_LNG:
-       res = objc_write_long(stream, *va_arg (args, long*));
-       break;
-       
-      case _C_ULNG:
-       res = objc_write_unsigned_long(stream, *va_arg (args, unsigned long*));
-       break;
-
-      case _C_CHARPTR:
-       {
-         unsigned char **str = va_arg (args, unsigned char **);
-         res = objc_write_string (stream, *str, strlen ((char*)*str));
-       }
-       break;
-
-      case _C_ATOM:
-       {
-         unsigned char **str = va_arg (args, unsigned char **);
-         res = objc_write_string_atomic (stream, *str, strlen ((char*)*str));
-       }
-       break;
-
-      case _C_ARY_B:
-       {
-         int len = atoi (c + 1);
-         const char *t = c;
-         while (isdigit ((unsigned char) *++t))
-           ;
-         res = objc_write_array (stream, t, len, va_arg (args, void *));
-         t = objc_skip_typespec (t);
-         if (*t != _C_ARY_E)
-           _objc_abort ("expected `]', got: %s", t);
-       }
-       break; 
-       
-      default:
-       _objc_abort ("objc_write_types: cannot parse typespec: %s\n", type);
-      }
-    }
-  va_end(args);
-  return res;
-}
-
-
-/* 
-** Last arguments specify addresses of values to be read.  Expected
-** type is checked against the type actually present on the stream. 
-*/
-
-int 
-objc_read_types(TypedStream *stream, const char *type, ...)
-{
-  va_list args;
-  const char *c;
-  int res = 0;
-
-  va_start (args, type);
-
-  for (c = type; *c; c = objc_skip_typespec(c))
-    {
-      switch (*c) {
-      case _C_ID:
-       res = objc_read_object(stream, va_arg (args, id*));
-       break;
-
-      case _C_CLASS:
-       res = objc_read_class(stream, va_arg (args, Class*));
-       break;
-
-      case _C_SEL:
-       res = objc_read_selector(stream, va_arg (args, SEL*));
-       break;
-       
-      case _C_CHR:
-       res = objc_read_char(stream, va_arg (args, char*));
-       break;
-       
-      case _C_UCHR:
-       res = objc_read_unsigned_char(stream, va_arg (args, unsigned char*));
-       break;
-       
-      case _C_SHT:
-       res = objc_read_short(stream, va_arg (args, short*));
-       break;
-
-      case _C_USHT:
-       res = objc_read_unsigned_short(stream, va_arg (args, unsigned short*));
-       break;
-
-      case _C_INT:
-       res = objc_read_int(stream, va_arg (args, int*));
-       break;
-       
-      case _C_UINT:
-       res = objc_read_unsigned_int(stream, va_arg (args, unsigned int*));
-       break;
-
-      case _C_LNG:
-       res = objc_read_long(stream, va_arg (args, long*));
-       break;
-       
-      case _C_ULNG:
-       res = objc_read_unsigned_long(stream, va_arg (args, unsigned long*));
-       break;
-
-      case _C_CHARPTR:
-      case _C_ATOM:
-       {
-         char **str = va_arg (args, char **);
-         res = objc_read_string (stream, str);
-       }
-       break;
-
-      case _C_ARY_B:
-       {
-         int len = atoi (c + 1);
-         const char *t = c;
-         while (isdigit ((unsigned char) *++t))
-           ;
-         res = objc_read_array (stream, t, len, va_arg (args, void *));
-         t = objc_skip_typespec (t);
-         if (*t != _C_ARY_E)
-           _objc_abort ("expected `]', got: %s", t);
-       }
-       break; 
-       
-      default:
-       _objc_abort ("objc_read_types: cannot parse typespec: %s\n", type);
-      }
-    }
-  va_end (args);
-  return res;
-}
-
-/*
-** Write an array of COUNT elements of TYPE from the memory address DATA.
-** This is equivalent of objc_write_type (stream, "[N<type>]", data)
-*/
-
-int
-objc_write_array (TypedStream *stream, const char *type,
-                 int count, const void *data)
-{
-  int off = objc_sizeof_type(type);
-  const char *where = data;
-
-  while (count-- > 0)
-    {
-      objc_write_type(stream, type, where);
-      where += off;
-    }
-  return 1;
-}
-
-/*
-** Read an array of COUNT elements of TYPE into the memory address
-** DATA.  The memory pointed to by data is supposed to be allocated
-** by the callee.  This is equivalent of 
-**   objc_read_type (stream, "[N<type>]", data)
-*/
-
-int
-objc_read_array (TypedStream *stream, const char *type,
-                int count, void *data)
-{
-  int off = objc_sizeof_type(type);
-  char *where = (char*)data;
-
-  while (count-- > 0)
-    {
-      objc_read_type(stream, type, where);
-      where += off;
-    }
-  return 1;
-}
-
-static int 
-__objc_fread (FILE *file, char *data, int len)
-{
-  return fread(data, len, 1, file);
-}
-
-static int 
-__objc_fwrite (FILE *file, char *data, int len)
-{
-  return fwrite(data, len, 1, file);
-}
-
-static int
-__objc_feof (FILE *file)
-{
-  return feof(file);
-}
-
-static int 
-__objc_no_write (FILE *file __attribute__ ((__unused__)),
-                const char *data __attribute__ ((__unused__)),
-                int len __attribute__ ((__unused__)))
-{
-  _objc_abort ("TypedStream not open for writing");
-  return 0;
-}
-
-static int 
-__objc_no_read (FILE *file __attribute__ ((__unused__)),
-               const char *data __attribute__ ((__unused__)),
-               int len __attribute__ ((__unused__)))
-{
-  _objc_abort ("TypedStream not open for reading");
-  return 0;
-}
-
-static int
-__objc_read_typed_stream_signature (TypedStream *stream)
-{
-  char buffer[80];
-  int pos = 0;
-  do
-    (*stream->read) (stream->physical, buffer+pos, 1);
-  while (buffer[pos++] != '\0')
-    ;
-  sscanf (buffer, "GNU TypedStream %d", &stream->version);
-  if (stream->version != OBJC_TYPED_STREAM_VERSION)
-    _objc_abort ("cannot handle TypedStream version %d", stream->version);
-  return 1;
-}
-
-static int
-__objc_write_typed_stream_signature (TypedStream *stream)
-{
-  char buffer[80];
-  sprintf(buffer, "GNU TypedStream %d", OBJC_TYPED_STREAM_VERSION);
-  stream->version = OBJC_TYPED_STREAM_VERSION;
-  (*stream->write) (stream->physical, buffer, strlen (buffer) + 1);
-  return 1;
-}
-
-static void __objc_finish_write_root_object(struct objc_typed_stream *stream)
-{
-  objc_hash_delete (stream->object_table);
-  stream->object_table = objc_hash_new (64,
-                                       (hash_func_type) objc_hash_ptr,
-                                       (compare_func_type) objc_compare_ptrs);
-}
-
-static void __objc_finish_read_root_object(struct objc_typed_stream *stream)
-{
-  node_ptr node;
-  SEL awake_sel = sel_get_any_uid ("awake");
-  cache_ptr free_list = objc_hash_new (64,
-                                      (hash_func_type) objc_hash_ptr,
-                                      (compare_func_type) objc_compare_ptrs);
-
-  /* resolve object forward references */
-  for (node = objc_hash_next (stream->object_refs, NULL); node;
-       node = objc_hash_next (stream->object_refs, node))
-    {
-      struct objc_list *reflist = node->value;
-      const void *key = node->key;
-      id object = objc_hash_value_for_key (stream->object_table, key);
-      while (reflist)
-       {
-         *((id*) reflist->head) = object;
-         if (objc_hash_value_for_key (free_list,reflist) == NULL)
-           objc_hash_add (&free_list,reflist,reflist);
-
-         reflist = reflist->tail;
-       }
-    }
-    
-  /* apply __objc_free to all objects stored in free_list */
-  for (node = objc_hash_next (free_list, NULL); node;
-       node = objc_hash_next (free_list, node))
-    objc_free ((void *) node->key);
-
-  objc_hash_delete (free_list);
-
-  /* empty object reference table */
-  objc_hash_delete (stream->object_refs);
-  stream->object_refs = objc_hash_new (8, (hash_func_type) objc_hash_ptr,
-                                      (compare_func_type) objc_compare_ptrs);
-  
-  /* call -awake for all objects read  */
-  if (awake_sel)
-    {
-      for (node = objc_hash_next (stream->object_table, NULL); node;
-          node = objc_hash_next (stream->object_table, node))
-       {
-         id object = node->value;
-         if (__objc_responds_to (object, awake_sel))
-           (*objc_msg_lookup (object, awake_sel)) (object, awake_sel);
-       }
-    }
-
-  /* empty object table */
-  objc_hash_delete (stream->object_table);
-  stream->object_table = objc_hash_new(64,
-                                      (hash_func_type)objc_hash_ptr,
-                                      (compare_func_type)objc_compare_ptrs);
-}
-
-/*
-** Open the stream PHYSICAL in MODE
-*/
-
-TypedStream *
-objc_open_typed_stream (FILE *physical, int mode)
-{
-  TypedStream *s = (TypedStream *) objc_malloc (sizeof (TypedStream));
-
-  s->mode = mode;
-  s->physical = physical;
-  s->stream_table = objc_hash_new (64,
-                                  (hash_func_type) objc_hash_ptr,
-                                  (compare_func_type) objc_compare_ptrs);
-  s->object_table = objc_hash_new (64,
-                                  (hash_func_type) objc_hash_ptr,
-                                  (compare_func_type) objc_compare_ptrs);
-  s->eof = (objc_typed_eof_func) __objc_feof;
-  s->flush = (objc_typed_flush_func) fflush;
-  s->writing_root_p = 0;
-  if (mode == OBJC_READONLY)
-    {
-      s->class_table 
-       = objc_hash_new (8, (hash_func_type) objc_hash_string,
-                        (compare_func_type) objc_compare_strings);
-      s->object_refs = objc_hash_new (8, (hash_func_type) objc_hash_ptr,
-                                     (compare_func_type) objc_compare_ptrs);
-      s->read = (objc_typed_read_func) __objc_fread;
-      s->write = (objc_typed_write_func) __objc_no_write;
-      __objc_read_typed_stream_signature (s);
-    }
-  else if (mode == OBJC_WRITEONLY)
-    {
-      s->class_table = 0;
-      s->object_refs = 0;
-      s->read = (objc_typed_read_func) __objc_no_read;
-      s->write = (objc_typed_write_func) __objc_fwrite;
-      __objc_write_typed_stream_signature (s);
-    }      
-  else
-    {
-      objc_close_typed_stream (s);
-      return NULL;
-    }
-  s->type = OBJC_FILE_STREAM;
-  return s;
-}
-
-/*
-** Open the file named by FILE_NAME in MODE
-*/
-
-TypedStream*
-objc_open_typed_stream_for_file (const char *file_name, int mode)
-{
-  FILE *file = NULL;
-  TypedStream *s;
-
-  if (mode == OBJC_READONLY)
-    file = fopen (file_name, "r");
-  else
-    file = fopen (file_name, "w");
-
-  if (file)
-    {
-      s = objc_open_typed_stream (file, mode);
-      if (s)
-       s->type |= OBJC_MANAGED_STREAM;
-      return s;
-    }
-  else
-    return NULL;
-}
-
-/*
-** Close STREAM freeing the structure it self.  If it was opened with 
-** objc_open_typed_stream_for_file, the file will also be closed.
-*/
-
-void
-objc_close_typed_stream (TypedStream *stream)
-{
-  if (stream->mode == OBJC_READONLY)
-    {
-      __objc_finish_read_root_object (stream); /* Just in case... */
-      objc_hash_delete (stream->class_table);
-      objc_hash_delete (stream->object_refs);
-    }
-
-  objc_hash_delete (stream->stream_table);
-  objc_hash_delete (stream->object_table);
-
-  if (stream->type == (OBJC_MANAGED_STREAM | OBJC_FILE_STREAM))
-    fclose ((FILE *)stream->physical);
-
-  objc_free(stream);
-}
-
-BOOL
-objc_end_of_typed_stream (TypedStream *stream)
-{
-  return (*stream->eof) (stream->physical);
-}
-
-void
-objc_flush_typed_stream (TypedStream *stream)
-{
-  (*stream->flush) (stream->physical);
-}
-
-long
-objc_get_stream_class_version (TypedStream *stream, Class class)
-{
-  if (stream->class_table)
-    return PTR2LONG(objc_hash_value_for_key (stream->class_table,
-                                            class->name));
-  else
-    return class_get_version (class);
-}
-
Index: libobjc/objc/typedstream.h
===================================================================
--- libobjc/objc/typedstream.h  (revision 174586)
+++ libobjc/objc/typedstream.h  (working copy)
@@ -1,4 +0,0 @@
-#include "objc.h"
-#include "deprecated/hash.h"
-#include "deprecated/typedstream.h"
-
Index: libobjc/objc/Object.h
===================================================================
--- libobjc/objc/Object.h       (revision 174586)
+++ libobjc/objc/Object.h       (working copy)
@@ -58,7 +58,6 @@ extern "C" {
 /* All of the following includes were deprecated in GCC 4.6 and will
    be removed in the next release.  */
 #include "deprecated/hash.h"
-#include "deprecated/typedstream.h"
 #include "deprecated/Object.h"
 
 #ifdef __cplusplus
Index: libobjc/objc/deprecated/typedstream.h
===================================================================
--- libobjc/objc/deprecated/typedstream.h       (revision 174586)
+++ libobjc/objc/deprecated/typedstream.h       (working copy)
@@ -1,141 +0,0 @@
-/* GNU Objective-C Typed Streams interface.
-   Copyright (C) 1993, 1995, 2004, 2009 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3, or (at your option) any
-later version.
-
-GCC is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
-License for more details.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-<http://www.gnu.org/licenses/>.  */
-
-
-#ifndef __typedstream_INCLUDE_GNU
-#define __typedstream_INCLUDE_GNU
-
-/* The API in this file was entirely deprecated in GCC 4.6.0 and will
-   be removed in the following GCC release.
-*/
-
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-typedef int (*objc_typed_read_func)(void*, char*, int);
-typedef int (*objc_typed_write_func)(void*, const char*, int);
-typedef int (*objc_typed_flush_func)(void*);
-typedef int (*objc_typed_eof_func)(void*);
-
-#define OBJC_READONLY   0x01
-#define OBJC_WRITEONLY  0x02
-
-#define OBJC_MANAGED_STREAM  0x01
-#define OBJC_FILE_STREAM     0x02
-#define OBJC_MEMORY_STREAM   0x04
-
-#define OBJC_TYPED_STREAM_VERSION 0x01
-
-typedef struct objc_typed_stream {
-  void* physical;
-  cache_ptr object_table;      /* read/written objects */
-  cache_ptr stream_table;      /* other read/written but shared things.. */
-  cache_ptr class_table;       /* class version mapping */
-  cache_ptr object_refs;       /* forward references */
-  int mode;                    /* OBJC_READONLY or OBJC_WRITEONLY */
-  int type;                    /* MANAGED, FILE, MEMORY etc bit string */
-  int version;                 /* version used when writing */
-  int writing_root_p;
-  objc_typed_read_func read;
-  objc_typed_write_func write;
-  objc_typed_eof_func eof;
-  objc_typed_flush_func flush;
-} TypedStream;
-
-/* opcode masks */
-#define _B_VALUE   0x1fU
-#define _B_CODE    0xe0U
-#define _B_SIGN    0x10U
-#define _B_NUMBER  0x0fU
-
-/* standard opcodes */
-#define _B_INVALID 0x00U
-#define _B_SINT    0x20U
-#define _B_NINT    0x40U
-#define _B_SSTR    0x60U
-#define _B_NSTR    0x80U
-#define _B_RCOMM   0xa0U
-#define _B_UCOMM   0xc0U
-#define _B_EXT     0xe0U
-
-/* eXtension opcodes */
-#define _BX_OBJECT  0x00U
-#define _BX_CLASS   0x01U
-#define _BX_SEL     0x02U
-#define _BX_OBJREF  0x03U
-#define _BX_OBJROOT 0x04U
-#define _BX_EXT     0x1fU
-
-/*
-** Read and write objects as specified by TYPE.  All the `last'
-** arguments are pointers to the objects to read/write.  
-*/
-
-int objc_write_type (TypedStream* stream, const char* type, const void* data) __attribute__ ((deprecated));
-int objc_read_type (TypedStream* stream, const char* type, void* data) __attribute__ ((deprecated));
-
-int objc_write_types (TypedStream* stream, const char* type, ...) __attribute__ ((deprecated));
-int objc_read_types (TypedStream* stream, const char* type, ...) __attribute__ ((deprecated));
-
-int objc_write_object_reference (TypedStream* stream, id object) __attribute__ ((deprecated));
-int objc_write_root_object (TypedStream* stream, id object) __attribute__ ((deprecated));
-
-long objc_get_stream_class_version (TypedStream* stream, Class class_type) __attribute__ ((deprecated));
-
-
-/*
-** Convenience functions
-*/
-
-int objc_write_array (TypedStream* stream, const char* type,
-                     int count, const void* data) __attribute__ ((deprecated));
-int objc_read_array (TypedStream* stream, const char* type,
-                    int count, void* data) __attribute__ ((deprecated));
-
-int objc_write_object (TypedStream* stream, id object) __attribute__ ((deprecated));
-int objc_read_object (TypedStream* stream, id* object) __attribute__ ((deprecated));
-
-
-
-/*
-** Open a typed stream for reading or writing.  MODE may be either of
-** OBJC_READONLY or OBJC_WRITEONLY.  
-*/
-
-TypedStream* objc_open_typed_stream (FILE* physical, int mode) __attribute__ ((deprecated));
-TypedStream* objc_open_typed_stream_for_file (const char* file_name, int mode) __attribute__ ((deprecated));
-
-void objc_close_typed_stream (TypedStream* stream) __attribute__ ((deprecated));
-
-BOOL objc_end_of_typed_stream (TypedStream* stream) __attribute__ ((deprecated));
-void objc_flush_typed_stream (TypedStream* stream) __attribute__ ((deprecated));
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* not __typedstream_INCLUDE_GNU */
Index: libobjc/objc/deprecated/Object.h
===================================================================
--- libobjc/objc/deprecated/Object.h    (revision 174587)
+++ libobjc/objc/deprecated/Object.h    (working copy)
@@ -60,11 +60,5 @@
 + (int)version;
 + setVersion:(int)aVersion;
 
-+ (int)streamVersion: (TypedStream*)aStream; /* __attribute__ ((deprecated)) */
-
-- read: (TypedStream*)aStream; /* __attribute__ ((deprecated)) */
-- write: (TypedStream*)aStream; /* __attribute__ ((deprecated)) */
-- awake; /* __attribute__ ((deprecated)) */
-
 @end


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2011-06-03  0:45 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-06-03  0:45 libobjc: remove deprecated API (patch 2) Nicola Pero

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).