aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/lang/natClassLoader.cc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2004-01-05 10:15:07 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2004-01-05 10:15:07 +0000
commitfa1704829dcffb01eff7339e16b758b811c88b0c (patch)
tree36e9297b11efb8f019fcf8b10844949d9de38834 /libjava/java/lang/natClassLoader.cc
parentb56c00235ac3ecacbae193517008a68eaed57f57 (diff)
downloadgcc-fa1704829dcffb01eff7339e16b758b811c88b0c.zip
gcc-fa1704829dcffb01eff7339e16b758b811c88b0c.tar.gz
gcc-fa1704829dcffb01eff7339e16b758b811c88b0c.tar.bz2
re PR c++/13387 (assignment to base class corrupts subclass)
PR c++/13387 * g++.dg/opt/alias3.C: New test. Co-Authored-By: Richard Sandiford <rsandifo@redhat.com> From-SVN: r75427
Diffstat (limited to 'libjava/java/lang/natClassLoader.cc')
0 files changed, 0 insertions, 0 deletions
ref='#n104'>104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
#ifndef _IPXE_URI_H
#define _IPXE_URI_H

/** @file
 *
 * Uniform Resource Identifiers
 *
 */

FILE_LICENCE ( GPL2_OR_LATER );

#include <stddef.h>
#include <stdlib.h>
#include <ipxe/refcnt.h>

/** A Uniform Resource Identifier
 *
 * Terminology for this data structure is as per uri(7), except that
 * "path" is defined to include the leading '/' for an absolute path.
 *
 * Note that all fields within a URI are optional and may be NULL.
 *
 * The pointers to the various fields are packed together so they can
 * be accessed in array fashion in some places in uri.c where doing so
 * saves significant code size.
 *
 * Some examples are probably helpful:
 *
 *   http://www.ipxe.org/wiki :
 *
 *   scheme = "http", host = "www.ipxe.org", path = "/wiki"
 *
 *   /var/lib/tftpboot :
 *
 *   path = "/var/lib/tftpboot"
 *
 *   mailto:bob@nowhere.com :
 *
 *   scheme = "mailto", opaque = "bob@nowhere.com"
 *
 *   ftp://joe:secret@insecure.org:8081/hidden/path/to?what=is#this
 *
 *   scheme = "ftp", user = "joe", password = "secret",
 *   host = "insecure.org", port = "8081", path = "/hidden/path/to",
 *   query = "what=is", fragment = "this"
 */
struct uri {
	/** Reference count */
	struct refcnt refcnt;
	/** Scheme */
	const char *scheme;
	/** Opaque part */
	const char *opaque;
	/** User name */
	const char *user;
	/** Password */
	const char *password;
	/** Host name */
	const char *host;
	/** Port number */
	const char *port;
	/** Path */
	const char *path;
	/** Query */
	const char *query;
	/** Fragment */
	const char *fragment;
} __attribute__ (( packed ));

/** A field in a URI
 *
 * The order of the indices in this enumeration must match the order
 * of the fields in the URI structure.
 */
enum {
	URI_SCHEME = 0,		URI_SCHEME_BIT = ( 1 << URI_SCHEME ),
	URI_OPAQUE = 1,		URI_OPAQUE_BIT = ( 1 << URI_OPAQUE ),
	URI_USER = 2,		URI_USER_BIT = ( 1 << URI_USER ),
	URI_PASSWORD = 3,	URI_PASSWORD_BIT = ( 1 << URI_PASSWORD ),
	URI_HOST = 4,		URI_HOST_BIT = ( 1 << URI_HOST ),
	URI_PORT = 5,		URI_PORT_BIT = ( 1 << URI_PORT ),
	URI_PATH = 6,		URI_PATH_BIT = ( 1 << URI_PATH ),
	URI_QUERY = 7,		URI_QUERY_BIT = ( 1 << URI_QUERY ),
	URI_FRAGMENT = 8,	URI_FRAGMENT_BIT = ( 1 << URI_FRAGMENT ),

	URI_FIRST_FIELD = URI_SCHEME,
	URI_LAST_FIELD = URI_FRAGMENT,
};

/** Extract field from URI */
#define uri_get_field( uri, field )	(&uri->scheme)[field]

/** All URI fields */
#define URI_ALL		( URI_SCHEME_BIT | URI_OPAQUE_BIT | URI_USER_BIT | \
			  URI_PASSWORD_BIT | URI_HOST_BIT | URI_PORT_BIT | \
			  URI_PATH_BIT | URI_QUERY_BIT | URI_FRAGMENT_BIT )

/** URI fields that should be decoded on storage */
#define URI_ENCODED	( URI_USER_BIT | URI_PASSWORD_BIT | URI_HOST_BIT | \
			  URI_PATH_BIT | URI_QUERY_BIT | URI_FRAGMENT_BIT )

/**
 * URI is an absolute URI
 *
 * @v uri			URI
 * @ret is_absolute		URI is absolute
 *
 * An absolute URI begins with a scheme, e.g. "http:" or "mailto:".
 * Note that this is a separate concept from a URI with an absolute
 * path.
 */
static inline int uri_is_absolute ( struct uri *uri ) {
	return ( uri->scheme != NULL );
}

/**
 * URI has a path
 *
 * @v uri			URI
 * @ret has_path		URI has a path
 */
static inline int uri_has_path ( struct uri *uri ) {
	return ( uri->path && ( uri->path[0] != '\0' ) );
}

/**
 * URI has an absolute path
 *
 * @v uri			URI
 * @ret has_absolute_path	URI has an absolute path
 *
 * An absolute path begins with a '/'.  Note that this is a separate
 * concept from an absolute URI.  Note also that a URI may not have a
 * path at all.
 */
static inline int uri_has_absolute_path ( struct uri *uri ) {
	return ( uri->path && ( uri->path[0] == '/' ) );
}

/**
 * URI has a relative path
 *
 * @v uri			URI
 * @ret has_relative_path	URI has a relative path
 *
 * A relative path begins with something other than a '/'.  Note that
 * this is a separate concept from a relative URI.  Note also that a
 * URI may not have a path at all.
 */
static inline int uri_has_relative_path ( struct uri *uri ) {
	return ( uri->path && ( uri->path[0] != '/' ) );
}

/**
 * Increment URI reference count
 *
 * @v uri		URI, or NULL
 * @ret uri		URI as passed in
 */
static inline __attribute__ (( always_inline )) struct uri *
uri_get ( struct uri *uri ) {
	ref_get ( &uri->refcnt );
	return uri;
}

/**
 * Decrement URI reference count
 *
 * @v uri		URI, or NULL
 */
static inline __attribute__ (( always_inline )) void
uri_put ( struct uri *uri ) {
	ref_put ( &uri->refcnt );
}

extern struct uri *cwuri;

extern struct uri * parse_uri ( const char *uri_string );
extern unsigned int uri_port ( struct uri *uri, unsigned int default_port );
extern int unparse_uri ( char *buf, size_t size, struct uri *uri,
			 unsigned int fields );
extern struct uri * uri_dup ( struct uri *uri );
extern char * resolve_path ( const char *base_path,
			     const char *relative_path );
extern struct uri * resolve_uri ( struct uri *base_uri,
				  struct uri *relative_uri );
extern void churi ( struct uri *uri );
extern size_t uri_encode ( const char *raw_string, char *buf, ssize_t len,
			   int field );
extern size_t uri_decode ( const char *encoded_string, char *buf, ssize_t len );

#endif /* _IPXE_URI_H */