;+#
;+# ***** BEGIN LICENSE BLOCK *****
;+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
;+#
;+# The contents of this file are subject to the Mozilla Public License Version
;+# 1.1 (the "License"); you may not use this file except in compliance with
;+# the License. You may obtain a copy of the License at
;+# http://www.mozilla.org/MPL/
;+#
;+# Software distributed under the License is distributed on an "AS IS" basis,
;+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
;+# for the specific language governing rights and limitations under the
;+# License.
;+#
;+# The Original Code is the Netscape Portable Runtime (NSPR).
;+#
;+# The Initial Developer of the Original Code is
;+# Netscape Communications Corporation.
;+# Portions created by the Initial Developer are Copyright (C) 2002-2003
;+# the Initial Developer. All Rights Reserved.
;+#
;+# Contributor(s):
;+#
;+# Alternatively, the contents of this file may be used under the terms of
;+# either the GNU General Public License Version 2 or later (the "GPL"), or
;+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
;+# in which case the provisions of the GPL or the LGPL are applicable instead
;+# of those above. If you wish to allow use of your version of this file only
;+# under the terms of either the GPL or the LGPL, and not to allow others to
;+# use your version of this file under the terms of the MPL, indicate your
;+# decision by deleting the provisions above and replace them with the notice
;+# and other provisions required by the GPL or the LGPL. If you do not delete
;+# the provisions above, a recipient may use your version of this file under
;+# the terms of any one of the MPL, the GPL or the LGPL.
;+#
;+# ***** END LICENSE BLOCK *****
;+#
;+# OK, this file is meant to support SUN, LINUX, AIX, OS/2 and WINDOWS
;+#   1. For all unix platforms, the string ";-"  means "remove this line"
;+#   2. For all unix platforms, the string " DATA " will be removed from any 
;+#     line on which it occurs.
;+#   3. Lines containing ";+" will have ";+" removed on SUN and LINUX.
;+#      On AIX, lines containing ";+" will be removed.
;+#   4. For all unix platforms, the string ";;" will thave the ";;" removed.
;+#   5. For all unix platforms, after the above processing has taken place,
;+#    all characters after the first ";" on the line will be removed.
;+#    And for AIX, the first ";" will also be removed.
;+#  This file is passed directly to windows. Since ';' is a comment, all UNIX
;+#   directives are hidden behind ";", ";+", and ";-"
;+NSPR_4.0 {
;+    global:
LIBRARY plc4 ;-
EXPORTS ;-
PL_Base64Decode;
PL_Base64Encode;
PL_CreateOptState;
PL_DestroyOptState;
PL_FPrintError;
PL_GetNextOpt;
PL_PrintError;
PL_strcasecmp;
PL_strcaserstr;
PL_strcasestr;
PL_strcat;
PL_strcatn;
PL_strchr;
PL_strcmp;
PL_strcpy;
PL_strdup;
PL_strfree;
PL_strlen;
PL_strncasecmp;
PL_strncaserstr;
PL_strncasestr;
PL_strncat;
PL_strnchr;
PL_strncmp;
PL_strncpy;
PL_strncpyz;
PL_strndup;
PL_strnlen;
PL_strnpbrk;
PL_strnprbrk;
PL_strnrchr;
PL_strnrstr;
PL_strnstr;
PL_strpbrk;
PL_strprbrk;
PL_strrchr;
PL_strrstr;
PL_strstr;
libVersionPoint;
;+    local: *;
;+};
;+
;+NSPR_4.2 {
;+    global:
PL_strtok_r;
;+} NSPR_4.0;
;+
;+NSPR_4.7 {
;+    global:
PL_CreateLongOptState;
;+} NSPR_4.2;
