|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.0 (the 'License'). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License."
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24: /*
25: typedstreamprivate.h
26: Copyright 1989 NeXT, Inc.
27: Responsibility: Bertrand Serlet
28: */
29:
30: #ifndef _OBJC_TYPEDSTREAMPRIVATE_H_
31: #define _OBJC_TYPEDSTREAMPRIVATE_H_
32:
33: /*
34: * This module provides the type definitions necessary for typedstream.h
35: * No client except typedstream should directly use this module.
36: *
37: */
38:
39:
40: #import <streams/streams.h>
41: #import "objc.h"
42: #import "hashtable.h"
43:
44:
45: /*************************************************************************
46: * Low-Level: encoding tightly information,
47: * and sharing pointers and strings
48: **************************************************************************/
49:
50:
51: typedef struct {
52: NXStream *physical; /* the underlying stream */
53: BOOL swap; /* should be swap bytes on reading */
54: BOOL write; /* are we writing */
55: NXHashTable *strings; /* maps strings to labels (vice versa for reading) */
56: int stringCounter; /* next string label */
57: int stringCounterMax;
58: NXHashTable *ptrs; /* maps ptrs to labels (vice versa for reading) */
59: int ptrCounter; /* next ptr label */
60: int ptrCounterMax;
61: NXZone *scratch;
62: } _CodingStream;
63:
64: /* Creation, destruction */
65: static _CodingStream *_NXOpenEncodingStream (NXStream *physical);
66: /* creates an encoding stream, given physical stream */
67:
68: static _CodingStream *_NXOpenDecodingStream (NXStream *physical);
69: /* creates an decoding stream, given physical stream */
70:
71: static BOOL _NXEndOfCodingStream (_CodingStream *coder);
72: /* TRUE iff end of stream */
73:
74: static void _NXCloseCodingStream (_CodingStream *coder);
75:
76: /* Encoding/Decoding of usual quantities */
77:
78: static void _NXEncodeBytes (_CodingStream *coder, const char *buf, int count);
79: static void _NXDecodeBytes (_CodingStream *coder, char *buf, int count);
80:
81: static void _NXEncodeChar (_CodingStream *coder, signed char c);
82: static signed char _NXDecodeChar (_CodingStream *coder);
83:
84: /* static void _NXEncode (_CodingStream *coder, short x); */
85: static short _NXDecodeShort (_CodingStream *coder);
86:
87: static void _NXEncodeInt (_CodingStream *coder, int x);
88: static int _NXDecodeInt (_CodingStream *coder);
89:
90: static void _NXEncodeFloat (_CodingStream *coder, float x);
91: static float _NXDecodeFloat (_CodingStream *coder);
92:
93: static void _NXEncodeDouble (_CodingStream *coder, double x);
94: static double _NXDecodeDouble (_CodingStream *coder);
95:
96: /* low-level string coding; should never be called directly */
97: static void _NXEncodeChars (_CodingStream *coder, const char *str);
98: static char *_NXDecodeChars (_CodingStream *coder, NXZone *zone);
99:
100: /* Encoding/Decoding of shared quantities. Forces sharing of strings: identical but non shared strings at encoding will end up shared at decoding */
101: static void _NXEncodeSharedString (_CodingStream *coder, const char *str);
102: static char *_NXDecodeSharedString (_CodingStream *coder);
103: static const char *_NXDecodeUniqueString (_CodingStream *coder);
104: /* always returns a "unique" string, that should never be freed */
105:
106: static void _NXEncodeString (_CodingStream *coder, const char *str);
107: static char *_NXDecodeString (_CodingStream *coder, NXZone *zone);
108: /* always returns a new string */
109:
110: static BOOL _NXEncodeShared (_CodingStream *coder, const void *ptr);
111: /* if ptr was previously encoded, encodes its previous label and returns FALSE
112: if this is a new ptr, encodes that it's a new one, increases the label counter and returns TRUE ; It is assumed that the information relative to ptr is then encoded */
113: /* static BOOL _NXDecodeShared (_CodingStream *coder, void **pptr, int *label); */
114: /* if we are reading a previously read quantity or nil, its previous ptr is set, and FALSE is returned
115: if we are reading a new marker, sets the appropriate label and returns TRUE. The data should then be read and _NXNoteShared should be called */
116: /* static void _NXNoteShared (_CodingStream *coder, void *ptr, int label); */
117:
118: /*************************************************************************
119: * Encoding typed information, and dealing with ids
120: **************************************************************************/
121:
122: typedef struct {
123: const char *className;
124: int version;
125: } _ClassVersion;
126:
127: typedef struct {
128: _CodingStream *coder; /* the underlying stream */
129: NXHashTable *ids; /* Set of all visited IDs */
130: BOOL write; /* writing vs reading */
131: BOOL noteConditionals; /* when TRUE, it's a no-write pass */
132: BOOL doStatistics ; /* prints statistics */
133: const char *fileName; /* unless nil, file to be written when stream is closed */
134: signed char streamerVersion; /* changes in the meta-schema */
135: int systemVersion; /* typically, appkit version */
136: NXHashTable *classVersions; /* for read: [className -> version] */
137: int classVersionsCounter;
138: NXZone *objectZone;
139: } TypedStream;
140:
141: static void InternalWriteObject (TypedStream *s, id object);
142: /* writes an object without header */
143: static id InternalReadObject (TypedStream *s);
144: /* reads an object without header */
145:
146: static void NXWriteClass (NXTypedStream *stream, Class class);
147: /* Equivalent to NXWriteTypes (stream, "#", &class) */
148: static Class NXReadClass (NXTypedStream *stream);
149:
150: #endif /* _OBJC_TYPEDSTREAMPRIVATE_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.