summaryrefslogtreecommitdiffstats
path: root/BeOS
diff options
context:
space:
mode:
Diffstat (limited to 'BeOS')
-rw-r--r--BeOS/ar-1.1/Makefile48
-rw-r--r--BeOS/ar-1.1/README.html1
-rw-r--r--BeOS/ar-1.1/README.txt29
-rw-r--r--BeOS/ar-1.1/arbin16355 -> 0 bytes
-rw-r--r--BeOS/ar-1.1/ar.xMAP461
-rw-r--r--BeOS/ar-1.1/commands.c809
-rw-r--r--BeOS/ar-1.1/commands.h28
-rw-r--r--BeOS/ar-1.1/copy_attrs.c128
-rw-r--r--BeOS/ar-1.1/copy_attrs.h24
-rw-r--r--BeOS/ar-1.1/docs/ar.html234
-rw-r--r--BeOS/ar-1.1/docs/dumpar.py271
-rw-r--r--BeOS/ar-1.1/docs/dumpo.py126
-rw-r--r--BeOS/ar-1.1/docs/notes34
-rw-r--r--BeOS/ar-1.1/main.c312
-rw-r--r--BeOS/ar-1.1/mwlib.c711
-rw-r--r--BeOS/ar-1.1/mwlib.h118
16 files changed, 0 insertions, 3334 deletions
diff --git a/BeOS/ar-1.1/Makefile b/BeOS/ar-1.1/Makefile
deleted file mode 100644
index 8fb11ec..0000000
--- a/BeOS/ar-1.1/Makefile
+++ /dev/null
@@ -1,48 +0,0 @@
-######################################################################
-# Makefile for ar
-#
-# Dec. 14, 1997 Chris Herborth (chrish@kagi.com)
-#
-# $Id$
-######################################################################
-
-AR_VERSION=1.1
-
-# Make variables
-CC=mwcc
-LD=mwcc
-
-CFLAGS=-w9 -rostr -O3 -g
-CFLAGS_O=-w9 -rostr -O7 -opt schedule604
-LDFLAGS=-g -map ar.xMAP
-LDFLAGS_O=
-
-INSTALL=install -m 755
-
-DESTINATION=/boot/home/config/bin
-
-PARTS=main.o mwlib.o commands.o copy_attrs.o
-
-all: ar
-
-nodebug:
- -rm -f ar $(PARTS) ar.dbg ar.xSYM
- $(MAKE) CFLAGS="$(CFLAGS_O) -DNO_DEBUG" LDFLAGS="$(LDFLAGS_O)" ar
-
-ar: $(PARTS)
- $(LD) $(LDFLAGS) -o $@ $(PARTS)
-
-install: ar
- $(INSTALL) ar $(DESTINATION)
- ln -sf $(DESTINATION)/ar $(DESTINATION)/ar-posix
-
-clean:
- -rm -f $(PARTS) ar ar.dbg ar.xSYM
-
-zip:
- (cd .. ; zip -9ry ar-$(AR_VERSION).zip ar-$(AR_VERSION) \
- -x ar-$(AR_VERSION)/RCS -x ar-$(AR_VERSION)/docs/RCS \
- -x ar-$(AR_VERSION)/RCS/\* -x ar-$(AR_VERSION)/docs/RCS/\*)
-
-%.o: %.c
- $(CC) $(CFLAGS) -c $< -o $@
diff --git a/BeOS/ar-1.1/README.html b/BeOS/ar-1.1/README.html
deleted file mode 100644
index 607c03a..0000000
--- a/BeOS/ar-1.1/README.html
+++ /dev/null
@@ -1 +0,0 @@
-docs/ar.html \ No newline at end of file
diff --git a/BeOS/ar-1.1/README.txt b/BeOS/ar-1.1/README.txt
deleted file mode 100644
index f995789..0000000
--- a/BeOS/ar-1.1/README.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-ar - POSIX 1003.2 interface to library files
-
-Here's the source and PowerPC binary for a POSIX 1003.2 interface "ar"
-command; this is extremely useful when you're porting complex UNIX/POSIX
-software to BeOS for PowerPC (I originally wrote it to support my Python
-port).
-
-To build/install ar, do this in a Terminal:
-
-make nodebug install
-
-This will create ar and ar-posix (a symlink to ar) in ~/config/bin. The
-ar-posix symlink is to make things a little easier if you happen to
-have GeekGadgets (see www.ninemoons.com) installed; it comes with an
-ar that only works on objects/libraries produced by GNU C for BeOS.
-
-To use the POSIX ar with your port, do something like this:
-
-AR=ar-posix ./configure ... normal configure arguments ...
-
-and then:
-
-make AR=ar-posix
-
-You may need to check the Makefiles; people seem to be quite sloppy about
-using just plain "ar cr libfoo.a ..." instead of "$(AR) cr libfoo.a ...".
-
-- Chris Herborth, April 18, 1998
- (chrish@kagi.com)
diff --git a/BeOS/ar-1.1/ar b/BeOS/ar-1.1/ar
deleted file mode 100644
index e44e2dc..0000000
--- a/BeOS/ar-1.1/ar
+++ /dev/null
Binary files differ
diff --git a/BeOS/ar-1.1/ar.xMAP b/BeOS/ar-1.1/ar.xMAP
deleted file mode 100644
index bee438d..0000000
--- a/BeOS/ar-1.1/ar.xMAP
+++ /dev/null
@@ -1,461 +0,0 @@
-File: 0 "/boot/src/ar-1.0/main.c"
-File: 1 "/boot/src/ar-1.0/mwlib.c"
-File: 2 "/boot/src/ar-1.0/commands.c"
-File: 3 "/boot/src/ar-1.0/copy_attrs.c"
-File: 5 "/boot/rel/src/kit/glue/common/global_destructor_chain.c"
-File: 6 "/boot/rel/src/kit/glue/ppc/runtime.c"
-File: 9 "/boot/rel/src/kit/glue/common/init_term_dyn.c"
-File: 10 "/boot/rel/src/kit/glue/common/start_dyn.c"
-File: 11 "/boot/develop/lib/ppc/libroot.so"
-
-Files that were not referenced:
-"libbe.so"
-"libtracker.so"
-"libmedia.so"
-"libnet.so"
-"libnetdev.so"
-"libdevice.so"
-"libmidi.so"
-"libgame.so"
-"libatalk.so"
-"libmail.so"
-
-Code section, size = 16672 bytes
-000000 PR .__sinit file = "*Linker-Generated*"
-00001C PR .usage file = "main.c"
-000050 PR .version
-000094 PR .check_command
-000128 PR .main
-0005A0 PR .load_MW_lib file = "mwlib.c"
-000A1C PR .load_MWLibFile
-000BAC PR .fwrite_big32
-000C10 PR .fwrite_big32_seek
-000CA4 PR .add_object_sizes
-000DA4 PR .setfiletype
-000EA8 PR .write_MW_lib
-001850 PR .do_match file = "commands.c"
-001958 PR .do_delete
-001A84 PR .delete_lib_entry
-001C5C PR .do_print
-001D98 PR .print_lib_entry
-001E90 PR .load_lib_file
-0020F4 PR .do_replace
-0023B8 PR .add_lib_entry
-00256C PR .replace_lib_entry
-00272C PR .do_table
-002868 PR .table_lib_entry
-0029E8 PR .do_extract
-002B24 PR .extract_lib_entry
-002E20 PR .copy_attrs file = "copy_attrs.c"
-00306C PR .__destroy_global_chain file = "global_destructor_chain.c"
-0030C0 PR .__RTOC file = "init_term_dyn.c"
-0030C8 PR ._init_routine_
-003118 PR ._term_routine_
-003148 PR .__start file = "start_dyn.c"
-003204 GL .__register_fragment file = "*Linker-Generated*"
-00321C GL .find_thread
-003234 GL .memcpy
-00324C GL ._call_init_routines_
-003264 GL .printf
-00327C GL .exit
-003294 GL .getopt
-0032AC GL .malloc
-0032C4 GL .__assertion_failed
-0032DC GL .fprintf
-0032F4 GL .fopen
-00330C GL .fread
-003324 GL .fseek
-00333C GL .fgets
-003354 GL .strdup
-00336C GL .fclose
-003384 GL .strrchr
-00339C GL .strcmp
-0033B4 GL .free
-0033CC GL .memset
-0033E4 GL .access
-0033FC GL .stat
-003414 GL ._errnop
-00342C GL .strerror
-003444 GL .strlen
-00345C GL .sprintf
-003474 GL .unlink
-00348C GL .rename
-0034A4 GL .fwrite
-0034BC GL .ftell
-0034D4 GL .chmod
-0034EC GL .open
-003504 GL .close
-00351C GL .fs_fopen_attr_dir
-003534 GL .fs_read_attr_dir
-00354C GL .fs_stat_attr
-003564 GL .fs_read_attr
-00357C GL .fs_write_attr
-003594 GL .fflush
-0035AC GL .realloc
-0035C4 GL .localtime
-0035DC GL .strftime
-0035F4 GL .getgid
-00360C GL .getuid
-003624 GL .utime
-00363C GL ._thread_do_exit_notification
-003654 GL .__unregister_fragment
-00366C GL .__ptr_glue file = "runtime.c"
-003680 RO @10 file = "main.c"
-003690 RO @13
-0036B4 RO @16
-0036D8 RO @17
-0036FC RO @18
-003739 RO @30
-003769 RO @109
-00378A RO @110
-0037A2 RO @111
-0037BA RO @112
-0037D3 RO @113
-0037DD RO @114
-0037FD RO @115
-003815 RO @116
-003829 RO @117
-00383D RO @118
-003871 RO @119
-00388C RO @120
-0038A5 RO @121
-0038B9 RO @78 file = "mwlib.c"
-0038C3 RO @79
-0038CB RO @80
-0038DA RO @81
-0038DC RO @98
-0038E7 RO @99
-0038F5 RO @104
-0038FE RO @122
-003908 RO @123
-003913 RO @124
-00391E RO @133
-003947 RO @134
-003951 RO @135
-00397B RO @235
-003980 RO @236
-0039AC RO @237
-0039C3 RO @238
-0039F5 RO @239
-0039F9 RO @240
-003A12 RO @241
-003A33 RO @242
-003A35 RO @243
-003A56 RO @244
-003A7B RO @245
-003AA7 RO @246
-003AD1 RO @247
-003AF0 RO @248
-003B14 RO @249
-003B3D RO @250
-003B69 RO @251
-003B90 RO @252
-003BBB RO @253
-003BD8 RO @254
-003BF1 RO @255
-003C11 RO @29 file = "commands.c"
-003C1B RO @30
-003C26 RO @31
-003C31 RO @32
-003C3B RO @53
-003C4E RO @54
-003C65 RO @55
-003C7D RO @81
-003C9E RO @82
-003CA6 RO @120
-003CAE RO @121
-003CC5 RO @142
-003CD4 RO @143
-003CDF RO @144
-003CF6 RO @145
-003D0C RO @146
-003D2E RO @147
-003D30 RO @148
-003D47 RO @149
-003D5E RO @198
-003D6F RO @199
-003D89 RO @200
-003DAA RO @222
-003DCF RO @223
-003DE8 RO @224
-003E12 RO @225
-003E1A RO @242
-003E39 RO @243
-003E65 RO @244
-003E6D RO @284
-003E85 RO @285
-003E88 RO @286
-003E9F RO @287
-003EBE RO @288
-003EC9 RO @289
-003ECD RO @343
-003EE6 RO @344
-003EEE RO @345
-003EF0 RO @346
-003F11 RO @347
-003F27 RO @348
-003F53 RO @349
-003F7E RO @350
-003F97 RO @43 file = "copy_attrs.c"
-003FA6 RO @44
-003FB3 RO @45
-003FC4 TI @14 file = "main.c"
-003FD0 TI @19
-003FDC TI @32
-003FE8 TI @124
-003FF4 TI @82 file = "mwlib.c"
-004000 TI @100
-00400C TI @105
-004018 TI @111
-004024 TI @125
-004030 TI @136
-00403C TI @256
-004048 TI @33 file = "commands.c"
-004054 TI @56
-004060 TI @83
-00406C TI @110
-004078 TI @122
-004084 TI @150
-004090 TI @201
-00409C TI @226
-0040A8 TI @245
-0040B4 TI @272
-0040C0 TI @290
-0040CC TI @317
-0040D8 TI @351
-0040E4 TI @46 file = "copy_attrs.c"
-0040F0 TI @7 file = "global_destructor_chain.c"
-0040FC TI @2 file = "init_term_dyn.c"
-004108 TI @4
-004114 TI @17 file = "start_dyn.c"
-
-Data section, size = 1084 bytes (TOC anchor = 000000)
-000000 TC fs_write_attr file = "*Linker-Generated*"
-000004 TC strftime
-000008 TC fwrite
-00000C TC sprintf
-000010 TC open
-000014 TC fread
-000018 TC fs_fopen_attr_dir
-00001C TC fseek
-000020 TC strrchr
-000024 TC free
-000028 TC printf
-00002C TC ftell
-000030 TC exit
-000034 TC strerror
-000038 TC __register_fragment
-00003C TC memcpy
-000040 TC strcmp
-000044 TC strlen
-000048 TC _call_init_routines_
-00004C TC strdup
-000050 TC _files
-000054 TC fgets
-000058 TC malloc
-00005C TC find_thread
-000060 TC close
-000064 TC memset
-000068 TC chmod
-00006C TC fopen
-000070 TC stat
-000074 TC fs_read_attr
-000078 TC access
-00007C TC fs_read_attr_dir
-000080 TC unlink
-000084 TC getopt
-000088 TC getgid
-00008C TC __unregister_fragment
-000090 TC _errnop
-000094 TC fprintf
-000098 TC optind
-00009C TC __assertion_failed
-0000A0 TC rename
-0000A4 TC utime
-0000A8 TC getuid
-0000AC TC fs_stat_attr
-0000B0 TC fflush
-0000B4 TC _thread_do_exit_notification
-0000B8 TC fclose
-0000BC TC localtime
-0000C0 TC realloc
-0000C4 TC __global_destructor_chain
-0000C8 TC __exception_table_end__
-0000CC TC __exception_table_start__
-0000D0 TC __data_end__
-0000D4 TC __data_start__
-0000D8 TC __code_end__
-0000DC TC __code_start__
-0000E0 TC __main_thread_id
-0000E4 TC environ
-0000E8 TC argv_save
-0000EC TC @123 file = "main.c"
-0000F0 TC @122
-0000F4 TC @121
-0000F8 TC @120
-0000FC TC @119
-000100 TC @118
-000104 TC @117
-000108 TC @116
-00010C TC @115
-000110 TC @114
-000114 TC @113
-000118 TC @112
-00011C TC @111
-000120 TC @110
-000124 TC @109
-000128 TC @31
-00012C TC @30
-000130 TC @18
-000134 TC @17
-000138 TC @16
-00013C TC @13
-000140 TC @255 file = "mwlib.c"
-000144 TC @254
-000148 TC @253
-00014C TC @252
-000150 TC @251
-000154 TC @250
-000158 TC @249
-00015C TC @248
-000160 TC @247
-000164 TC @246
-000168 TC @245
-00016C TC @244
-000170 TC @243
-000174 TC @242
-000178 TC @241
-00017C TC @240
-000180 TC @239
-000184 TC @238
-000188 TC @237
-00018C TC @236
-000190 TC @235
-000194 TC @135
-000198 TC @134
-00019C TC @133
-0001A0 TC @124
-0001A4 TC @123
-0001A8 TC @122
-0001AC TC @104
-0001B0 TC @99
-0001B4 TC @98
-0001B8 TC @81
-0001BC TC @80
-0001C0 TC @79
-0001C4 TC @78
-0001C8 TC @350 file = "commands.c"
-0001CC TC @349
-0001D0 TC @348
-0001D4 TC @347
-0001D8 TC @346
-0001DC TC @345
-0001E0 TC @344
-0001E4 TC @343
-0001E8 TC @289
-0001EC TC @288
-0001F0 TC @287
-0001F4 TC @286
-0001F8 TC @285
-0001FC TC @284
-000200 TC @244
-000204 TC @243
-000208 TC @242
-00020C TC @225
-000210 TC @224
-000214 TC @223
-000218 TC @222
-00021C TC @200
-000220 TC @199
-000224 TC @198
-000228 TC @149
-00022C TC @148
-000230 TC @147
-000234 TC @146
-000238 TC @145
-00023C TC @144
-000240 TC @143
-000244 TC @142
-000248 TC @121
-00024C TC @120
-000250 TC @82
-000254 TC @81
-000258 TC @55
-00025C TC @54
-000260 TC @53
-000264 TC @32
-000268 TC @31
-00026C TC @30
-000270 TC @29
-000274 TC @45 file = "copy_attrs.c"
-000278 TC @44
-00027C TC @43
-000280 TC magic_template file = "start_dyn.c"
-000284 TC default_environ
-000288 TD ar_version_id file = "main.c"
-00028C TD fragmentID file = "init_term_dyn.c"
-000290 DS _term_routine_ file = "init_term_dyn.c"
-000298 DS _init_routine_
-0002A0 DS __start file = "start_dyn.c"
-0002A8 RW @31 file = "main.c"
-0002FC RW @123
-000388 RW @122
-000414 RW magic_template file = "start_dyn.c"
-00041C RW @13
-00042C RW default_environ
-000434 RW __global_destructor_chain file = "global_destructor_chain.c"
-
-Import container "libroot.so"
-Current Version = 00000000, Old Implementation = 00000000
-000000 DS fs_write_attr
-000001 DS strftime
-000002 DS fwrite
-000003 DS sprintf
-000004 DS open
-000005 DS fread
-000006 DS fs_fopen_attr_dir
-000007 DS fseek
-000008 DS strrchr
-000009 DS free
-00000A RW environ
-00000B DS printf
-00000C DS ftell
-00000D DS exit
-00000E DS strerror
-00000F DS __register_fragment
-000010 DS memcpy
-000011 DS strcmp
-000012 DS strlen
-000013 DS _call_init_routines_
-000014 DS strdup
-000015 RW argv_save
-000016 RW _files
-000017 DS fgets
-000018 DS malloc
-000019 DS find_thread
-00001A DS close
-00001B DS memset
-00001C DS chmod
-00001D DS fopen
-00001E DS stat
-00001F DS fs_read_attr
-000020 DS access
-000021 DS fs_read_attr_dir
-000022 DS unlink
-000023 DS getopt
-000024 DS getgid
-000025 DS __unregister_fragment
-000026 DS _errnop
-000027 DS fprintf
-000028 RW optind
-000029 DS __assertion_failed
-00002A DS rename
-00002B DS utime
-00002C RW __main_thread_id
-00002D DS getuid
-00002E DS fs_stat_attr
-00002F DS fflush
-000030 DS _thread_do_exit_notification
-000031 DS fclose
-000032 DS localtime
-000033 DS realloc
diff --git a/BeOS/ar-1.1/commands.c b/BeOS/ar-1.1/commands.c
deleted file mode 100644
index f9304d0..0000000
--- a/BeOS/ar-1.1/commands.c
+++ /dev/null
@@ -1,809 +0,0 @@
-/*
-** commands.c - POSIX 1003.2 "ar" command
-**
-** This isn't a pure POSIX 1003.2 ar; it only manipulates Metrowerks
-** Library files, not general-purpose POSIX 1003.2 format archives.
-**
-** Dec. 14, 1997 Chris Herborth (chrish@kagi.com)
-**
-** This code is donated to the PUBLIC DOMAIN. You can use, abuse, modify,
-** redistribute, steal, or otherwise manipulate this code. No restrictions
-** at all. If you laugh at this code, you can't use it.
-**
-** This "ar" was implemented using IEEE Std 1003.2-1992 as the basis for
-** the interface, and Metrowerk's published docs detailing their library
-** format. Look inside for clues about how reality differs from MW's
-** documentation on BeOS...
-*/
-
-#include <support/Errors.h>
-#include <support/byteorder.h>
-#ifndef NO_DEBUG
-#include <assert.h>
-#define ASSERT(cond) assert(cond)
-#else
-#define ASSERT(cond) ((void)0)
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <limits.h>
-#include <string.h>
-#include <utime.h>
-#include <errno.h>
-#include <sys/stat.h>
-
-#include "mwlib.h"
-#include "commands.h"
-
-#ifndef FALSE
-#define FALSE (0)
-#endif
-#ifndef TRUE
-#define TRUE (!FALSE)
-#endif
-
-static const char *rcs_version_id = "$Id$";
-
-/* ----------------------------------------------------------------------
-** Local functions
-**
-** do_match() - find the index of the file, if it's in the archive; return
-** TRUE if found, else FALSE
-**/
-static int do_match( MWLib *lib, const char *file, int *idx );
-
-static int do_match( MWLib *lib, const char *file, int *idx )
-{
- int which = 0;
- char *name_ptr;
-
- ASSERT( lib != NULL );
- ASSERT( file != NULL );
- ASSERT( idx != NULL );
-
- /* Skip over the path, if any, so we can compare just the file name.
- */
- name_ptr = strrchr( file, '/' );
- if( name_ptr == NULL ) {
- name_ptr = (char *)file;
- } else {
- name_ptr++;
- }
-
- for( which = 0; which < lib->header.num_objects; which++ ) {
- if( !strcmp( name_ptr, lib->names[which] ) ) {
- *idx = which;
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-/* ----------------------------------------------------------------------
-** Delete an archive member.
-**
-** This isn't really optimal; you could make a more efficient version
-** using a linked list instead of arrays for the data. This was easier
-** to write, and speed shouldn't be that big a deal here... you're not
-** likely to be dealing with thousands of files.
-*/
-static status_t delete_lib_entry( MWLib *lib, int idx, int verbose );
-
-status_t do_delete( const char *archive_name, char **files, int verbose )
-{
- status_t retval = B_OK;
- MWLib lib;
- int idx = 0;
- int which = 0;
-
- ASSERT( archive_name != NULL );
-
- if( files == NULL ) {
- fprintf( stderr, "ar: %s, nothing to do\n", archive_name );
- return B_ERROR;
- }
-
- retval = load_MW_lib( &lib, archive_name );
- if( retval != B_OK ) {
- switch( retval ) {
- case B_FILE_NOT_FOUND:
- fprintf( stderr, "ar: %s, file not found\n", archive_name );
- return retval;
- break;
-
- default:
- return retval;
- break;
- }
- }
-
- /* Delete the specified files.
- */
- for( idx = 0; files[idx] != NULL; idx++ ) {
- if( do_match( &lib, files[idx], &which ) ) {
- retval = delete_lib_entry( &lib, which, verbose );
- }
- which = 0;
- }
-
- /* Write the new file.
- */
- retval = write_MW_lib( &lib, archive_name );
-
- return retval;
-}
-
-static status_t delete_lib_entry( MWLib *lib, int which, int verbose )
-{
- uint32 new_num;
- MWLibFile *new_files = NULL;
- char **new_names = NULL;
- char **new_data = NULL;
- int ctr = 0;
- int idx = 0;
-
- ASSERT( lib != NULL );
- ASSERT( which <= lib->header.num_objects );
-
- new_num = lib->header.num_objects - 1;
-
- new_files = (MWLibFile *)malloc( new_num * ( sizeof( MWLibFile ) ) );
- new_names = (char **)malloc( new_num * ( sizeof( char * ) ) );
- new_data = (char **)malloc( new_num * ( sizeof( char * ) ) );
- if( new_files == NULL || new_names == NULL || new_data == NULL ) {
- return B_NO_MEMORY;
- }
-
- /* Copy the contents of the old lib to the new lib, skipping the one
- ** we want to delete.
- */
- for( ctr = 0; ctr < lib->header.num_objects; ctr++ ) {
- if( ctr != which ) {
- memcpy( &(new_files[idx]), &(lib->files[ctr]),
- sizeof( MWLibFile ) );
- new_names[idx] = lib->names[ctr];
- new_data[idx] = lib->data[ctr];
-
- idx++;
- } else {
- /* Free up the name and data.
- */
- if( verbose ) {
- printf( "d - %s\n", lib->names[ctr] );
- }
-
- free( lib->names[idx] );
- lib->names[idx] = NULL;
- free( lib->data[idx] );
- lib->data[idx] = NULL;
- }
- }
-
- /* Free up the old lib's data.
- */
- free( lib->files );
- free( lib->names );
- free( lib->data );
-
- lib->files = new_files;
- lib->names = new_names;
- lib->data = new_data;
-
- lib->header.num_objects = new_num;
-
- return B_OK;
-}
-
-/* ----------------------------------------------------------------------
-** Print an archive member to stdout.
-*/
-static status_t print_lib_entry( MWLib *lib, int idx, int verbose );
-
-status_t do_print( const char *archive_name, char **files, int verbose )
-{
- status_t retval = B_OK;
- MWLib lib;
- int idx = 0;
-
- ASSERT( archive_name != NULL );
-
- retval = load_MW_lib( &lib, archive_name );
- if( retval != B_OK ) {
- switch( retval ) {
- case B_FILE_NOT_FOUND:
- fprintf( stderr, "ar: %s, file not found\n", archive_name );
- return retval;
- break;
-
- default:
- return retval;
- break;
- }
- }
-
- if( files == NULL ) {
- /* Then we print the entire archive.
- */
- for( idx = 0; idx < lib.header.num_objects; idx++ ) {
- retval = print_lib_entry( &lib, idx, verbose );
- }
- } else {
- /* Then we print the specified files.
- */
- int which = 0;
-
- for( idx = 0; files[idx] != NULL; idx++ ) {
- if( do_match( &lib, files[idx], &which ) ) {
- retval = print_lib_entry( &lib, which, verbose );
- }
- which = 0;
- }
- }
-
- return retval;
-}
-
-static status_t print_lib_entry( MWLib *lib, int idx, int verbose )
-{
- int recs;
-
- ASSERT( lib != NULL );
-
- if( verbose ) {
- printf( "\n<%s>\n\n", lib->names[idx] );
- }
-
- recs = fwrite( lib->data[idx], lib->files[idx].object_size, 1, stdout );
- fflush( stdout );
- if( recs != 1 ) {
- fprintf( stderr, "error printing %s, %s\n", lib->names[idx],
- strerror( errno ) );
- return B_OK;
- }
-
- return B_OK;
-}
-
-/* ----------------------------------------------------------------------
-** Add/replace/update files in an archive.
-*/
-static status_t add_lib_entry( MWLib *lib, const char *filename, int verbose );
-static status_t replace_lib_entry( MWLib *lib, const char *filename,
- int idx, int verbose );
-static status_t load_lib_file( const char *filename,
- char **data, MWLibFile *info );
-
-static status_t load_lib_file( const char *filename,
- char **data, MWLibFile *info )
-{
- status_t retval = B_OK;
- struct stat s;
- FILE *fp;
- uint32 recs;
-
- ASSERT( filename != NULL );
- ASSERT( info != NULL );
-
- /* Initialize the info area.
- */
- info->m_time = (time_t)0; /* Only this... */
- info->off_filename = 0;
- info->off_fullpath = 0;
- info->off_object = 0;
- info->object_size = 0; /* ... and this will actually be updated. */
-
- /* stat() the file to get the info we need.
- */
- retval = stat( filename, &s );
- if( retval != 0 ) {
- fprintf( stderr, "ar: can't stat %s, %s\n", filename,
- strerror( errno ) );
- return B_FILE_NOT_FOUND;
- }
-
- /* Possible errors here; if you have an object that's larger
- ** than a size_t can hold (malloc() can only allocate a size_t size,
- ** not a full off_t)...
- */
- if( s.st_size > (off_t)ULONG_MAX ) {
- fprintf( stderr, "ar: %s is too large!\n", filename );
- return B_NO_MEMORY;
- }
-
- /* Allocate enough memory to hold the file data.
- */
- *data = (char *)malloc( (size_t)s.st_size );
- if( *data == NULL ) {
- fprintf( stderr, "ar: can't allocate memory for %s\n", filename );
- return B_NO_MEMORY;
- }
-
- /* Read the file's data.
- */
- fp = fopen( filename, "r" );
- if( fp == NULL ) {
- fprintf( stderr, "ar: can't open %s, %s\n", filename,
- strerror( errno ) );
- retval = B_FILE_NOT_FOUND;
- goto free_data_return;
- }
-
- recs = fread( *data, (size_t)s.st_size, 1, fp );
- if( recs != 1 ) {
- fprintf( stderr, "ar: can't read %s, %s\n", filename,
- strerror( errno ) );
- retval = B_IO_ERROR;
- goto close_fp_return;
- }
-
- fclose( fp );
-
- /* Now that all the stuff that can fail has succeeded, fill in the info
- ** we need.
- */
- info->m_time = s.st_mtime;
- info->object_size = (uint32)s.st_size;
-
- return B_OK;
-
- /* How we should return if an error occurred.
- */
-close_fp_return:
- fclose( fp );
-
-free_data_return:
- free( *data );
- *data = NULL;
-
- return retval;
-}
-
-status_t do_replace( const char *archive_name, char **files, int verbose,
- int create, int update )
-{
- status_t retval = B_OK;
- MWLib lib;
- int idx = 0;
- int which = 0;
-
- ASSERT( archive_name != NULL );
-
- memset( &lib, 0, sizeof( MWLib ) );
-
- if( files == NULL ) {
- fprintf( stderr, "ar: %s, nothing to do\n", archive_name );
- return B_ERROR;
- }
-
- retval = load_MW_lib( &lib, archive_name );
- if( retval != B_OK ) {
- switch( retval ) {
- case B_FILE_NOT_FOUND:
- lib.header.magicword = 'MWOB';
- lib.header.magicproc = 'PPC ';
- lib.header.magicflags = 0;
- lib.header.version = 1;
-
- if( lib.files != NULL ) {
- free( lib.files );
- lib.files = NULL;
- }
-
- if( lib.names != NULL ) {
- free( lib.names );
- lib.names = NULL;
- }
-
- if( lib.data != NULL ) {
- lib.data = NULL;
- }
-
- if( !create ) {
- fprintf( stderr, "ar: creating %s\n", archive_name );
- }
-
- if( update ) {
- fprintf( stderr, "ar: nothing to do for %s\n", archive_name );
- return retval;
- }
- break;
-
- default:
- return retval;
- break;
- }
- }
-
- for( idx = 0; files[idx] != NULL; idx++ ) {
- if( do_match( &lib, files[idx], &which ) ) {
- /* Then the file exists, and we need to replace it or update it.
- */
- if( update ) {
- /* Compare m_times
- ** then replace this entry
- */
- struct stat s;
-
- retval = stat( files[idx], &s );
- if( retval != 0 ) {
- fprintf( stderr, "ar: can't stat %s, %s\n", files[idx],
- strerror( errno ) );
- }
-
- if( s.st_mtime >= lib.files[which].m_time ) {
- retval = replace_lib_entry( &lib, files[idx], which,
- verbose );
- } else {
- fprintf( stderr, "ar: a newer %s is already in %s\n",
- files[idx], archive_name );
- }
- } else {
- /* replace this entry
- */
- retval = replace_lib_entry( &lib, files[idx], which, verbose );
- }
- } else {
- /* add this entry
- */
- retval = add_lib_entry( &lib, files[idx], verbose );
- }
- }
-
- /* Write the new file.
- */
- retval = write_MW_lib( &lib, archive_name );
-
- return retval;
-}
-
-static status_t add_lib_entry( MWLib *lib, const char *filename, int verbose )
-{
- status_t retval = B_OK;
- uint32 new_num_objects;
- uint32 idx;
-
- ASSERT( lib != NULL );
- ASSERT( filename != NULL );
-
- /* Find out how many objects we'll have after we add this one.
- */
- new_num_objects = lib->header.num_objects + 1;
- idx = lib->header.num_objects;
-
- /* Attempt to reallocate the MWLib's buffers. If one of these fails,
- ** we could leak a little memory, but it shouldn't be a big deal in
- ** a short-lived app like this.
- */
- lib->files = (MWLibFile *)realloc( lib->files,
- sizeof(MWLibFile) * new_num_objects );
- lib->names = (char **)realloc( lib->names,
- sizeof(char *) * new_num_objects );
- lib->data = (char **)realloc( lib->data,
- sizeof(char *) * new_num_objects );
- if( lib->files == NULL || lib->names == NULL || lib->data == NULL ) {
- fprintf( stderr, "ar: can't allocate memory to add %s\n", filename );
- return B_NO_MEMORY;
- }
-
- /* Load the file's data and info into the MWLib structure.
- */
- retval = load_lib_file( filename, &(lib->data[idx]), &(lib->files[idx]) );
- if( retval != B_OK ) {
- fprintf( stderr, "ar: error adding %s, %s\n", filename,
- strerror( errno ) );
-
- return retval;
- }
-
- /* Save a copy of the filename. This is where we leak
- ** sizeof(MWLibFile) + 2 * sizeof(char *) bytes because we don't
- ** shrink lib->files, lib->names, and lib->data.
- */
- lib->names[idx] = strdup( filename );
- if( lib->names == NULL ) {
- fprintf( stderr, "ar: error allocating memory for filename\n" );
-
- return B_NO_MEMORY;
- }
-
- /* Now that everything's OK, we can update the MWLib header.
- */
- lib->header.num_objects++;
-
- /* Give a little feedback.
- */
- if( verbose ) {
- printf( "a - %s\n", filename );
- }
-
- return B_OK;
-}
-
-static status_t replace_lib_entry( MWLib *lib, const char *filename,
- int idx, int verbose )
-{
- char *buff;
- MWLibFile info;
- char *dup_name;
-
- status_t retval = B_OK;
-
- ASSERT( lib != NULL );
- ASSERT( filename != NULL );
- ASSERT( idx <= lib->header.num_objects );
-
- /* Load the file's data and info into the MWLib structure.
- **
- ** We'll do it safely so we don't end up writing a bogus library in
- ** the event of failure.
- */
- retval = load_lib_file( filename, &buff, &info );
- if( retval != B_OK ) {
- fprintf( stderr, "ar: error adding %s, %s\n", filename,
- strerror( errno ) );
-
- return retval;
- }
-
- /* Attempt to allocate memory for a duplicate of the file name.
- */
- dup_name = strdup( filename );
- if( dup_name == NULL ) {
- fprintf( stderr, "ar: unable to allocate memory for filename\n",
- filename );
-
- free( buff );
-
- return B_NO_MEMORY;
- }
-
- /* All is well, so let's update the MWLib object appropriately.
- */
- lib->files[idx].m_time = info.m_time;
- lib->files[idx].off_filename = 0;
- lib->files[idx].off_fullpath = 0;
- lib->files[idx].off_object = 0;
- lib->files[idx].object_size = info.object_size;
-
- lib->data[idx] = buff;
-
- free( lib->names[idx] );
- lib->names[idx] = dup_name;
-
- /* Give a little feedback.
- */
- if( verbose ) {
- printf( "r - %s\n", filename );
- }
-
- return B_OK;
-}
-
-/* ----------------------------------------------------------------------
-** Print the table for an archive.
-*/
-static status_t table_lib_entry( MWLib *lib, int idx, int verbose );
-
-status_t do_table( const char *archive_name, char **files, int verbose )
-{
- status_t retval = B_OK;
- MWLib lib;
- int idx = 0;
-
- ASSERT( archive_name != NULL );
-
- retval = load_MW_lib( &lib, archive_name );
- if( retval != B_OK ) {
- switch( retval ) {
- case B_FILE_NOT_FOUND:
- fprintf( stderr, "ar: %s, file not found\n", archive_name );
- return retval;
- break;
-
- default:
- return retval;
- break;
- }
- }
-
- if( files == NULL ) {
- /* Then we print the table for the entire archive.
- */
- for( idx = 0; idx < lib.header.num_objects; idx++ ) {
- retval = table_lib_entry( &lib, idx, verbose );
- }
- } else {
- /* Then we print the table for the specified files.
- */
- int which = 0;
-
- for( idx = 0; files[idx] != NULL; idx++ ) {
- if( do_match( &lib, files[idx], &which ) ) {
- retval = table_lib_entry( &lib, which, verbose );
- }
- which = 0;
- }
- }
-
- return retval;
-}
-
-static status_t table_lib_entry( MWLib *lib, int idx, int verbose )
-{
- struct tm *t;
- char month_buff[4];
-
- ASSERT( lib != NULL );
-
- if( verbose ) {
- t = localtime( &(lib->files[idx].m_time) );
- if( t == NULL ) {
- fprintf( stderr, "localtime() failed, %s\n",
- strerror( errno ) );
- return B_OK;
- }
-
- if( strftime( month_buff, sizeof( month_buff ),
- "%b", t ) == 0 ) {
- /* TODO: error message */
- fprintf( stderr, "strftime() failed, %s\n",
- strerror( errno ) );
- return B_OK;
- }
-
- /* I wish POSIX allowed for a nicer format; even using tabs
- * between some entries would be better.
- */
- printf( "%s %u/%u %u %s %d %d:%d %d %s\n",
- "-rw-r--r--", /* simulated mode */
- getuid(), getgid(), /* simulated uid & gid */
- lib->files[idx].object_size,
- month_buff, /* abbreviated month */
- t->tm_mon, /* day of month */
- t->tm_hour, /* hour */
- t->tm_min, /* minute */
- t->tm_year, /* year */
- lib->names[idx] );
- } else {
- printf( "%s\n", lib->names[idx] );
- }
-
- return B_OK;
-}
-
-/* ----------------------------------------------------------------------
-** Extract one or more files from the archive.
-*/
-static status_t extract_lib_entry( MWLib *lib, int idx, int verbose );
-
-status_t do_extract( const char *archive_name, char **files, int verbose )
-{
- status_t retval = B_OK;
- MWLib lib;
- int idx = 0;
-
- ASSERT( archive_name != NULL );
-
- retval = load_MW_lib( &lib, archive_name );
- if( retval != B_OK ) {
- switch( retval ) {
- case B_FILE_NOT_FOUND:
- fprintf( stderr, "ar: %s, file not found\n", archive_name );
- return retval;
- break;
-
- default:
- return retval;
- break;
- }
- }
-
- if( files == NULL ) {
- /* Then we extract all the files.
- */
- for( idx = 0; idx < lib.header.num_objects; idx++ ) {
- retval = extract_lib_entry( &lib, idx, verbose );
- }
- } else {
- /* Then we extract the specified files.
- */
- int which = 0;
-
- for( idx = 0; files[idx] != NULL; idx++ ) {
- if( do_match( &lib, files[idx], &which ) ) {
- retval = extract_lib_entry( &lib, which, verbose );
- }
- which = 0;
- }
- }
-
- return retval;
-}
-
-static status_t extract_lib_entry( MWLib *lib, int idx, int verbose )
-{
- FILE *fp;
- int recs;
- status_t retval = B_OK;
- struct stat s;
- mode_t mode_bits = 0666; /* TODO: use user's umask() instead */
-
- ASSERT( lib != NULL );
-
- /* Delete the file if it already exists.
- */
- retval = access( lib->names[idx], F_OK );
- if( retval == 0 ) {
- retval = stat( lib->names[idx], &s );
- if( retval != 0 ) {
- fprintf( stderr, "ar: can't stat %s, %s\n", lib->names[idx],
- strerror( errno ) );
- } else {
- mode_bits = s.st_mode;
- }
- retval = unlink( lib->names[idx] );
- if( retval != 0 ) {
- fprintf( stderr, "ar: can't unlink %s, %s\n", lib->names[idx],
- strerror( retval ) );
- return B_OK;
- }
- }
-
- /* Write the file.
- */
- if( verbose ) {
- printf( "x - %s\n", lib->names[idx] );
- }
-
- fp = fopen( lib->names[idx], "w" );
- if( fp == NULL ) {
- fprintf( stderr, "ar: can't open %s for write, %s\n", lib->names[idx],
- strerror( errno ) );
- return B_OK;
- }
-
- recs = fwrite( lib->data[idx], lib->files[idx].object_size, 1, fp );
- if( recs != 1 ) {
- fprintf( stderr, "error writing %s, %s\n", lib->names[idx],
- strerror( errno ) );
- }
-
- retval = fclose( fp );
-
- /* Set the newly extracted file's modification time to the time
- ** stored in the archive.
- */
- retval = stat( lib->names[idx], &s );
- if( retval != 0 ) {
- fprintf( stderr, "ar: can't stat %s, %s\n", lib->names[idx],
- strerror( errno ) );
- } else {
- struct utimbuf new_times;
-
- new_times.actime = s.st_atime;
- new_times.modtime = lib->files[idx].m_time;
-
- retval = utime( lib->names[idx], &new_times );
- if( retval != 0 ) {
- fprintf( stderr, "ar: can't set modification time for %s, %s\n",
- lib->names[idx], strerror( retval ) );
- }
- }
-
- /* Set the newly extracted file's mode.
- */
- retval = chmod( lib->names[idx], mode_bits );
- if( retval != 0 ) {
- fprintf( stderr, "ar: unable to change file mode for %s, %s\n",
- lib->names[idx], strerror( errno ) );
- }
-
- /* Set the newly extracted file's type.
- */
- setfiletype( lib->names[idx], "application/x-mw-library" );
-
- return B_OK;
-}
diff --git a/BeOS/ar-1.1/commands.h b/BeOS/ar-1.1/commands.h
deleted file mode 100644
index e5c28c2..0000000
--- a/BeOS/ar-1.1/commands.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-** commands.h - POSIX 1003.2 "ar" command
-**
-** $Id$
-**
-** This isn't a pure POSIX 1003.2 ar; it only manipulates Metrowerks
-** Library files, not general-purpose POSIX 1003.2 format archives.
-**
-** Dec. 14, 1997 Chris Herborth (chrish@kagi.com)
-**
-** This code is donated to the PUBLIC DOMAIN. You can use, abuse, modify,
-** redistribute, steal, or otherwise manipulate this code. No restrictions
-** at all. If you laugh at this code, you can't use it.
-**
-** This "ar" was implemented using IEEE Std 1003.2-1992 as the basis for
-** the interface, and Metrowerk's published docs detailing their library
-** format. Look inside for clues about how reality differs from MW's
-** documentation on BeOS...
-*/
-
-#include <be/support/SupportDefs.h>
-
-status_t do_delete( const char *archive_name, char **files, int verbose );
-status_t do_print( const char *archive_name, char **files, int verbose );
-status_t do_replace( const char *archive_name, char **files, int verbose,
- int create, int update );
-status_t do_table( const char *archive_name, char **files, int verbose );
-status_t do_extract( const char *archive_name, char **files, int verobse );
diff --git a/BeOS/ar-1.1/copy_attrs.c b/BeOS/ar-1.1/copy_attrs.c
deleted file mode 100644
index c9f978d..0000000
--- a/BeOS/ar-1.1/copy_attrs.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
-** copy_attrs.h - copy BeFS attributes from one file to another
-**
-** Jan. 11, 1998 Chris Herborth (chrish@qnx.com)
-**
-** This code is donated to the PUBLIC DOMAIN. You can use, abuse, modify,
-** redistribute, steal, or otherwise manipulate this code. No restrictions
-** at all. If you laugh at this code, you can't use it.
-*/
-
-#include <support/Errors.h>
-#ifndef NO_DEBUG
-#include <assert.h>
-#define ASSERT(cond) assert(cond)
-#else
-#define ASSERT(cond) ((void)0)
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <limits.h>
-#include <string.h>
-#include <errno.h>
-#include <kernel/fs_attr.h>
-#include <fcntl.h>
-
-#include "copy_attrs.h"
-
-static const char *rcs_version_id = "$Id$";
-
-/* ----------------------------------------------------------------------
-** Copy file attributes from src_file to dst_file.
-*/
-
-status_t copy_attrs( const char *dst_file, const char *src_file )
-{
- int dst_fd, src_fd;
- status_t retval = B_OK;
- DIR *fa_dir = NULL;
- struct dirent *fa_ent = NULL;
- char *buff = NULL;
- struct attr_info fa_info;
- off_t read_bytes, wrote_bytes;
-
- ASSERT( dst_file != NULL );
- ASSERT( src_file != NULL );
-
- /* Attempt to open the files.
- */
- src_fd = open( src_file, O_RDONLY );
- if( src_fd < 0 ) {
- return B_FILE_NOT_FOUND;
- }
-
- dst_fd = open( dst_file, O_WRONLY );
- if( dst_fd < 0 ) {
- close( src_fd );
- return B_FILE_NOT_FOUND;
- }
-
- /* Read the attributes, and write them to the destination file.
- */
- fa_dir = fs_fopen_attr_dir( src_fd );
- if( fa_dir == NULL ) {
- retval = B_IO_ERROR;
- goto close_return;
- }
-
- fa_ent = fs_read_attr_dir( fa_dir );
- while( fa_ent != NULL ) {
- retval = fs_stat_attr( src_fd, fa_ent->d_name, &fa_info );
- if( retval != B_OK ) {
- /* TODO: Print warning message?
- */
- goto read_next_attr;
- }
-
- if( fa_info.size > (off_t)UINT_MAX ) {
- /* TODO: That's too big. Print a warning message? You could
- ** copy it in chunks...
- */
- goto read_next_attr;
- }
-
- if( fa_info.size > (off_t)0 ) {
- buff = malloc( (size_t)fa_info.size );
- if( buff == NULL ) {
- /* TODO: Can't allocate memory for this attribute. Warning?
- */
- goto read_next_attr;
- }
-
- read_bytes = fs_read_attr( src_fd, fa_ent->d_name, fa_info.type,
- 0, buff, fa_info.size );
- if( read_bytes != fa_info.size ) {
- /* TODO: Couldn't read entire attribute. Warning?
- */
- goto free_attr_buff;
- }
-
- wrote_bytes = fs_write_attr( dst_fd, fa_ent->d_name, fa_info.type,
- 0, buff, fa_info.size );
- if( wrote_bytes != fa_info.size ) {
- /* TODO: Couldn't write entire attribute. Warning?
- */
- ;
- }
-
- free_attr_buff:
- free( buff );
-
- retval = B_OK;
- }
-
- /* Read the next entry.
- */
- read_next_attr:
- fa_ent = fs_read_attr_dir( fa_dir );
- }
-
-close_return:
- close( dst_fd );
- close( src_fd );
-
- return retval;
-}
-
diff --git a/BeOS/ar-1.1/copy_attrs.h b/BeOS/ar-1.1/copy_attrs.h
deleted file mode 100644
index a761636..0000000
--- a/BeOS/ar-1.1/copy_attrs.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-** copy_attrs.h - copy BeFS attributes from one file to another
-**
-** $Id$
-**
-** Jan. 11, 1998 Chris Herborth (chrish@qnx.com)
-**
-** This code is donated to the PUBLIC DOMAIN. You can use, abuse, modify,
-** redistribute, steal, or otherwise manipulate this code. No restrictions
-** at all. If you laugh at this code, you can't use it.
-*/
-
-/* ----------------------------------------------------------------------
-** Function prototypes
-**
-** copy_attrs() - copy BeFS attributes from one file to another
-**
-** Returns:
-** B_OK - all is well
-** B_FILE_NOT_FOUND - can't open one of the named files
-** B_IO_ERROR - can't read/write some of the file attributes
-** B_NO_MEMORY - unable to allocate a buffer for the attribute data
-*/
-status_t copy_attrs( const char *dest_file, const char *src_file );
diff --git a/BeOS/ar-1.1/docs/ar.html b/BeOS/ar-1.1/docs/ar.html
deleted file mode 100644
index 50f002e..0000000
--- a/BeOS/ar-1.1/docs/ar.html
+++ /dev/null
@@ -1,234 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML3.2//EN">
-<!-- $Id$ -->
-<html> <head>
-<title>ar - create and maintain library archives</title>
-</head>
-
-<body bgcolor="#ffffcb">
-<h1>ar</h1>
-<h4 align="right">create and maintain library archives</h4>
-
-<h2>Synopsis</h2>
-
-<pre>
-ar [-][dprtx][cuv] <i>archive</i> [<i>file</i> ...]
-</pre>
-
-<h2>Options</h2>
-
-<table>
-<tr>
- <td valign="top"><b>-</b></td>
- <td valign="top">
- The <b>-</b> is optional for introducing <tt>ar</tt> command-line
- arguments; this is a POSIX requirement, and I've never seen anyone
- use it.</td>
-</tr>
-
-<tr>
- <td valign="top"><b>c</b></td>
- <td valign="top">
- Don't print a diagnostic message to <i>stderr</i> when
- <i>archive</i> is created.</td>
-</tr>
-
-<tr>
- <td valign="top"><b>d</b></td>
- <td valign="top">
- Delete <i>file(s)</i> from <i>archive</i>.</td>
-</tr>
-
-<tr>
- <td valign="top"><b>p</b></td>
- <td valign="top">
- Write the contents of the named <i>file(s)</i> to <i>stdout</i>.
- If no <i>file(s)</i> are specified, all of the files in
- <i>archive</i> are written in the order of the archive.</td>
-</tr>
-
-<tr>
- <td valign="top"><b>r</b></td>
- <td valign="top">
- Replace or add <i>file(s)</i> to the <i>archive</i>. This will
- create <i>archive</i> if it doesn't already exist.</td>
-</tr>
-
-<tr>
- <td valign="top"><b>t</b></td>
- <td valign="top">
- Write the table of contents of <i>archive</i> to <i>stdout</i>.
- If not <i>file(s)</i> are specified, list all of the files,
- otherwise only list the specified files.</td>
-</tr>
-
-<tr>
- <td valign="top"><b>u</b></td>
- <td valign="top">
- Update older files. When used with the <b>r</b> option, files
- within the archive are only replaced if <i>file</i> has a
- modification date at least as new as the <i>file</i> already in
- the archive.</td>
-</tr>
-
-<tr>
- <td valign="top"><b>v</b></td>
- <td valign="top">Give verbose output.</td>
-</tr>
-
-<tr>
- <td valign="top"><b>x</b></td>
- <td valign="top">
- Extract <i>file(s)</i> from the <i>archive</i>. If no
- <i>file(s)</i> are specified, all of the files in <i>archive</i>
- are extracted.</td>
-</tr>
-
-<tr>
- <td valign="top"><i>archive</i></td>
- <td valign="top">
- The pathname of an archive file.</td>
-</tr>
-
-<tr>
- <td valign="top"><i>file</i></td>
- <td valign="top">
- One more more pathnames of object files; only the file name is
- used when comparing against the names of files in the
- archive.</td>
-</tr>
-
-</table>
-
-<h2>Description</h2>
-
-<p>The <tt>ar</tt> utility creates and maintains groups of files
-combined into a library. Once a library has been created, you can
-add new files, and extract, delete, or replace existing files.</p>
-
-<h2>Exit status</h2>
-
-<p><tt>ar</tt> exits with one of the following values:</p>
-
-<table>
-<tr><td valign="top">0</td>
- <td valign="top">Successful completion.</td></tr>
-<tr><td valign="top">&gt; 0</td>
- <td>An error occurred.</td></tr>
-</table>
-
-<h2>Bugs</h2>
-
-<p>No known bugs, but <em>please</em> read the comments in the code if
-you want to use it in another application.</p>
-
-<h2>Comments</h2>
-
-<p>This is a POSIX 1003.2-1992 based <tt>ar</tt> command; it's not
-100% POSIX 1003.2 because POSIX specifies a file format for
-<tt>ar</tt> archives. The BeOS <tt>ar</tt> produces library files
-compatible (at least in theory <tt>:-)</tt>) with Metrowerks
-CodeWarrior for PowerPC.</p>
-
-<p>This <tt>ar</tt> and its source code were written as a service to
-the Be developer community, to make it easier for us to port UNIX
-applications and libraries. The code was written from scratch, after
-reverse-engineering the Metrowerks library and object file format
-(mostly because the library/object file format documentation was
-incorrect).</p>
-
-<p>If you find this useful, please
-<a href="mailto:chrish@kagi.com">let me know</a>, and tell me what
-you're working on. Be sure to include a URL for your homepage or your
-product homepages for my
-<a href="http://www.qnx.com/~chrish/Be/community/">Be Community</a>
-pages.</p>
-
-<p>If you find any bugs, please try to fix them, and send me a context
-diff (use <tt>diff -c original_file fixed_file</tt>) so I can include
-your fixes in the next update. I <i>have</i> tested this, but these
-things have a way of slipping though.</p>
-
-<p>If you'd like to know what other things I'm working on, take a look
-at my <a href="http://www.qnx.com/~chrish/Be/software/">Be
-Software</a> pages, and my
-<a href="http://www.qnx.com/~chrish/Be/">Be Happy!</a> pages.</p>
-
-<h2>License</h2>
-
-<p>This program binary and its source code have been donated to the
-BeOS Developer Community by Arcane Dragon Software free of charge.
-You can do whatever you want with it.</p>
-
-<p>If you <em>really</em> want to show your appreciation, you could
-always send me a gift of some sort; cool software you wrote, nice
-pictures for my desktop, ZIP drive disks, RAM, hard drives, post
-cards, a pointer to a really cool/useful/interesting web site,
-an MPEG audio file of an interesting band (make sure you can give me
-enough information to track down their CDs if I like it!), <i>etc.</i>
-Send me some <a href="mailto:chrish@kagi.com">email</a> and I'll let you
-know where to send it.</p>
-
-<p>But you don't have to do anything. Just write good BeOS software.
-But you're already doing that, right?</p>
-
-<h2>Disclaimer</h2>
-
-<p>You use this at your own risk. I've tried to ensure that the code
-is correct, but software usually has bugs. If <tt>ar</tt> destroys
-your valuable data, formats your hard drive, kicks your cat, and lets
-the air out of your tires, I'm not responsible for it. The code is
-here, so you should feel fairly safe that there's nothing evil going
-on.</p>
-
-<p>And, as I learned once again in December 1997, you really should
-keep backups of everything. I only lost a day's work, but it was
-still annoying, and it could've been much, much worse.</p>
-
-<h3>A word about the code</h3>
-
-<p>This code isn't meant to be the ultimate in efficiency or speed,
-it's intended to be fairly easy to understand and maintain
-(hopefully). I was also quite keen on having something that was
-correct, without jumping through a lot of unnecessary hoops.</p>
-
-<p>If you think this code sucks, don't use it. You're already applying
-this to your choice of operating system! <tt>:-)</tt></p>
-
-<h2>Versions</h2>
-
-<dl compact>
-
-<dt><strong>1.1 (April 18, 1998)</strong></dt>
-<dd>Changes include:
- <ul>
- <li>Extract option (<b>x</b>) will preserve a file's mode bits
- when overwriting an existing file (this may go away if it's
- not POSIX behaviour).</li>
-
- <li>Extracted files will now have the proper file type.</li>
-
- <li>Removed attempt to use <i>umask()</i> to set newly created
- archive's mode bits; apparently, I'm not sure how it
- works and my POSIX manual isn't helping.</li>
-
- <li>Should be 100% endian-neutral now; using this on BeOS for
- x86 is only useful if you're manipulating <em>PowerPC</em>
- objects though. The <tt>ar</tt> in
- <a href="http://www.ninemoons.com/GG/index.html">GeekGadgets</a>
- should work fine for x86 objects/libraries.</li>
-
- <li>Updated the <tt>README.txt</tt> file; now it's got useful
- information about building/using the POSIX ar.</li>
- </ul></dd>
-
-<dt><strong>1.0 (January 13, 1998)</strong></dt>
-<dd>Initial release.</dd>
-
-</dl>
-
-<hr>
-<p>Chris Herborth (<a href="mailto:chrish@qnx.com">chrish@qnx.com</a>)</p>
-<!-- hhmts start -->
-Last modified: $Date$
-<!-- hhmts end -->
-</body> </html>
diff --git a/BeOS/ar-1.1/docs/dumpar.py b/BeOS/ar-1.1/docs/dumpar.py
deleted file mode 100644
index 93e2283..0000000
--- a/BeOS/ar-1.1/docs/dumpar.py
+++ /dev/null
@@ -1,271 +0,0 @@
-#! /bin/env python
-""" Dump data about a Metrowerks archive file.
-
-$Id$
-
-Based on reverse-engineering the library file format.
-
-Copyright (C) 1997 Chris Herborth (chrish@qnx.com)
-"""
-
-# ----------------------------------------------------------------------
-# Standard modules
-import sys
-import getopt
-import string
-import time
-
-# ----------------------------------------------------------------------
-def usage():
- """ Display a usage message and exit.
- """
- print "dumpar [-v] library1 [library2 ... libraryn]"
- print
- print "Attempt to display some useful information about the contents"
- print "of the given Metrowerks library file(s)."
- print
- print "-v Be verbose (displays offsets along with the data)"
- raise SystemExit
-
-# ----------------------------------------------------------------------
-def mk_long( str ):
- """ convert a 4-byte string into a number
-
- Assumes big-endian!
- """
- if len( str ) < 4:
- raise ValueError, "str must be 4 bytes long"
-
- num = ord( str[3] )
- num = num + ord( str[2] ) * 0x100
- num = num + ord( str[1] ) * 0x10000
- num = num + ord( str[0] ) * 0x1000000
-
- return num
-
-# ----------------------------------------------------------------------
-def str2hex( str ):
- """ convert a string into a string of hex numbers
- """
- ret = []
- for c in str:
- h = hex( ord( c ) )
- ret.append( string.zfill( "%s" % ( h[2:] ), 2 ) )
-
- return string.join( ret )
-
-# ----------------------------------------------------------------------
-def print_offset( offset ):
- """ print the offset nicely
- """
-
- # Turn the offset into a hex number and strip off the leading "0x".
- val = "%s" % ( hex( offset ) )
- val = val[2:]
-
- out = "0x" + string.zfill( val, 8 )
-
- print out,
-
-# ----------------------------------------------------------------------
-def get_string( data ):
- """ dig a C string out of a data stream
-
- returns the string
- """
- len = 0
- while data[len] != '\0':
- len = len + 1
-
- return data[:len]
-
-# ----------------------------------------------------------------------
-def dump_lib( file, verbose ):
- """ dump information about a Metrowerks library file
- """
- offset = 0
-
- print "Dumping library:", file
-
- # Attempt to read the data.
- try:
- data = open( file ).read()
- except IOError, retval:
- print "*** Unable to open file %s: %s" % ( file, retval[1] )
- return
-
- # Check the magic number.
- if verbose:
- print_offset( offset )
- print "Magic:",
- magic = data[offset:offset + 8]
- print "'%s'" % ( magic )
- if magic != "MWOBPPC ":
- print "*** Invalid magic number!"
- return
-
- offset = offset + 8
-
- # File flags
- if verbose:
- print_offset( offset )
- print "file flags:",
- print mk_long( data[offset:offset + 4] )
- offset = offset + 4
-
- if verbose:
- print_offset( offset )
- print "file version:",
- print mk_long( data[offset:offset + 4] )
- offset = offset + 4
-
- # code size
- if verbose:
- print_offset( offset )
- print "code size:", mk_long( data[offset:offset + 4] )
- offset = offset + 4
-
- # data size
- if verbose:
- print_offset( offset )
- print "data size:", mk_long( data[offset:offset + 4] )
- offset = offset + 4
-
- # number of objects
- if verbose:
- print_offset( offset )
- print "number of objects:",
- num_objs = mk_long( data[offset:offset + 4] )
- print num_objs
-
- offset = offset + 4
-
- print
-
- # Now loop through the objects.
- obj_sizes = [ 0, ] * num_objs
- obj_data_offsets = [ 0, ] * num_objs
-
- for obj in range( num_objs ):
- # Magic?
- if verbose:
- print_offset( offset )
- print "modification time:",
- modtime = mk_long( data[offset:offset + 4] )
- print "[%s]" % ( ( time.localtime( modtime ), ) )
-
- offset = offset + 4
-
- # Offsets?
- if verbose:
- print_offset( offset )
- print "file name offset 1:",
- file_offset1 = mk_long( data[offset:offset + 4] )
- unknown = "%s" % ( hex( file_offset1 ) )
- print "%s (%s)" % ( unknown, str2hex( data[offset:offset + 4] ) )
-
- offset = offset + 4
-
- if verbose:
- print_offset( offset )
- print "file name offset 2:",
- file_offset2 = mk_long( data[offset:offset + 4] )
- unknown = "%s" % ( hex( file_offset2 ) )
- print "%s (%s)" % ( unknown, str2hex( data[offset:offset + 4] ) )
-
- offset = offset + 4
-
- # Extra -1 for NUL character.
- print " >>>> File name should be %s characters." % \
- ( file_offset2 - file_offset1 - 1)
-
- if verbose:
- print_offset( offset )
- print "object data offset:",
- file_data_offset = mk_long( data[offset:offset + 4] )
- unknown = "%s" % ( hex( file_data_offset ) )
- print "%s (%s)" % ( unknown, str2hex( data[offset:offset + 4] ) )
-
- obj_data_offsets[obj] = file_data_offset
-
- offset = offset + 4
-
- # object size
- if verbose:
- print_offset( offset )
- print "object size:",
- obj_sizes[obj] = mk_long( data[offset:offset + 4] )
- print "%s bytes" % ( obj_sizes[obj] )
-
- offset = offset + 4
-
- print
-
- # Now loop through the object names.
- for obj in range( num_objs ):
- # First name
- if verbose:
- print_offset( offset )
- print "object",
- print obj,
- print "name 1:",
- name1 = get_string( data[offset:] )
- print "[%s] %s chars" % ( name1, len( name1 ) )
-
- offset = offset + len( name1 ) + 1
-
- # Second name
- if verbose:
- print_offset( offset )
- print "object",
- print obj,
- print "name 2:",
- name2 = get_string( data[offset:] )
- print "[%s] %s chars" % ( name2, len( name1 ) )
-
- offset = offset + len( name2 ) + 1
-
- # See if we've got a magic cookie in the object data
- if verbose:
- print_offset( obj_data_offsets[obj] )
-
- cookie = data[obj_data_offsets[obj]:obj_data_offsets[obj] + 8]
- print "object",
- print obj,
- print "cookie: '%s'" % ( cookie )
-
- print
-
- # Now loop through the data and check for magic numbers there.
- return
-
-# ----------------------------------------------------------------------
-def main():
- """ mainline
- """
-
- # Set up some defaults
- be_verbose = 0
-
- # First, check the command-line arguments
- try:
- opt, args = getopt.getopt( sys.argv[1:], "vh?" )
- except getopt.error:
- print "*** Error parsing command-line options!"
- usage()
-
- for o in opt:
- if o[0] == "-h" or o[0] == "-?":
- usage()
- elif o[0] == "-v":
- be_verbose = 1
- else:
- print "*** Unknown command-line option!"
- usage()
-
- # Now we can attempt to dump info about the arguments.
- for lib in args:
- dump_lib( lib, be_verbose )
-
-if __name__ == "__main__":
- main()
diff --git a/BeOS/ar-1.1/docs/dumpo.py b/BeOS/ar-1.1/docs/dumpo.py
deleted file mode 100644
index 91bd8db..0000000
--- a/BeOS/ar-1.1/docs/dumpo.py
+++ /dev/null
@@ -1,126 +0,0 @@
-#! /bin/env python
-""" Dump data about a Metrowerks object file.
-
-Based on reverse-engineering the library file format, since the docs are
-wrong.
-
-Copyright (C) 1997 Chris Herborth (chrish@qnx.com)
-"""
-
-# ----------------------------------------------------------------------
-# Standard modules
-import sys, getopt, string, time
-
-# ----------------------------------------------------------------------
-# Extra goodies
-from dumpar import mk_long, str2hex, print_offset, get_string
-
-# ----------------------------------------------------------------------
-def mk_short( str ):
- """ convert a 2-byte string into a number
-
- Assumes big-endian!
- """
- if len( str ) < 2:
- raise ValueError, "str must be 2 bytes long"
-
- num = ord( str[1] )
- num = num + ord( str[0] ) * 0x100
-
- return num
-
-# ----------------------------------------------------------------------
-def usage():
- """ Display a usage message and exit.
- """
- print "dumpo [-v] object1 [object2 ... objectn]"
- print
- print "Attempt to display some useful information about the contents"
- print "of the given Metrowerks object file(s)."
- print
- print "-v Be verbose (displays offsets along with the data)"
- raise SystemExit
-
-# ----------------------------------------------------------------------
-def dump_o( file, verbose ):
- """ dump information about a Metrowerks object file
-
- Note that there is more info there, 6 more quads before the file name.
- """
- offset = 0
-
- print "Dumping object:", file
-
- # Attempt to read the data.
- try:
- data = open( file ).read()
- except IOError, retval:
- print "*** Unable to open file %s: %s" % ( file, retval[1] )
- return
-
- # Check the magic number.
- if verbose:
- print_offset( offset )
- print "Magic:",
- magic = data[offset:offset + 8]
- print "'%s'" % ( magic )
- if magic != "MWOBPPC ":
- print "*** Invalid magic number!"
- return
-
- offset = offset + 8
-
- # version
- if verbose:
- print_offset( offset )
- print "version:", mk_long( data[offset:offset + 4] )
- offset = offset + 4
-
- # flags
- if verbose:
- print_offset( offset )
- print "flags:", str2hex( data[offset:offset + 4] )
- offset = offset + 4
-
- # code size
- if verbose:
- print_offset( offset )
- print "code size:", mk_long( data[offset:offset + 4] )
- offset = offset + 4
-
- # data size
- if verbose:
- print_offset( offset )
- print "data size:", mk_long( data[offset:offset + 4] )
- offset = offset + 4
-
-# ----------------------------------------------------------------------
-def main():
- """ mainline
- """
-
- # Set up some defaults
- be_verbose = 0
-
- # First, check the command-line arguments
- try:
- opt, args = getopt.getopt( sys.argv[1:], "vh?" )
- except getopt.error:
- print "*** Error parsing command-line options!"
- usage()
-
- for o in opt:
- if o[0] == "-h" or o[0] == "-?":
- usage()
- elif o[0] == "-v":
- be_verbose = 1
- else:
- print "*** Unknown command-line option!"
- usage()
-
- # Now we can attempt to dump info about the arguments.
- for obj in args:
- dump_o( obj, be_verbose )
-
-if __name__ == "__main__":
- main()
diff --git a/BeOS/ar-1.1/docs/notes b/BeOS/ar-1.1/docs/notes
deleted file mode 100644
index 4a90a16..0000000
--- a/BeOS/ar-1.1/docs/notes
+++ /dev/null
@@ -1,34 +0,0 @@
-MW library layout:
-
-header
- magic word, magic processor flag ('MWOBPPC ') - 2x 4 bytes
- magic flags, version (file format version?) - 2x 4 bytes
- code size - 4 bytes
- data size - 4 bytes
- # of objects - 4 bytes
-
- header for file 1 - 20 bytes
- - modification time - 4 bytes
- - offset to filename - 4 bytes
- - offset to full path - 4 bytes (NOTE: NOT a full path in reality!)
- - offset to object data - 4 bytes
- - size of object data - 4 bytes
-
- ...
-
- header for file n - 20 bytes
-
- file 1 name + NUL - variable
- file 1 name + NUL - variable
- file 2 name + NUL - variable
- file 2 name + NUL - variable
- ...
- file n name + NUL - variable
- file n name + NUL - variable
-
- padding to multiple of 4 bytes - 0 - 3 bytes
-
-file 1 data - variable (padded to 4-byte boundary)
-file 2 data - variable (padded to 4-byte boundary)
-...
-file n data - variable (padded to 4-byte boundary)
diff --git a/BeOS/ar-1.1/main.c b/BeOS/ar-1.1/main.c
deleted file mode 100644
index 225ee62..0000000
--- a/BeOS/ar-1.1/main.c
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
-** main.c - POSIX 1003.2 "ar" command
-**
-** This isn't a pure POSIX 1003.2 ar; it only manipulates Metrowerks
-** Library files, not general-purpose POSIX 1003.2 format archives.
-**
-** Dec. 14, 1997 Chris Herborth (chrish@kagi.com)
-**
-** This code is donated to the PUBLIC DOMAIN. You can use, abuse, modify,
-** redistribute, steal, or otherwise manipulate this code. No restrictions
-** at all. If you laugh at this code, you can't use it.
-**
-** This "ar" was implemented using IEEE Std 1003.2-1992 as the basis for
-** the interface, and Metrowerk's published docs detailing their library
-** format. Look inside for clues about how reality differs from MW's
-** documentation on BeOS...
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <getopt.h>
-
-#include "commands.h"
-
-static const char *rcs_version_id = "$Id$";
-static const char *ar_version_id = "1.0 " __DATE__;
-
-/* ---------------------------------------------------------------------- */
-typedef enum {
- delete_cmd,
- print_cmd,
- replace_cmd,
- table_cmd,
- extract_cmd,
- no_cmd = -1 } command;
-
-/* ----------------------------------------------------------------------
-** Prototypes
-*/
-void usage( void );
-void version( void );
-void check_command( command *cmd, int arg );
-
-/* ----------------------------------------------------------------------
-** Print a usage message and exit.
-*/
-void usage( void )
-{
- printf( "ar [dprtx][cuv] archive [file ...]\n" );
-
- exit( EXIT_FAILURE );
-}
-
-/* ----------------------------------------------------------------------
-** Print a version message and exit.
-*/
-void version( void )
-{
- printf( "ar (POSIX 1003.2-1992), version %s\n", ar_version_id );
- printf( "by Chris Herborth (chrish@qnx.com)\n" );
- printf( "This code has been donated to the BeOS developer community.\n" );
-
- return;
-}
-
-/* ----------------------------------------------------------------------
-** Set *cmd to the appropriate command enum if it isn't already set.
-*/
-void check_command( command *cmd, int arg )
-{
- if( *cmd == no_cmd ) {
- switch( arg ) {
- case 'd':
- *cmd = delete_cmd;
- break;
- case 'p':
- *cmd = print_cmd;
- break;
- case 'r':
- *cmd = replace_cmd;
- break;
- case 't':
- *cmd = table_cmd;
- break;
- case 'x':
- *cmd = extract_cmd;
- break;
- }
- } else {
- printf( "ar: you can only specify one command at a time\n" );
- usage();
- }
-}
-
-/* ----------------------------------------------------------------------
-** Mainline
-*/
-int main( int argc, char **argv )
-{
- command cmd = no_cmd;
- int verbose_flag = 0;
- int create_flag = 0; /* these two only apply to replace_cmd */
- int update_flag = 0;
- int c = 0;
-
- char *archive_name;
- char **files_list;
- int num_files;
-
- int idx;
- status_t retval;
-
- /* The argument parsing is a little hairier than usual; the idea is
- ** to support the POSIX 1003.2 style of arguments, and the much more
- ** common traditional argument style.
- */
- if( argc < 3 ) {
- printf( "ar: invalid number of arguments\n" );
- usage();
- }
-
- /* Do we have traditional or POSIX-style args? */
- if( argv[1][0] == '-' ) {
- while( ( c = getopt( argc, argv, "dprtxcuvV" ) ) != EOF ) {
- switch( c ) {
- case 'd': /* fall-through */
- case 'p': /* fall-through */
- case 'r': /* fall-through */
- case 't': /* fall-through */
- case 'x': /* fall-through */
- check_command( &cmd, c );
- break;
-
- case 'v':
- verbose_flag = 1;
- break;
-
- case 'c':
- if( cmd != no_cmd && cmd != replace_cmd ) {
- printf( "ar: invalid option, -c\n" );
- usage();
- } else {
- create_flag = 1;
- }
- break;
-
- case 'u':
- if( cmd != no_cmd && cmd != replace_cmd ) {
- printf( "ar: invalid option, -u\n" );
- usage();
- } else {
- update_flag = 1;
- }
- break;
-
- case 'V':
- version();
- break;
-
- default:
- printf( "ar: invalid option, -%c\n", c );
- usage();
- break;
- }
-
- idx = optind;
- }
- } else {
- /* In the traditional way, arguments ar:
- **
- ** argv[1] = [dprtx][cuv]
- ** argv[2] = archive
- ** argv[...] = file ...
- **/
- char *ptr;
-
- idx = 1;
-
- ptr = argv[idx++];
-
- while( *ptr != '\0' ) {
- switch( *ptr ) {
- case 'd': /* fall-through */
- case 'p': /* fall-through */
- case 'r': /* fall-through */
- case 't': /* fall-through */
- case 'x': /* fall-through */
- check_command( &cmd, *ptr );
- break;
-
- case 'v':
- verbose_flag = 1;
- break;
-
- case 'c':
- if( cmd != no_cmd && cmd != replace_cmd ) {
- printf( "ar: invalid option, -c\n" );
- usage();
- } else {
- create_flag = 1;
- }
- break;
-
- case 'u':
- if( cmd != no_cmd && cmd != replace_cmd ) {
- printf( "ar: invalid option, -u\n" );
- usage();
- } else {
- update_flag = 1;
- }
- break;
-
- case 'V':
- version();
- break;
-
- default:
- printf( "ar: invalid option, -%c\n", c );
- usage();
- break;
- }
-
- ptr++;
- }
- }
-
- /* Next arg is the archive. */
- archive_name = argv[idx++];
-
- /* Next are the files. */
- num_files = argc - idx;
-
- if( num_files == 0 ) {
- files_list = NULL;
- } else {
- int ctr = 0;
-
- files_list = (char **)malloc( ( num_files + 1 ) * sizeof( char * ) );
-
- while( idx < argc ) {
- files_list[ctr++] = argv[idx++];
- }
-
- files_list[idx] = NULL;
- }
-
- /* Now we can attempt to manipulate the archive. */
- switch( cmd ) {
- case delete_cmd:
- retval = do_delete( archive_name, files_list, verbose_flag );
- break;
-
- case print_cmd:
- retval = do_print( archive_name, files_list, verbose_flag );
- break;
-
- case replace_cmd:
- retval = do_replace( archive_name, files_list, verbose_flag,
- create_flag, update_flag );
- break;
-
- case table_cmd:
- retval = do_table( archive_name, files_list, verbose_flag );
- break;
-
- case extract_cmd:
- retval = do_extract( archive_name, files_list, verbose_flag );
- break;
-
- default:
- printf( "ar: you must specify a command\n" );
- usage();
- break;
- }
-
- /* Check the return value.
- */
- switch( retval ) {
- case B_OK:
- break;
- case B_FILE_NOT_FOUND:
- printf( "can't open the file %s\n", archive_name );
- return EXIT_FAILURE;
- break;
- case B_IO_ERROR:
- printf( "can't read from %s\n", archive_name );
- return EXIT_FAILURE;
- break;
- case B_BAD_VALUE:
- printf( "invalid magic word\n" );
- return EXIT_FAILURE;
- break;
- case B_MISMATCHED_VALUES:
- printf( "invalid processor value, or magicflags, or version\n" );
- return EXIT_FAILURE;
- break;
- case B_NO_MEMORY:
- printf( "unable to allocate memory\n" );
- return EXIT_FAILURE;
- break;
- case B_ERROR:
- printf( "error during processing\n" );
- return EXIT_FAILURE;
- default:
- printf( "unknown error: %ld\n", retval );
- return EXIT_FAILURE;
- break;
- }
-
- return EXIT_SUCCESS;
-}
diff --git a/BeOS/ar-1.1/mwlib.c b/BeOS/ar-1.1/mwlib.c
deleted file mode 100644
index f3b8660..0000000
--- a/BeOS/ar-1.1/mwlib.c
+++ /dev/null
@@ -1,711 +0,0 @@
-/*
-** mwlib.c - POSIX 1003.2 "ar" command
-**
-** This isn't a pure POSIX 1003.2 ar; it only manipulates Metrowerks
-** Library files, not general-purpose POSIX 1003.2 format archives.
-**
-** Dec. 14, 1997 Chris Herborth (chrish@kagi.com)
-**
-** This code is donated to the PUBLIC DOMAIN. You can use, abuse, modify,
-** redistribute, steal, or otherwise manipulate this code. No restrictions
-** at all. If you laugh at this code, you can't use it.
-**
-** This "ar" was implemented using IEEE Std 1003.2-1992 as the basis for
-** the interface, and Metrowerk's published docs detailing their library
-** format. Look inside for clues about how reality differs from MW's
-** documentation on BeOS...
-*/
-
-#include <support/Errors.h>
-#include <support/byteorder.h>
-#ifndef NO_DEBUG
-#include <assert.h>
-#define ASSERT(cond) assert(cond)
-#else
-#define ASSERT(cond) ((void)0)
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <limits.h>
-#include <string.h>
-#include <errno.h>
-#include <kernel/fs_attr.h>
-#include <fcntl.h> /* is open() really here?!? sheesh... */
-#include <storage/Mime.h>
-#include <sys/stat.h>
-
-#include "mwlib.h"
-#include "copy_attrs.h"
-
-static const char *rcs_version_id = "$Id$";
-
-/* ----------------------------------------------------------------------
-** Local prototypes
-*/
-static status_t load_MWLibFile( FILE *file, MWLibFile *libfile );
-static size_t fwrite_big32( uint32 x, FILE *fp );
-static size_t fwrite_big32_seek( uint32 x, long offset, FILE *fp );
-static status_t add_object_sizes( MWObject *obj, uint32 *code, uint32 *data );
-
-/* ----------------------------------------------------------------------
-** Load a Metrowerks library file into the given MWLib object.
-**
-** Returns:
-** B_OK - all is well
-** B_FILE_NOT_FOUND - can't open the given file
-** B_IO_ERROR - can't read from the given file
-** B_BAD_VALUE - invalid magic word in the file
-** B_MISMATCHED_VALUES - invalid processor value (ie, not a PowerPC lib),
-** or the magicflags member is not 0, or the file
-** version number isn't 1.
-** B_NO_MEMORY - unable to allocate memory while loading the lib
-*/
-status_t load_MW_lib( MWLib *lib, const char *filename )
-{
- FILE *fp = NULL;
- size_t recs = 0;
- status_t retval = B_OK;
- uint32 tmp32 = 0;
- uint32 idx = 0;
- char obj_name[PATH_MAX];
-
- ASSERT( lib != NULL );
- ASSERT( filename != NULL );
-
- fp = fopen( filename, "r" );
- if( !fp ) {
- return B_FILE_NOT_FOUND;
- }
-
- /* Read and check the magic number.
- */
- recs = fread( &tmp32, sizeof( uint32 ), 1, fp );
- lib->header.magicword = B_BENDIAN_TO_HOST_INT32( tmp32 );
- if( recs != 1 ) {
- retval = B_IO_ERROR;
- goto close_return;
- } else if( lib->header.magicword != MWLIB_MAGIC_WORD ) {
- retval = B_BAD_VALUE;
- goto close_return;
- }
-
- /* Read and check the processor.
- */
- recs = fread( &tmp32, sizeof( uint32 ), 1, fp );
- lib->header.magicproc = B_BENDIAN_TO_HOST_INT32( tmp32 );
- if( recs != 1 ) {
- retval = B_IO_ERROR;
- goto close_return;
- } else if( lib->header.magicproc != MWLIB_MAGIC_PROC ) {
- retval = B_MISMATCHED_VALUES;
- goto close_return;
- }
-
- /* Read and check the flags.
- */
- recs = fread( &tmp32, sizeof( uint32 ), 1, fp );
- lib->header.magicflags = B_BENDIAN_TO_HOST_INT32( tmp32 );
- if( recs != 1 ) {
- retval = B_IO_ERROR;
- goto close_return;
- } else if( lib->header.magicflags != 0 ) {
- retval = B_MISMATCHED_VALUES;
- goto close_return;
- }
-
- /* Read and check the file version.
- */
- recs = fread( &tmp32, sizeof( uint32 ), 1, fp );
- lib->header.version = B_BENDIAN_TO_HOST_INT32( tmp32 );
- if( recs != 1 ) {
- retval = B_IO_ERROR;
- goto close_return;
- } else if( lib->header.version != 1 ) {
- retval = B_MISMATCHED_VALUES;
- goto close_return;
- }
-
- /* Read the code size, data size, and number of objects.
- */
- recs = fread( &tmp32, sizeof( uint32 ), 1, fp );
- lib->header.code_size = B_BENDIAN_TO_HOST_INT32( tmp32 );
- if( recs != 1 ) {
- retval = B_IO_ERROR;
- goto close_return;
- }
-
- recs = fread( &tmp32, sizeof( uint32 ), 1, fp );
- lib->header.data_size = B_BENDIAN_TO_HOST_INT32( tmp32 );
- if( recs != 1 ) {
- retval = B_IO_ERROR;
- goto close_return;
- }
-
- recs = fread( &tmp32, sizeof( uint32 ), 1, fp );
- lib->header.num_objects = B_BENDIAN_TO_HOST_INT32( tmp32 );
- if( recs != 1 ) {
- retval = B_IO_ERROR;
- goto close_return;
- }
-
- /* Load the MWLibFile objects from the lib.
- */
- lib->files = (MWLibFile *)malloc( lib->header.num_objects * sizeof( MWLibFile ) );
- if( lib->files == NULL ) {
- retval = B_NO_MEMORY;
- goto close_return;
- }
-
- for( idx = 0; idx < lib->header.num_objects; idx++ ) {
- retval = load_MWLibFile( fp, &(lib->files[idx]) );
- if( retval != B_OK ) {
- goto close_return;
- }
- }
-
- /* Load the file names and object data.
- **
- ** The file name actually appears twice in the library file; according
- ** to the docs, one is the file name, the other is the "full path name".
- ** In all of the libraries on my system, they're the same.
- */
- lib->names = (char **)malloc( lib->header.num_objects * sizeof( char * ) );
- lib->data = (char **)malloc( lib->header.num_objects * sizeof( char * ) );
- if( lib->names == NULL || lib->data == NULL ) {
- retval = B_NO_MEMORY;
- goto close_return;
- }
-
- for( idx = 0; idx < lib->header.num_objects; idx ++ ) {
- /* Load the name and copy it into the right spot.
- */
- retval = fseek( fp, lib->files[idx].off_filename, SEEK_SET );
- if( retval ) {
- retval = B_IO_ERROR;
- goto close_return;
- }
-
- if( fgets( obj_name, PATH_MAX, fp ) == NULL ) {
- retval = B_IO_ERROR;
- goto close_return;
- }
-
- lib->names[idx] = strdup( obj_name );
- if( lib->names[idx] == NULL ) {
- retval = B_NO_MEMORY;
- goto close_return;
- }
-
- /* Load the object data.
- */
- lib->data[idx] = (char *)malloc( lib->files[idx].object_size );
- if( lib->data[idx] == NULL ) {
- retval = B_NO_MEMORY;
- goto close_return;
- }
-
- retval = fseek( fp, lib->files[idx].off_object, SEEK_SET );
- if( retval ) {
- retval = B_IO_ERROR;
- goto close_return;
- }
-
- recs = fread( lib->data[idx], lib->files[idx].object_size, 1, fp );
- if( recs != 1 ) {
- retval = B_IO_ERROR;
- goto close_return;
- }
- }
-
-close_return:
- fclose( fp );
- return retval;
-}
-
-/* ----------------------------------------------------------------------
-** Load the file header from a Metrowerks library file.
-**
-** Returns:
-** B_OK - All is well
-** B_IO_ERROR - Error reading the file
-*/
-static status_t load_MWLibFile( FILE *file, MWLibFile *libfile )
-{
- size_t recs = 0;
- uint32 tmp32 = 0;
-
- ASSERT( file != NULL );
- ASSERT( libfile != NULL );
-
- /* Load the modification time.
- */
- recs = fread( &tmp32, sizeof( uint32 ), 1, file );
- libfile->m_time = (time_t)B_BENDIAN_TO_HOST_INT32( tmp32 );
- if( recs != 1 ) {
- return B_IO_ERROR;
- }
-
- /* Load the various offsets.
- */
- recs = fread( &tmp32, sizeof( uint32 ), 1, file );
- libfile->off_filename = B_BENDIAN_TO_HOST_INT32( tmp32 );
- if( recs != 1 ) {
- return B_IO_ERROR;
- }
-
- recs = fread( &tmp32, sizeof( uint32 ), 1, file );
- libfile->off_fullpath = B_BENDIAN_TO_HOST_INT32( tmp32 );
- if( recs != 1 ) {
- return B_IO_ERROR;
- }
-
- recs = fread( &tmp32, sizeof( uint32 ), 1, file );
- libfile->off_object = B_BENDIAN_TO_HOST_INT32( tmp32 );
- if( recs != 1 ) {
- return B_IO_ERROR;
- }
-
- /* Load the object size.
- */
- recs = fread( &tmp32, sizeof( uint32 ), 1, file );
- libfile->object_size = B_BENDIAN_TO_HOST_INT32( tmp32 );
- if( recs != 1 ) {
- return B_IO_ERROR;
- }
-
- return B_OK;
-}
-
-/* ----------------------------------------------------------------------
-** Write a Metrowerks library file.
-**
-** Returns:
-** B_OK - all is well; doesn't necessarily mean the file was written
-** properly, just that you didn't lose any data
-** B_NO_MEMORY - unable to allocate offset buffers
-** B_ERROR - problem with backup file (can't rename existing file)
-**
-** Note:
-** If you use this in a long-lived program, it leaks memory; the MWLib
-** contents are never free()'d.
-**
-** Two-pass technique:
-**
-** pass 1 - write file header (need CODE SIZE and DATA SIZE)
-** write object headers (need offsets for FILENAME, FULL PATH, DATA)
-** write filenames (store offsets for object headers)
-** write padding (file size % 4 bytes)
-** write file data (store offset for object header; add to code/data
-** size for file header; pad data size % 4 bytes)
-**
-** pass 2 - fill in file header CODE SIZE and DATA SIZE
-** fill in object headers FILENAME, FULL PATH, DATA
-**
-** You could avoid this by building up the file headers in memory, but this is
-** easier (?) and I'm not that concerned with speed...
-**
-*/
-
-typedef struct file_header_offsets {
- long codesize_offset;
- long datasize_offset;
-} file_header_offsets;
-
-typedef struct obj_header_offsets {
- long filename_offset;
- uint32 filename_offset_value;
-
- long fullpath_offset;
- uint32 fullpath_offset_value;
-
- long data_offset;
- uint32 data_offset_value;
-} obj_header_offsets;
-
-static size_t fwrite_big32( uint32 x, FILE *fp )
-{
- uint32 tmp32 = B_HOST_TO_BENDIAN_INT32( x );
-
- ASSERT( fp != NULL );
-
- return fwrite( &tmp32, sizeof(tmp32), 1, fp );
-}
-
-static size_t fwrite_big32_seek( uint32 x, long offset, FILE *fp )
-{
- uint32 tmp32 = B_HOST_TO_BENDIAN_INT32( x );
-
- ASSERT( fp != NULL );
-
- if( fseek( fp, offset, SEEK_SET ) ) {
- return 0;
- }
-
- return fwrite( &tmp32, sizeof(tmp32), 1, fp );
-}
-
-static status_t add_object_sizes( MWObject *obj, uint32 *code, uint32 *data )
-{
- ASSERT( obj != NULL );
- ASSERT( code != NULL );
- ASSERT( data != NULL );
-
- if( B_BENDIAN_TO_HOST_INT32( obj->magic_word ) != 'MWOB' ||
- B_BENDIAN_TO_HOST_INT32( obj->arch ) != 'PPC ' ) {
- return B_ERROR;
- }
-
- *code += B_BENDIAN_TO_HOST_INT32( obj->code_size );
- *data += B_BENDIAN_TO_HOST_INT32( obj->data_size );
-
- return B_OK;
-}
-
-void setfiletype( const char *file, const char *type )
-{
- int fd;
- attr_info fa;
- ssize_t wrote_bytes;
-
- fd = open( file, O_RDWR );
- if( fd < 0 ) {
- fprintf( stderr, "ar: can't open %s to write file type, %s",
- file, strerror( errno ) );
- return;
- }
-
- fa.type = B_MIME_STRING_TYPE;
- fa.size = (off_t)(strlen( type ) + 1);
-
- wrote_bytes = fs_write_attr( fd, "BEOS:TYPE", fa.type, 0,
- type, fa.size );
- if( wrote_bytes != (ssize_t)fa.size ) {
- fprintf( stderr, "ar: couldn't write complete file type, %s",
- strerror( errno ) );
- }
-
- close( fd );
-}
-
-status_t write_MW_lib( MWLib *lib, const char *filename )
-{
- char *padding = "\0\0\0\0";
- long pad_amount;
-
- file_header_offsets head_offs;
- obj_header_offsets *obj_offs;
- uint32 codesize = 0;
- uint32 datasize = 0;
- uint32 num_objects = 0;
-
- FILE *fp;
- char *tmp_filename = NULL;
- uint32 idx = 0;
- size_t recs;
- status_t retval;
-
- mode_t mode_bits = 0666;
-
- ASSERT( lib != NULL );
- ASSERT( filename != NULL );
-
-#if 0
-/* Apparently, I don't understand umask()... */
-
- /* Find the default file creation mask. The semantics of umask() suck.
- */
- mode_bits = umask( (mode_t)0 );
- (void)umask( mode_bits );
-#endif
-
- /* Easier access to the number of objects.
- */
- num_objects = lib->header.num_objects;
-
- /* Allocate some storage for keeping track of the things we need to
- ** write out in the second pass.
- */
- head_offs.codesize_offset = 0;
- head_offs.datasize_offset = 0;
-
- obj_offs = (obj_header_offsets *)malloc( sizeof(obj_header_offsets) *
- num_objects );
- if( obj_offs == NULL ) {
- fprintf( stderr, "ar: can't allocate memory for writing file\n" );
-
- return B_NO_MEMORY;
- }
- memset( obj_offs, 0, sizeof(obj_header_offsets) * num_objects );
-
- /* If the file exists, move it somewhere so we can recover if there's
- ** an error.
- */
- retval = access( filename, F_OK );
- if( retval == 0 ) {
- struct stat s;
-
- /* Preserve the mode bits.
- */
- retval = stat( filename, &s );
- if( retval != 0 ) {
- fprintf( stderr, "ar: can't stat %s, %s\n", filename,
- strerror( errno ) );
- } else {
- mode_bits = s.st_mode;
- }
-
- tmp_filename = (char *)malloc( strlen( filename ) + 2 );
- if( tmp_filename == NULL ) {
- fprintf( stderr,
- "ar: can't allocate memory for temporary filename\n" );
- } else {
- sprintf( tmp_filename, "%s~", filename );
-
- retval = access( tmp_filename, F_OK );
- if( retval == 0 ) {
- retval = unlink( tmp_filename );
- if( retval != 0 ) {
- fprintf( stderr, "ar: can't unlink %s, %s\n", tmp_filename,
- strerror( errno ) );
-
- free( tmp_filename );
- tmp_filename = NULL;
- }
- }
-
- if( tmp_filename ) {
- retval = rename( filename, tmp_filename );
- if( retval != 0 ) {
- fprintf( stderr, "ar: can't move %s to backup, %s\n",
- filename, strerror( errno ) );
-
- return B_ERROR;
- }
- }
- }
- }
-
- /* Attempt to open the archive file.
- */
- fp = fopen( filename, "w" );
- if( fp == NULL ) {
- fprintf( stderr, "ar: can't open %s for write, %s\n", filename,
- strerror( errno ) );
- goto error_return;
- }
-
- /* ----------------------------------------------------------------------
- ** Write the file. Pass 1.
- */
- recs = fwrite_big32( lib->header.magicword, fp );
- recs += fwrite_big32( lib->header.magicproc, fp );
- recs += fwrite_big32( lib->header.magicflags, fp );
- recs += fwrite_big32( lib->header.version, fp );
- if( recs != 4 ) {
- fprintf( stderr, "ar: error writing header for %s, %s\n", filename,
- strerror( errno ) );
- goto error_return;
- }
-
- /* Keep track of the code/data size offsets.
- */
- head_offs.codesize_offset = ftell( fp );
- recs = fwrite_big32( codesize, fp );
- head_offs.datasize_offset = ftell( fp );
- recs += fwrite_big32( datasize, fp );
- if( recs != 2 ) {
- fprintf( stderr, "ar: error writing header for %s, %s\n", filename,
- strerror( errno ) );
- goto error_return;
- }
-
- recs = fwrite_big32( num_objects, fp );
- if( recs != 1 ) {
- fprintf( stderr, "ar: error writing header for %s, %s\n", filename,
- strerror( errno ) );
- goto error_return;
- }
-
- /* Write the object headers.
- */
- for( idx = 0; idx < num_objects; idx++ ) {
- recs = fwrite_big32( lib->files[idx].m_time, fp );
-
- /* Keep track of the offsets, and write 0 for now.
- */
- obj_offs[idx].filename_offset = ftell( fp );
- recs += fwrite_big32( 0, fp );
- obj_offs[idx].fullpath_offset = ftell( fp );
- recs += fwrite_big32( 0, fp );
- obj_offs[idx].data_offset = ftell( fp );
- recs += fwrite_big32( 0, fp );
-
- recs += fwrite_big32( lib->files[idx].object_size, fp );
-
- if( recs != 5 ) {
- fprintf( stderr, "ar: error writing object header for %s, %s\n",
- filename, strerror( errno ) );
- goto error_return;
- }
- }
-
- /* Write the file names.
- */
- for( idx = 0; idx < num_objects; idx++ ) {
- /* Need to make sure that all the file names we write into the
- ** library DO NOT HAVE PATHS IN THEM, the world might end or something.
- */
- size_t name_len = 0;
- char *name_ptr = strrchr( lib->names[idx], '/' );
-
- if( name_ptr == NULL ) {
- name_ptr = lib->names[idx];
- } else {
- name_ptr++;
- }
-
- name_len = strlen( name_ptr ) + 1;
-
- obj_offs[idx].filename_offset_value = ftell( fp );
- recs = fwrite( name_ptr, name_len, 1, fp );
- obj_offs[idx].fullpath_offset_value = ftell( fp );
- recs += fwrite( name_ptr, name_len, 1, fp );
-
- if( recs != 2 ) {
- fprintf( stderr, "ar: error writing object name for %s, %s\n",
- filename, strerror( errno ) );
- goto error_return;
- }
- }
-
- /* Pad the file if necessary.
- */
- pad_amount = ftell( fp ) % 4;
- if( pad_amount > 0 ) {
- recs = fwrite( padding, pad_amount, 1, fp );
-
- if( recs != 1 ) {
- fprintf( stderr, "ar: error padding file %s, %s\n", filename,
- strerror( errno ) );
- goto error_return;
- }
- }
-
- /* Write the object file data.
- */
- for( idx = 0; idx < num_objects; idx++ ) {
- obj_offs[idx].data_offset_value = ftell( fp );
-
- recs = fwrite( lib->data[idx], lib->files[idx].object_size, 1, fp );
- if( recs != 1 ) {
- fprintf( stderr, "ar: writing object data for %s, %s\n", filename,
- strerror( errno ) );
- goto error_return;
- }
-
- /* Add up the code/data size.
- */
- retval = add_object_sizes( (MWObject *)lib->data[idx],
- &codesize, &datasize );
- if( retval != B_OK ) {
- fprintf( stderr, "ar - warning: %s is not an object file!\n",
- lib->names[idx] );
- goto error_return;
- }
-
- pad_amount = ftell( fp ) % 4;
- if( pad_amount > 0 ) {
- recs = fwrite( padding, pad_amount, 1, fp );
-
- if( recs != 1 ) {
- fprintf( stderr, "ar: error padding file %s, %s\n", filename,
- strerror( errno ) );
- goto error_return;
- }
- }
- }
-
- /* ----------------------------------------------------------------------
- ** Write the offsets into the file. Pass 2.
- */
-
- /* Write the code/data sizes.
- */
- recs = fwrite_big32_seek( codesize, head_offs.codesize_offset, fp );
- recs += fwrite_big32_seek( datasize, head_offs.datasize_offset, fp );
- if( recs != 2 ) {
- fprintf( stderr, "ar - error writing code and data sizes, %s\n",
- strerror( errno ) );
- goto error_return;
- }
-
- /* Write the offsets for each file.
- */
- for( idx = 0; idx < num_objects; idx++ ) {
- recs = fwrite_big32_seek( obj_offs[idx].filename_offset_value,
- obj_offs[idx].filename_offset, fp );
- recs += fwrite_big32_seek( obj_offs[idx].fullpath_offset_value,
- obj_offs[idx].fullpath_offset, fp );
- recs += fwrite_big32_seek( obj_offs[idx].data_offset_value,
- obj_offs[idx].data_offset, fp );
-
- if( recs != 3 ) {
- fprintf( stderr, "ar - error writing object offsets, %s\n",
- strerror( errno ) );
- goto error_return;
- }
- }
-
- /* If all is OK, close the file and get out of here after nuking the
- ** temp file (if any), preserving the original file mode, and preserving
- ** the file attributes.
- */
-
- fclose( fp );
-
- /* Preserve the original file mode bits.
- */
- retval = chmod( filename, mode_bits );
- if( retval != 0 ) {
- fprintf( stderr, "ar: unable to change file mode for %s, %s\n",
- filename, strerror( errno ) );
- }
-
- /* Nuke the temp file (if any), after copying over any file attributes.
- */
- if( tmp_filename != NULL ) {
- retval = copy_attrs( filename, tmp_filename );
-
- retval = unlink( tmp_filename );
- if( retval != 0 ) {
- fprintf( stderr, "ar - error unlinking %s, %s\n", tmp_filename,
- strerror( errno ) );
- }
- free( tmp_filename );
- } else {
- /* If there isn't a temp file, we should still give this new
- ** file a file type attribute.
- */
- setfiletype( filename, "application/x-mw-library" );
- }
-
- return B_OK;
-
-error_return:
- /* Restore the original file if we had any problems.
- */
- fclose( fp );
-
- if( tmp_filename != NULL ) {
- retval = unlink( filename );
- retval = rename( tmp_filename, filename );
- if( retval != 0 ) {
- fprintf( stderr, "ar: can't restore %s to %s, %s\n",
- tmp_filename, filename, strerror( errno ) );
- }
- }
-
- return B_ERROR;
-}
diff --git a/BeOS/ar-1.1/mwlib.h b/BeOS/ar-1.1/mwlib.h
deleted file mode 100644
index 67af325..0000000
--- a/BeOS/ar-1.1/mwlib.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-** mwlib.h - POSIX 1003.2 "ar" command
-**
-** $Id$
-**
-** This isn't a pure POSIX 1003.2 ar; it only manipulates Metrowerks
-** Library files, not general-purpose POSIX 1003.2 format archives.
-**
-** Dec. 14, 1997 Chris Herborth (chrish@qnx.com)
-**
-** This code is donated to the PUBLIC DOMAIN. You can use, abuse, modify,
-** redistribute, steal, or otherwise manipulate this code. No restrictions
-** at all. If you laugh at this code, you can't use it.
-**
-** This "ar" was implemented using IEEE Std 1003.2-1992 as the basis for
-** the interface, and Metrowerk's published docs detailing their library
-** format. Look inside for clues about how reality differs from MW's
-** documentation on BeOS...
-*/
-
-#include <support/SupportDefs.h>
-#include <time.h>
-
-/* ----------------------------------------------------------------------
-** Constants
-**
-*/
-#define MWLIB_MAGIC_WORD 'MWOB'
-#define MWLIB_MAGIC_PROC 'PPC '
-
-/* ----------------------------------------------------------------------
-** Structures
-**
-** This is based on the "Metrowerks CodeWarrior Library Reference
-** Specification", which isn't 100% accurate for BeOS.
-*/
-
-typedef struct MWLibHeader {
- uint32 magicword;
- uint32 magicproc;
- uint32 magicflags;
- uint32 version;
-
- uint32 code_size;
- uint32 data_size;
-
- uint32 num_objects;
-} MWLibHeader;
-
-typedef struct MWLibFile {
- time_t m_time;
-
- uint32 off_filename;
- uint32 off_fullpath;
- uint32 off_object;
- uint32 object_size;
-} MWLibFile;
-
-typedef struct MWLib {
- MWLibHeader header;
-
- MWLibFile *files;
-
- char **names;
-
- char **data;
-} MWLib;
-
-/* This bears no resemblance to what's in the Metrowerks docs.
-**
-** Note that this is incomplete; this is all the info I needed for
-** ar though.
-*/
-typedef struct MWObject {
- uint32 magic_word; /* 'MWOB' */
- uint32 arch; /* 'PPC '; this isn't in the docs */
- uint32 version;
- uint32 flags;
-
- uint32 code_size;
- uint32 data_size;
-} MWObject;
-
-/* ----------------------------------------------------------------------
-** Function prototypes
-**
-** load_MW_lib() - load a Metrowerks library
-**
-** Returns:
-** B_OK - all is well
-** B_FILE_NOT_FOUND - can't open the given file
-** B_IO_ERROR - can't read from the given file
-** B_BAD_VALUE - invalid magic word in the file
-** B_MISMATCHED_VALUES - invalid processor value (ie, not a PowerPC lib),
-** or the magicflags member is not 0, or the file
-** version number isn't 1.
-** B_NO_MEMORY - unable to allocate memory while loading the lib
-**
-** write_MW_lib() - write a Metrowerks library
-**
-** Returns:
-** B_OK - all is well
-**
-** write_MW_lib() - write a Metrowerks library file
-**
-** Returns:
-** B_OK - all is well; doesn't necessarily mean the file was written
-** properly, just that you didn't lose any data
-** B_NO_MEMORY - unable to allocate offset buffers
-** B_ERROR - problem with backup file (can't rename existing file)
-**
-** Note:
-** If you use this in a long-lived program, it leaks memory; the MWLib
-** contents are never free()'d.
-*/
-status_t load_MW_lib( MWLib *lib, const char *filename );
-status_t write_MW_lib( MWLib *lib, const char *filename );
-void setfiletype( const char *filename, const char *type );