From 4412ca091e6379def8bc836163c6b580df76619c Mon Sep 17 00:00:00 2001 From: crunchy Date: Wed, 23 Apr 2003 08:34:01 +0000 Subject: start restructuring --- autogen.sh | 7 +- config.guess | 234 +-- config.sub | 148 +- configure.in | 11 +- libmpio/Makefile.am | 47 +- libmpio/cis.c | 81 - libmpio/cis.h | 42 - libmpio/defs.h | 334 --- libmpio/directory.c | 1318 ------------ libmpio/directory.h | 84 - libmpio/ecc.c | 247 --- libmpio/ecc.h | 44 - libmpio/fat.c | 1039 --------- libmpio/fat.h | 87 - libmpio/id3.c | 292 --- libmpio/id3.h | 44 - libmpio/io.c | 1213 ----------- libmpio/io.h | 95 - libmpio/mpio.c | 1301 ------------ libmpio/mpio.h | 218 -- libmpio/mplib/mplib.c | 1011 +++++++++ libmpio/mplib/mplib.h | 438 ++++ libmpio/mplib/mplib_paas.c | 256 +++ libmpio/mplib/mplib_s.c | 1177 +++++++++++ libmpio/mplib/mplib_s.h | 153 ++ libmpio/mplib/xmalloc.c | 167 ++ libmpio/mplib/xmalloc.h | 58 + libmpio/smartmedia.c | 153 -- libmpio/smartmedia.h | 47 - libmpio/src/cis.c | 81 + libmpio/src/cis.h | 42 + libmpio/src/debug.c | 313 +++ libmpio/src/debug.h | 110 + libmpio/src/defs.h | 334 +++ libmpio/src/directory.c | 1318 ++++++++++++ libmpio/src/directory.h | 84 + libmpio/src/ecc.c | 247 +++ libmpio/src/ecc.h | 44 + libmpio/src/fat.c | 1039 +++++++++ libmpio/src/fat.h | 87 + libmpio/src/id3.c | 292 +++ libmpio/src/id3.h | 44 + libmpio/src/io.c | 1213 +++++++++++ libmpio/src/io.h | 95 + libmpio/src/mpio.c | 1301 ++++++++++++ libmpio/src/mpio.h | 218 ++ libmpio/src/smartmedia.c | 153 ++ libmpio/src/smartmedia.h | 47 + ltmain.sh | 269 ++- missing | 160 +- mkinstalldirs | 2 +- mpiosh/global.c | 4 +- mpiosh/readline.c | 25 +- mpiosh/readline.h | 3 +- mplib/AUTHORS | 1 - mplib/COPYING | 504 ----- mplib/ChangeLog | 50 - mplib/INSTALL | 118 -- mplib/Makefile.am | 2 - mplib/NEWS | 2 - mplib/README | 53 - mplib/autogen.sh | 11 - mplib/config.guess | 1317 ------------ mplib/config.sub | 1411 ------------- mplib/configure.in | 39 - mplib/depcomp | 411 ---- mplib/install-sh | 251 --- mplib/ltconfig | 3078 --------------------------- mplib/ltmain.sh | 4984 -------------------------------------------- mplib/missing | 283 --- mplib/mkinstalldirs | 40 - mplib/mplib-config.in | 98 - mplib/src/Makefile.am | 4 - mplib/src/mplib.c | 1011 --------- mplib/src/mplib.h | 438 ---- mplib/src/mplib_paas.c | 256 --- mplib/src/mplib_s.c | 1177 ----------- mplib/src/mplib_s.h | 153 -- mplib/src/xmalloc.c | 167 -- mplib/src/xmalloc.h | 58 - mplib/stamp-h.in | 1 - 81 files changed, 10792 insertions(+), 22997 deletions(-) delete mode 100644 libmpio/cis.c delete mode 100644 libmpio/cis.h delete mode 100644 libmpio/defs.h delete mode 100644 libmpio/directory.c delete mode 100644 libmpio/directory.h delete mode 100644 libmpio/ecc.c delete mode 100644 libmpio/ecc.h delete mode 100644 libmpio/fat.c delete mode 100644 libmpio/fat.h delete mode 100644 libmpio/id3.c delete mode 100644 libmpio/id3.h delete mode 100644 libmpio/io.c delete mode 100644 libmpio/io.h delete mode 100644 libmpio/mpio.c delete mode 100644 libmpio/mpio.h create mode 100644 libmpio/mplib/mplib.c create mode 100644 libmpio/mplib/mplib.h create mode 100644 libmpio/mplib/mplib_paas.c create mode 100644 libmpio/mplib/mplib_s.c create mode 100644 libmpio/mplib/mplib_s.h create mode 100644 libmpio/mplib/xmalloc.c create mode 100644 libmpio/mplib/xmalloc.h delete mode 100644 libmpio/smartmedia.c delete mode 100644 libmpio/smartmedia.h create mode 100644 libmpio/src/cis.c create mode 100644 libmpio/src/cis.h create mode 100644 libmpio/src/debug.c create mode 100644 libmpio/src/debug.h create mode 100644 libmpio/src/defs.h create mode 100644 libmpio/src/directory.c create mode 100644 libmpio/src/directory.h create mode 100644 libmpio/src/ecc.c create mode 100644 libmpio/src/ecc.h create mode 100644 libmpio/src/fat.c create mode 100644 libmpio/src/fat.h create mode 100644 libmpio/src/id3.c create mode 100644 libmpio/src/id3.h create mode 100644 libmpio/src/io.c create mode 100644 libmpio/src/io.h create mode 100644 libmpio/src/mpio.c create mode 100644 libmpio/src/mpio.h create mode 100644 libmpio/src/smartmedia.c create mode 100644 libmpio/src/smartmedia.h delete mode 100755 mplib/AUTHORS delete mode 100755 mplib/COPYING delete mode 100755 mplib/ChangeLog delete mode 100755 mplib/INSTALL delete mode 100755 mplib/Makefile.am delete mode 100755 mplib/NEWS delete mode 100755 mplib/README delete mode 100755 mplib/autogen.sh delete mode 100755 mplib/config.guess delete mode 100755 mplib/config.sub delete mode 100755 mplib/configure.in delete mode 100755 mplib/depcomp delete mode 100755 mplib/install-sh delete mode 100755 mplib/ltconfig delete mode 100755 mplib/ltmain.sh delete mode 100755 mplib/missing delete mode 100755 mplib/mkinstalldirs delete mode 100755 mplib/mplib-config.in delete mode 100755 mplib/src/Makefile.am delete mode 100755 mplib/src/mplib.c delete mode 100755 mplib/src/mplib.h delete mode 100755 mplib/src/mplib_paas.c delete mode 100755 mplib/src/mplib_s.c delete mode 100755 mplib/src/mplib_s.h delete mode 100755 mplib/src/xmalloc.c delete mode 100755 mplib/src/xmalloc.h delete mode 100644 mplib/stamp-h.in diff --git a/autogen.sh b/autogen.sh index 75068a7..f0bc897 100755 --- a/autogen.sh +++ b/autogen.sh @@ -3,13 +3,8 @@ # autogen.sh # # Andreas Buesching -# $ID$ - -cd mplib -./autogen.sh -cd .. +# $id$ aclocal && autoconf && automake -a && ./configure $@ - # end of autogen.sh diff --git a/config.guess b/config.guess index ba66165..1e2f91f 100755 --- a/config.guess +++ b/config.guess @@ -3,7 +3,7 @@ # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. -timestamp='2001-04-20' +timestamp='2001-08-23' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -52,7 +52,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 93, 94, 95, 96, 97, 98, 99, 2000 +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO @@ -95,25 +95,25 @@ trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int dummy(){}" > $dummy.c +set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int dummy(){}" > $dummy.c ; for c in cc gcc c89 ; do - ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 + ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ; if test $? = 0 ; then - CC_FOR_BUILD="$c"; break - fi - done - rm -f $dummy.c $dummy.o $dummy.rel + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + rm -f $dummy.c $dummy.o $dummy.rel ; if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found + CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac +esac' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 8/24/94.) +# (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi @@ -150,6 +150,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # to ELF recently, or will in the future. case "${UNAME_MACHINE}" in i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k) + eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then @@ -204,6 +205,7 @@ main: jsr \$26,exit .end main EOF + eval $set_cc_for_build $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null if test "$?" = 0 ; then case `./$dummy` in @@ -225,6 +227,9 @@ EOF 2-307) UNAME_MACHINE="alphaev67" ;; + 2-1307) + UNAME_MACHINE="alphaev68" + ;; esac fi rm -f $dummy.s $dummy @@ -328,6 +333,9 @@ EOF aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; + sparc*:NetBSD:*) + echo `uname -p`-unknown-netbsd${UNAME_RELEASE} + exit 0 ;; atari*:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; @@ -406,6 +414,7 @@ EOF exit (-1); } EOF + eval $set_cc_for_build $CC_FOR_BUILD $dummy.c -o $dummy \ && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && rm -f $dummy.c $dummy && exit 0 @@ -486,6 +495,7 @@ EOF exit(0); } EOF + eval $set_cc_for_build $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy echo rs6000-ibm-aix3.2.5 @@ -586,6 +596,7 @@ EOF exit (0); } EOF + eval $set_cc_for_build (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi rm -f $dummy.c $dummy @@ -623,6 +634,7 @@ EOF exit (0); } EOF + eval $set_cc_for_build $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy echo unknown-hitachi-hiuxwe2 @@ -633,7 +645,7 @@ EOF 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; - *9??*:MPE/iX:*:*) + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) @@ -677,12 +689,13 @@ EOF echo xmp-cray-unicos exit 0 ;; CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' @@ -763,97 +776,29 @@ EOF echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) - cat >$dummy.c < /* for printf() prototype */ -int main (int argc, char *argv[]) { -#else -int main (argc, argv) int argc; char *argv[]; { -#endif -#ifdef __MIPSEB__ - printf ("%s-unknown-linux-gnu\n", argv[1]); -#endif -#ifdef __MIPSEL__ - printf ("%sel-unknown-linux-gnu\n", argv[1]); -#endif - return 0; -} -EOF - $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy + case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in + big) echo mips-unknown-linux-gnu && exit 0 ;; + little) echo mipsel-unknown-linux-gnu && exit 0 ;; + esac ;; ppc:Linux:*:*) - # Determine Lib Version - cat >$dummy.c < -#if defined(__GLIBC__) -extern char __libc_version[]; -extern char __libc_release[]; -#endif -main(argc, argv) - int argc; - char *argv[]; -{ -#if defined(__GLIBC__) - printf("%s %s\n", __libc_version, __libc_release); -#else - printf("unknown\n"); -#endif - return 0; -} -EOF - LIBC="" - $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null - if test "$?" = 0 ; then - ./$dummy | grep 1\.99 > /dev/null - if test "$?" = 0 ; then LIBC="libc1" ; fi - fi - rm -f $dummy.c $dummy - echo powerpc-unknown-linux-gnu${LIBC} + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu exit 0 ;; alpha:Linux:*:*) - cat <$dummy.s - .data - \$Lformat: - .byte 37,100,45,37,120,10,0 # "%d-%x\n" - .text - .globl main - .align 4 - .ent main - main: - .frame \$30,16,\$26,0 - ldgp \$29,0(\$27) - .prologue 1 - .long 0x47e03d80 # implver \$0 - lda \$2,-1 - .long 0x47e20c21 # amask \$2,\$1 - lda \$16,\$Lformat - mov \$0,\$17 - not \$1,\$18 - jsr \$26,printf - ldgp \$29,0(\$26) - mov 0,\$16 - jsr \$26,exit - .end main -EOF - LIBC="" - $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null - if test "$?" = 0 ; then - case `./$dummy` in - 0-0) UNAME_MACHINE="alpha" ;; - 1-0) UNAME_MACHINE="alphaev5" ;; - 1-1) UNAME_MACHINE="alphaev56" ;; - 1-101) UNAME_MACHINE="alphapca56" ;; - 2-303) UNAME_MACHINE="alphaev6" ;; - 2-307) UNAME_MACHINE="alphaev67" ;; - esac - objdump --private-headers $dummy | \ - grep ld.so.1 > /dev/null - if test "$?" = 0 ; then - LIBC="libc1" - fi - fi - rm -f $dummy.s $dummy + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) @@ -883,38 +828,27 @@ EOF # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. - ld_supported_emulations=`cd /; ld --help 2>&1 \ - | sed -ne '/supported emulations:/!d + ld_supported_targets=`cd /; ld --help 2>&1 \ + | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g - s/.*supported emulations: *// + s/.*supported targets: *// s/ .*// p'` - case "$ld_supported_emulations" in - i*86linux) - echo "${UNAME_MACHINE}-pc-linux-gnuaout" - exit 0 - ;; - elf_i*86) + case "$ld_supported_targets" in + elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; - i*86coff) + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" - exit 0 - ;; - esac - # Either a pre-BFD a.out linker (linux-gnuoldld) - # or one that does not give us useful --help. - # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout. - # If ld does not provide *any* "supported emulations:" - # that means it is gnuoldld. - test -z "$ld_supported_emulations" && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 - case "${UNAME_MACHINE}" in - i*86) - VENDOR=pc; - ;; - *) - VENDOR=unknown; - ;; + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; esac # Determine whether the default compiler is a.out or elf cat >$dummy.c <= 2 - printf ("%s-${VENDOR}-linux-gnu\n", argv[1]); + printf ("%s-pc-linux-gnu\n", argv[1]); # else - printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); + printf ("%s-pc-linux-gnulibc1\n", argv[1]); # endif # else - printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); + printf ("%s-pc-linux-gnulibc1\n", argv[1]); # endif #else - printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]); + printf ("%s-pc-linux-gnuaout\n", argv[1]); #endif return 0; } EOF + eval $set_cc_for_build $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; -# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions -# are messed up and put the nodename in both sysname and nodename. i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. echo i386-sequent-sysv4 exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) @@ -966,14 +902,13 @@ EOF echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; - i*86:*:5:7*) - # Fixed at (any) Pentium or better - UNAME_MACHINE=i586 - if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then - echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} - fi + i*86:*:5:[78]*) + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then @@ -1067,8 +1002,8 @@ EOF echo ns32k-sni-sysv fi exit 0 ;; - PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) @@ -1080,6 +1015,10 @@ EOF # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; @@ -1172,6 +1111,12 @@ EOF *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 @@ -1291,6 +1236,7 @@ main () } EOF +eval $set_cc_for_build $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy diff --git a/config.sub b/config.sub index a06a480..ff13f7a 100755 --- a/config.sub +++ b/config.sub @@ -3,7 +3,7 @@ # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. -timestamp='2001-04-20' +timestamp='2001-08-23' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software @@ -117,7 +117,7 @@ esac # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in - nto-qnx* | linux-gnu* | storm-chaos* | os2-emx*) + nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; @@ -157,6 +157,14 @@ case $os in os=-vxworks basic_machine=$1 ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; -hiux*) os=-hiuxwe2 ;; @@ -215,26 +223,35 @@ esac case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. - tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc \ - | arm | arme[lb] | arm[bl]e | armv[2345] | armv[345][lb] | strongarm | xscale \ - | pyramid | mn10200 | mn10300 | tron | a29k \ - | 580 | i960 | h8300 \ - | x86 | ppcbe | mipsbe | mipsle | shbe | shle \ - | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ - | hppa64 \ - | alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \ - | alphaev6[78] \ - | we32k | ns16k | clipper | i370 | sh | sh[34] \ - | powerpc | powerpcle \ - | 1750a | dsp16xx | pdp10 | pdp11 \ - | mips16 | mips64 | mipsel | mips64el \ - | mips64orion | mips64orionel | mipstx39 | mipstx39el \ - | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ - | mips64vr5000 | miprs64vr5000el | mcore | s390 | s390x \ - | sparc | sparclet | sparclite | sparc64 | sparcv9 | sparcv9b \ - | v850 | c4x \ - | thumb | d10v | d30v | fr30 | avr | openrisc | tic80 \ - | pj | pjl | h8500) + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | c4x | clipper \ + | d10v | d30v | dsp16xx \ + | fr30 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | m32r | m68000 | m68k | m88k | mcore \ + | mips16 | mips64 | mips64el | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el | mips64vr4300 \ + | mips64vr4300el | mips64vr5000 | mips64vr5000el \ + | mipsbe | mipsel | mipsle | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | ns16k | ns32k \ + | openrisc \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | s390 | s390x \ + | sh | sh[34] | sh[34]eb | shbe | shle \ + | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \ + | stormy16 | strongarm \ + | tahoe | thumb | tic80 | tron \ + | v850 \ + | we32k \ + | x86 | xscale \ + | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) @@ -242,7 +259,7 @@ case $basic_machine in basic_machine=$basic_machine-unknown os=-none ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | w65) + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' @@ -257,31 +274,43 @@ case $basic_machine in exit 1 ;; # Recognize the basic CPU types with company name. - # FIXME: clean up the formatting here. - vax-* | tahoe-* | i*86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \ - | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | c[123]* \ - | arm-* | armbe-* | armle-* | armv*-* | strongarm-* | xscale-* \ - | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ - | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \ - | xmp-* | ymp-* \ - | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* \ - | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \ - | hppa2.0n-* | hppa64-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \ - | alphaev6[78]-* \ - | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ - | clipper-* | orion-* \ - | sparclite-* | pdp10-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ - | sparc64-* | sparcv9-* | sparcv9b-* | sparc86x-* \ - | mips16-* | mips64-* | mipsel-* \ - | mips64el-* | mips64orion-* | mips64orionel-* \ - | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \ - | mipstx39-* | mipstx39el-* | mcore-* \ - | f30[01]-* | f700-* | s390-* | s390x-* | sv1-* | t3e-* \ - | [cjt]90-* \ - | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \ - | thumb-* | v850-* | d30v-* | tic30-* | tic80-* | c30-* | fr30-* \ - | bs2000-* | tic54x-* | c54x-* | x86_64-* | pj-* | pjl-*) + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alphapca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armv*-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c54x-* \ + | clipper-* | cray2-* | cydra-* \ + | d10v-* | d30v-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | m32r-* \ + | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | mcore-* \ + | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \ + | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipsel-* \ + | mipsle-* | mipstx39-* | mipstx39el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | s390-* | s390x-* \ + | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclite-* \ + | sparcv9-* | sparcv9b-* | stormy16-* | strongarm-* | sv1-* \ + | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ + | v850-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \ + | ymp-* \ + | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. @@ -727,6 +756,16 @@ case $basic_machine in ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; ps2) basic_machine=i386-ibm ;; @@ -881,6 +920,10 @@ case $basic_machine in basic_machine=hppa1.1-winbond os=-proelf ;; + windows32) + basic_machine=i386-pc + os=-windows32-msvcrt + ;; xmp) basic_machine=xmp-cray os=-unicos @@ -934,7 +977,7 @@ case $basic_machine in we32k) basic_machine=we32k-att ;; - sh3 | sh4) + sh3 | sh4 | sh3eb | sh4eb) basic_machine=sh-unknown ;; sparc | sparcv9 | sparcv9b) @@ -1018,11 +1061,13 @@ case $os in | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* | -os2*) + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1346,6 +1391,9 @@ case $basic_machine in -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; + -vos*) + vendor=stratus + ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; diff --git a/configure.in b/configure.in index 8a15282..a2af5cc 100644 --- a/configure.in +++ b/configure.in @@ -47,17 +47,10 @@ TEST_MPLIB if test "$ac_cv_use_mplib" = yes; then AC_CONFIG_SUBDIRS(mplib) - MPLIB_INCLUDE=-I../mplib/src + MPLIB_INCLUDE=-Implib MPLIB_CFLAGS=-DMPLIB - MPLIB_LIBADD=../mplib/src/libmp.la - MPLIB_SUBDIR=mplib fi -AC_SUBST(MPLIB_INCLUDE) -AC_SUBST(MPLIB_CFLAGS) -AC_SUBST(MPLIB_LIBADD) -AC_SUBST(MPLIB_SUBDIR) - dnl --- check for kernel version kernel_version=`uname -r 2>&1` echo -n "checking for kernel version ... " @@ -117,5 +110,3 @@ AC_OUTPUT( tools/Makefile mpio.spec ) - - diff --git a/libmpio/Makefile.am b/libmpio/Makefile.am index 7065833..1451b75 100644 --- a/libmpio/Makefile.am +++ b/libmpio/Makefile.am @@ -2,29 +2,36 @@ INCLUDES=@MPLIB_INCLUDE@ AM_CFLAGS=@MPLIB_CFLAGS@ lib_LTLIBRARIES=libmpio.la -libmpio_la_LIBADD=@MPLIB_LIBADD@ libmpio_la_SOURCES= \ - mpio.c \ - io.c \ - debug.c \ - smartmedia.c \ - directory.c \ - fat.c \ - ecc.c \ - cis.c \ - id3.c + src/mpio.c \ + src/io.c \ + src/debug.c \ + src/smartmedia.c \ + src/directory.c \ + src/fat.c \ + src/ecc.c \ + src/cis.c \ + src/id3.c \ + mplib/mplib.c \ + mplib/mplib_paas.c \ + mplib/mplib_s.c \ + mplib/xmalloc.c pkginclude_HEADERS= \ - mpio.h \ - defs.h + src/mpio.h \ + src/defs.h noinst_HEADERS= \ - io.h \ - debug.h \ - smartmedia.h \ - directory.h \ - fat.h \ - ecc.h \ - cis.h \ - id3.h + src/io.h \ + src/debug.h \ + src/smartmedia.h \ + src/directory.h \ + src/fat.h \ + src/ecc.h \ + src/cis.h \ + src/id3.h \ + mplib/mplib.h \ + mplib/mplib_s.h \ + mplib/xmalloc.h + diff --git a/libmpio/cis.c b/libmpio/cis.c deleted file mode 100644 index c30085b..0000000 --- a/libmpio/cis.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - * - * $Id: cis.c,v 1.1 2002/10/06 21:19:50 germeier Exp $ - * - * Library for USB MPIO-* - * - * Markus Germeier (mager@tzi.de) - * - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * */ - -#include "cis.h" - -/* This data is CIS block (Card Information System) of the SmartMedia - * cards, it can be found here: - * http://www.samsungelectronics.com/semiconductors/flash/technical_data/application_notes/SM_format.pdf (page 8 + 9) - * or on any Smartmedia card - * - * It is not believed to be some kind of trade secret or such, so ... - * ... if we are mistaken, please tell us so. - */ - -char cis_templ[0x80] = { - 0x01, 0x03, 0xd9, 0x01, 0xff, 0x18, 0x02, 0xdf, /* 0x00 */ - 0x01, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, 0x21, - - 0x02, 0x04, 0x01, 0x22, 0x02, 0x01, 0x01, 0x22, /* 0x10 */ - 0x03, 0x02, 0x04, 0x07, 0x1a, 0x05, 0x01, 0x03, - - 0x00, 0x02, 0x0f, 0x1b, 0x08, 0xc0, 0xc0, 0xa1, /* 0x20 */ - 0x01, 0x55, 0x08, 0x00, 0x20, 0x1b, 0x0a, 0xc1, - - 0x41, 0x99, 0x01, 0x55, 0x64, 0xf0, 0xff, 0xff, /* 0x30 */ - 0x20, 0x1b, 0x0c, 0x82, 0x41, 0x18, 0xea, 0x61, - - 0xf0, 0x01, 0x07, 0xf6, 0x03, 0x01, 0xee, 0x1b, /* 0x40 */ - 0x0c, 0x83, 0x41, 0x18, 0xea, 0x61, 0x70, 0x01, - - 0x07, 0x76, 0x03, 0x01, 0xee, 0x15, 0x14, 0x05, /* 0x50 */ - 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - - 0x00, 0x20, 0x20, 0x20, 0x20, 0x00, 0x30, 0x2e, /* 0x60 */ - 0x30, 0x00, 0xff, 0x14, 0x00, 0xff, 0x00, 0x00, - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70 */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - -}; - -BYTE * -mpio_cis_gen() -{ - BYTE *p; - - p = (BYTE *)malloc(SECTOR_SIZE); - - memset(p, 0, SECTOR_SIZE); - memcpy(p, cis_templ, 0x80); - memcpy(p+0x100, cis_templ, 0x80); - - return p; - -} - - - - diff --git a/libmpio/cis.h b/libmpio/cis.h deleted file mode 100644 index c5d83b4..0000000 --- a/libmpio/cis.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * - * $Id: cis.h,v 1.2 2002/10/26 13:07:42 germeier Exp $ - * - * Library for USB MPIO-* - * - * Markus Germeier (mager@tzi.de) - * - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * */ - -#ifndef _MPIO_CIS_H_ -#define _MPIO_CIS_H_ - -#include "defs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* generate and return a fresh CIS block */ -BYTE *mpio_cis_gen(); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libmpio/defs.h b/libmpio/defs.h deleted file mode 100644 index 44b14e7..0000000 --- a/libmpio/defs.h +++ /dev/null @@ -1,334 +0,0 @@ -/* -*- linux-c -*- */ - -/* - * $Id: defs.h,v 1.22 2003/04/19 09:32:48 germeier Exp $ - * - * Library for USB MPIO-* - * - * Markus Germeier (mager@tzi.de) - * - * uses code from mpio_stat.c by - * Yuji Touya (salmoon@users.sourceforge.net) - * - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * */ - -#ifndef _MPIO_DEFS_H_ -#define _MPIO_DEFS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef unsigned char BYTE; -typedef unsigned short WORD; -typedef unsigned int DWORD; - -/* Memory selection */ -typedef enum { MPIO_INTERNAL_MEM = 0x01, - MPIO_EXTERNAL_MEM = 0x10 } mpio_mem_t; - -/* model type */ -typedef enum { MPIO_MODEL_DME = 0x00, - MPIO_MODEL_DMG = 0x01, - MPIO_MODEL_DMG_PLUS = 0x02, - MPIO_MODEL_DMB = 0x03, - MPIO_MODEL_DMB_PLUS = 0x04, - MPIO_MODEL_DMK = 0x05, - MPIO_MODEL_FD100 = 0x06, - MPIO_MODEL_FL100 = 0x07, - MPIO_MODEL_FY100 = 0x08, - MPIO_MODEL_UNKNOWN = 0x09 } mpio_model_t; - -/* USB commands */ -typedef enum { GET_VERSION = 0x01, - GET_BLOCK = 0x02, - PUT_SECTOR = 0x03, - DEL_BLOCK = 0x04, - GET_SECTOR = 0x06, - GET_SPARE_AREA = 0x07, - PUT_BLOCK = 0x08, - MODIFY_FIRMWARE = 0xa0 } mpio_cmd_t; - -/* file types on internal memory */ -/* found in the code of salmoon, are these needed? -mager */ -typedef enum { FTYPE_CHAN = 0x00, - FTYPE_MUSIC = 0x01, - FTYPE_CONF = 'C', - FTYPE_FONT = 'F', - FTYPE_OTHER = 'H', - FTYPE_MEMO = 'M', - FTYPE_WAV = 'V', - FTYPE_ENTRY = 'R', - FTYPE_DIR = 'D', - FTYPE_PLAIN = '-'} mpio_filetype_t; - -/* fixed filenames */ -#define MPIO_CONFIG_FILE "CONFIG.DAT" -#define MPIO_CHANNEL_FILE "FMCONFIG.DAT" -#define MPIO_MPIO_RECORD "MPIO RECORD" - -/* type of callback functions */ -typedef BYTE (*mpio_callback_t)(int, int) ; -typedef BYTE (*mpio_callback_init_t)(mpio_mem_t, int, int) ; - -/* zone lookup table */ -#define MPIO_ZONE_MAX 8 /* 8* 16MB = 128MB */ -#define MPIO_ZONE_PBLOCKS 1024 /* physical blocks per zone */ -#define MPIO_ZONE_LBLOCKS 1000 /* logical blocks per zone */ -typedef DWORD mpio_zonetable_t[MPIO_ZONE_MAX][MPIO_ZONE_PBLOCKS]; - -#define MPIO_BLOCK_FREE 0xffff -#define MPIO_BLOCK_DEFECT 0xffee -#define MPIO_BLOCK_CIS 0xaaaa -#define MPIO_BLOCK_NOT_FOUND 0xcccccccc - -/* filenames */ -#define MPIO_FILENAME_LEN 129 -typedef BYTE mpio_filename_t[MPIO_FILENAME_LEN]; - -#ifndef NULL -#define NULL 0 -#endif - -#define MPIO_DEVICE "/dev/usb/mpio" -#define MPIO_CHARSET "ISO-8859-15" - -#define MPIO_ID3_FORMAT "%p - %t" - -#define SECTOR_SIZE 0x200 -#define SECTOR_ECC 0x040 -#define SECTOR_TRANS (SECTOR_SIZE + SECTOR_ECC) - -#define BLOCK_SECTORS 0x20 /* 0x10 8MB Smartmedia :salmoon */ -#define BLOCK_SIZE (SECTOR_SIZE * BLOCK_SECTORS) -#define BLOCK_TRANS (BLOCK_SIZE + (SECTOR_ECC * BLOCK_SECTORS)) - -#define DIR_NUM 0x10 -#define DIR_SIZE (SECTOR_SIZE*DIR_NUM) -#define DIR_ENTRY_SIZE 0x20 - -#define SMALL_MEM 0x02 - -#define CMD_SIZE 0x40 - -#define INFO_LINE 129 - -/* error codes */ -typedef struct { - int id; - char *msg; -} mpio_error_t; - -#define MPIO_OK 0 -#define MPIO_ERR_FILE_NOT_FOUND -1 -#define MPIO_ERR_NOT_ENOUGH_SPACE -2 -#define MPIO_ERR_FILE_EXISTS -3 -#define MPIO_ERR_FAT_ERROR -4 -#define MPIO_ERR_READING_FILE -5 -#define MPIO_ERR_PERMISSION_DENIED -6 -#define MPIO_ERR_WRITING_FILE -7 -#define MPIO_ERR_DIR_TOO_LONG -8 -#define MPIO_ERR_DIR_NOT_FOUND -9 -#define MPIO_ERR_DIR_NOT_A_DIR -10 -#define MPIO_ERR_DIR_NAME_ERROR -11 -#define MPIO_ERR_DIR_NOT_EMPTY -12 -#define MPIO_ERR_DEVICE_NOT_READY -13 -#define MPIO_ERR_OUT_OF_MEMORY -14 -#define MPIO_ERR_INTERNAL -15 -/* internal errors, occur when UI has errors! */ -#define MPIO_ERR_INT_STRING_INVALID -101 - -/* get formatted information, about the MPIO player */ - -typedef struct { - BYTE firmware_id[INFO_LINE]; - BYTE firmware_version[INFO_LINE]; - BYTE firmware_date[INFO_LINE]; - - BYTE model[INFO_LINE]; - - BYTE mem_internal[INFO_LINE]; - BYTE mem_external[INFO_LINE]; - -} mpio_info_t; - -/* view of the MPIO firmware */ -typedef struct { - /* everything we get from GET_VERSION */ - BYTE id[12]; - BYTE major[3]; - BYTE minor[3]; - BYTE year[5]; - BYTE month[3]; - BYTE day[3]; -} mpio_firmware_t; - -/* */ -typedef struct { - DWORD NumCylinder; - DWORD NumHead; - DWORD NumSector; - DWORD SumSector; -} mpio_disk_phy_t; - -/* */ - -struct mpio_directory_tx { - BYTE name[INFO_LINE]; - BYTE dir[BLOCK_SIZE]; - - BYTE *dentry; - - struct mpio_directory_tx *prev; - struct mpio_directory_tx *next; - -}; -typedef struct mpio_directory_tx mpio_directory_t; - - -/* view of a SmartMedia(tm) card */ -typedef struct { - BYTE id; - BYTE manufacturer; - WORD size; /* MB */ - BYTE chips; /* this is the hack for - MPIO internal representation, because - there might be up to four chips involved */ - - /* only needed for external SmartMedia cards */ - mpio_disk_phy_t geo; - - BYTE cis[SECTOR_SIZE]; - BYTE mbr[SECTOR_SIZE]; /* Master Boot Record */ - BYTE pbr[SECTOR_SIZE]; /* Partition Boot Record */ - - int pbr_offset; /* sector offset for the PBR */ - int fat_offset; /* sector offset for the FAT */ - int dir_offset; - - /* these are needed for internal and external cards */ - int max_cluster; /* # of clusters actually available */ - int fat_size; /* # sectors for FAT */ - int fat_nums; /* # of FATs */ - BYTE * fat; /* *real FAT (like in block allocation :-) */ - - /* needed for directory support */ - mpio_directory_t *root; /* root directory */ - mpio_directory_t *cdir; /* current directory */ - - /* how many physical blocks are available - * for internal memory is this value equal to max_cluster - */ - int max_blocks; - BYTE * spare; - - /* lookup table for phys.<->log. block mapping */ - mpio_zonetable_t zonetable; - -} mpio_smartmedia_t; - -/* health status of a memory "card" */ -typedef struct { - WORD total; /* total blocks on "card" */ - WORD spare; /* (available spare blocks */ - WORD broken; /* broken blocks */ -} mpio_health_single_t; - -typedef struct { - BYTE num; /* number of chips or zones */ - /* internal: max 4 chips - * external: max 8 zones (128MB) -> max 8 */ - mpio_health_single_t data[8]; -} mpio_health_t; - -/* view of the MPIO-* */ -typedef struct { - BYTE version[CMD_SIZE]; - - int fd; - BYTE *charset; /* charset used for filename conversion */ - - BYTE id3; /* enable/disable ID3 rewriting support */ - BYTE id3_format[INFO_LINE]; - BYTE id3_temp[INFO_LINE]; - - mpio_firmware_t firmware; - - mpio_model_t model; - - mpio_smartmedia_t internal; - mpio_smartmedia_t external; -} mpio_t; - -typedef struct { - mpio_t *m; - BYTE mem; /* internal/external memory */ - - DWORD entry; /* number of FAT entry */ - - /* internal */ - BYTE i_index; /* file index of file to store */ - BYTE i_fat[16]; /* internal FAT entry */ - - /* external */ - DWORD e_sector; /* logical startsector of cluster */ - - /* mapping to HW (== block address) */ - DWORD hw_address; /* 3 bytes block addressing + 1 byte chip */ - -} mpio_fatentry_t; - - -/* these are copied from: - * http://www.linuxhq.com/kernel/v2.4/doc/filesystems/vfat.txt.html - * - */ - -typedef struct { // Short 8.3 names - unsigned char name[8]; // file name - unsigned char ext[3]; // file extension - unsigned char attr; // attribute byte - unsigned char lcase; // Case for base and extension - unsigned char ctime_ms; // Creation time, milliseconds - unsigned char ctime[2]; // Creation time - unsigned char cdate[2]; // Creation date - unsigned char adate[2]; // Last access date - unsigned char reserved[2]; // reserved values (ignored) - unsigned char time[2]; // time stamp - unsigned char date[2]; // date stamp - unsigned char start[2]; // starting cluster number - unsigned char size[4]; // size of the file -} mpio_dir_entry_t; - -typedef struct { // Up to 13 characters of a long name - unsigned char id; // sequence number for slot - unsigned char name0_4[10]; // first 5 characters in name - unsigned char attr; // attribute byte - unsigned char reserved; // always 0 - unsigned char alias_checksum; // checksum for 8.3 alias - unsigned char name5_10[12]; // 6 more characters in name - unsigned char start[2]; // starting cluster number - unsigned char name11_12[4]; // last 2 characters in name -} mpio_dir_slot_t; - -#ifdef __cplusplus -} -#endif - -#endif /* _MPIO_DEFS_H_ */ - diff --git a/libmpio/directory.c b/libmpio/directory.c deleted file mode 100644 index 6f0e82d..0000000 --- a/libmpio/directory.c +++ /dev/null @@ -1,1318 +0,0 @@ -/* - * - * $Id: directory.c,v 1.18 2003/04/19 23:58:02 germeier Exp $ - * - * Library for USB MPIO-* - * - * Markus Germeier (mager@tzi.de) - * - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * */ - -#include -#include - -#include "debug.h" -#include "io.h" -#include "mpio.h" -#include "directory.h" -#include - -#define UNICODE "UNICODELITTLE" - -/* the following function is copied from the linux kernel v2.4.18 - * file:/usr/src/linux/fs/fat/misc.c - * it was written by Werner Almesberger and Igor Zhbanov - * and is believed to be GPL - */ - -/* Linear day numbers of the respective 1sts in non-leap years. */ - -static int day_n[] = { 0,31,59,90,120,151,181,212,243,273,304,334,0,0,0,0 }; - /* JanFebMarApr May Jun Jul Aug Sep Oct Nov Dec */ - -/* Convert a MS-DOS time/date pair to a UNIX date (seconds since 1 1 70). */ - -int date_dos2unix(unsigned short time,unsigned short date) -{ - int month,year,secs; - struct timezone sys_tz; - struct timeval tv; - - gettimeofday(&tv, &sys_tz); - - /* first subtract and mask after that... Otherwise, if - date == 0, bad things happen */ - month = ((date >> 5) - 1) & 15; - year = date >> 9; - secs = (time & 31)*2+60*((time >> 5) & 63)+(time >> 11)*3600+86400* - ((date & 31)-1+day_n[month]+(year/4)+year*365-((year & 3) == 0 && - month < 2 ? 1 : 0)+3653); - /* days since 1.1.70 plus 80's leap day */ - secs += sys_tz.tz_minuteswest*60; - return secs; -} - -/* - * charset for filename encoding/converting - */ -BYTE * -mpio_charset_get(mpio_t *m) -{ - return strdup(m->charset); -} - -BYTE -mpio_charset_set(mpio_t *m, BYTE *charset) -{ - iconv_t ic; - int r = 1; - - ic = iconv_open(UNICODE, charset); - if (ic < 0) - r=0; - iconv_close(ic); - - ic = iconv_open(charset, UNICODE); - if (ic < 0) - r=0; - iconv_close(ic); - - if (r) - { - debugn(2, "setting new charset to: \"%s\"\n", charset); - free(m->charset); - m->charset=strdup(charset); - } else { - debugn(2, "could not set charset to: \"%s\"\n", charset); - } - - return r; -} - -int -mpio_directory_init(mpio_t *m, mpio_mem_t mem, mpio_directory_t *dir, - WORD self, WORD parent) -{ - mpio_dir_entry_t *dentry; - - memset(dir->dir, 0, BLOCK_SIZE); - memset(dir->dir, 0x20, 11); - memset(dir->dir+0x20, 0x20, 11); - - dentry = (mpio_dir_entry_t *)dir->dir; - - strncpy(dentry->name, ". ", 8); - strncpy(dentry->ext, " ", 3); - dentry->start[0] = self & 0xff; - dentry->start[1] = self / 0x100; - dentry->attr = 0x10; - - dentry++; - strncpy(dentry->name, ".. ", 8); - strncpy(dentry->ext, " ", 3); - dentry->start[0] = parent & 0xff; - dentry->start[1] = parent / 0x100; - dentry->attr = 0x10; - - hexdumpn(2, dir->dir, 64); - - return 0; -} - - -int -mpio_directory_read(mpio_t *m, mpio_mem_t mem, mpio_directory_t *dir) -{ - mpio_fatentry_t *f = 0; - - f = mpio_dentry_get_startcluster(m, mem, dir->dentry); - - if (!f) - { - debug("something bad has happened here!"); - exit (-1); - } - - mpio_io_block_read(m, mem, f, dir->dir); - - hexdumpn(5, dir->dir, DIR_SIZE); - - return 0; -} - -BYTE -mpio_directory_is_empty(mpio_t *m, mpio_mem_t mem, mpio_directory_t *dir) -{ - mpio_dir_entry_t *dentry; - BYTE r; - - dentry = (mpio_dir_entry_t *)dir->dir; - dentry += 2; - - r = MPIO_OK; - if (dentry->name[0] != 0x00) - r = !r; - - return r; -} - - -int -mpio_directory_write(mpio_t *m, mpio_mem_t mem, mpio_directory_t *dir) -{ - mpio_fatentry_t *f = 0; - - f = mpio_dentry_get_startcluster(m, mem, dir->dentry); - if (!f) - { - debug("something bad has happened here!"); - exit (-1); - } - - if (mem==MPIO_INTERNAL_MEM) - { - f->i_fat[0x01]= f->i_index; - if (m->model >= MPIO_MODEL_FD100) - f->i_fat[0x0e] = f->i_index; - - /* only one block needed for directory */ - f->i_fat[0x02]=0; - f->i_fat[0x03]=1; - - /* set type to directory */ - f->i_fat[0x06] = FTYPE_ENTRY; - - hexdumpn(2, f->i_fat, 16); - } - - mpio_io_block_delete(m, mem, f); - mpio_io_block_write(m, mem, f, dir->dir); - - return 0; -} - -/* directory operations */ -BYTE * -mpio_directory_open(mpio_t *m, mpio_mem_t mem) -{ - BYTE *out; - if (mem == MPIO_EXTERNAL_MEM) { - if (m->external.id) { - out = m->external.cdir->dir; - } else { - return NULL; - } - } else { - out = m->internal.cdir->dir; - } - - if (out[0] == 0x00) - { - debugn(3, "directory is empty\n"); - return NULL; - } - - debugn(3, "first dentry: %08x\n", out); - - return out; -} - -int -mpio_directory_make(mpio_t *m, mpio_mem_t mem, BYTE *dir) -{ - mpio_smartmedia_t *sm; - mpio_directory_t *new; - mpio_fatentry_t *f, *current; - WORD self, parent; - struct tm tt; - time_t curr; - - if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - - if ((strcmp(dir, "..") == 0) || - (strcmp(dir, ".") == 0)) - { - debugn(2, "directory name not allowed: %s\n", dir); - return MPIO_ERR_DIR_NAME_ERROR; - } - - /* find free sector */ - f = mpio_fatentry_find_free(m, mem, FTYPE_ENTRY); - if (!f) - { - debug("could not free cluster for file!\n"); - return (MPIO_ERR_FAT_ERROR); - } else { - self=f->entry; - } - - /* find file-id for internal memory */ - if (mem==MPIO_INTERNAL_MEM) - { - f->i_index=mpio_fat_internal_find_fileindex(m); - debugn(2, "fileindex: %02x\n", f->i_index); - f->i_fat[0x01]= f->i_index; - if (m->model >= MPIO_MODEL_FD100) - f->i_fat[0x0e] = f->i_index; - self = f->i_index; - - /* only one block needed for directory */ - f->i_fat[0x02]=0; - f->i_fat[0x03]=1; - hexdumpn(2, f->i_fat, 16); - } - - if (sm->cdir == sm->root) - { - parent=0; - } else { - current = mpio_dentry_get_startcluster(m, mem, sm->cdir->dentry); - if (mem==MPIO_INTERNAL_MEM) - { - parent = current->i_index; - } else { - parent = current->entry; - } - } - - - new = malloc(sizeof(mpio_directory_t)); - mpio_directory_init(m, mem, new, self, parent); - - mpio_fatentry_set_eof(m ,mem, f); - mpio_io_block_write(m, mem, f, new->dir); - time(&curr); - tt = * localtime(&curr); - mpio_dentry_put(m, mem, - dir, strlen(dir), - mktime(&tt), - 0, self, 0x10); - - free(new); - - return MPIO_OK; -} - -int -mpio_directory_cd(mpio_t *m, mpio_mem_t mem, BYTE *dir) -{ - mpio_smartmedia_t *sm; - BYTE *p; - BYTE month, day, hour, minute, type; - BYTE fname[100]; - WORD year; - DWORD fsize; - int i, size; - BYTE pwd[INFO_LINE]; - mpio_directory_t *old, *new; - - if (strcmp(dir, ".")==0) - return MPIO_OK; - - if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - - if (strcmp(dir, "..") == 0) - { - if (sm->cdir->prev) - { - old = sm->cdir; - sm->cdir = sm->cdir->prev; - sm->cdir->next = NULL; - free(old); - } - - return MPIO_OK; - } - - mpio_directory_pwd(m, mem, pwd); - - if ((strlen(pwd) + strlen(dir) + 2) > INFO_LINE) - { - debugn(2, "directory name gets to long!\n"); - return MPIO_ERR_DIR_TOO_LONG; - } - - - p = mpio_dentry_find_name(m, mem, dir); - - /* second try */ - if (!p) - p = mpio_dentry_find_name_8_3(m, mem, dir); - - if (!p) - { - debugn(2, "could not find directory: %s\n", dir); - return MPIO_ERR_DIR_NOT_FOUND; - } - - mpio_dentry_get(m, mem, p, - fname, 100, - &year, &month, &day, - &hour, &minute, &fsize, - &type); - - if (type != FTYPE_DIR) - { - debugn(2, "this is not a directory: %s\n", dir); - return MPIO_ERR_DIR_NOT_A_DIR; - } - - new = malloc(sizeof(mpio_directory_t)); - strcpy(new->name, dir); - new->next = NULL; - new->prev = sm->cdir; - new->dentry = p; - sm->cdir->next = new; - sm->cdir = new; - - mpio_directory_pwd(m, mem, pwd); - - if (strcmp(dir, "/") != 0) - { - /* read new directory */ - size=mpio_directory_read(m, mem, sm->cdir); - } - - return MPIO_OK; - -} - - -void -mpio_directory_pwd(mpio_t *m, mpio_mem_t mem, BYTE pwd[INFO_LINE]) -{ - mpio_smartmedia_t *sm; - mpio_directory_t *d; - - if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - - d = sm->root->next; - pwd[0] = 0; - - if (!d) - strcat(pwd, "/"); - - while (d) - { - strcat(pwd, "/"); - debugn(2, "name: %s\n", d->name); - strcat(pwd, d->name); - d = d->next; - } - - return; -} - -mpio_dir_entry_t * -mpio_dentry_filename_write(mpio_t *m, mpio_mem_t mem, BYTE *p, - BYTE *filename, int filename_size) -{ - BYTE *unicode = 0; - BYTE *back, *fback; - BYTE *fname = 0; - iconv_t ic; - int in = 0, out = 0; - int fin = 0, fout = 0; - int count = 0; - BYTE index; - BYTE f_8_3[13]; - mpio_dir_slot_t *slot; - mpio_dir_entry_t *dentry; - int i, j, points; - - /* generate vfat filename in UNICODE */ - ic = iconv_open(UNICODE, m->charset); - fin = in = filename_size + 1; - fout = out = filename_size * 2 + 2 + 26; - fname = malloc(in); - fback = fname; - unicode = malloc(out); - back = unicode; - - memset(fname, 0, in); - snprintf(fname, in, "%s", filename); - memset(unicode, 0xff, out); - iconv(ic, (char **)&fback, &fin, (char **)&back, &fout); - iconv_close(ic); - hexdump(fname, in); - hexdump(unicode, out); - - back = unicode; - - count = filename_size / 13; - if (filename_size % 13) - count++; - - slot = (mpio_dir_slot_t *)p; - - index = 0x40 + count; - while (count > 0) { - mpio_dentry_copy_to_slot(back + ((count - 1) * 26), slot); - hexdump((char *)back + ((count - 1) * 26), 0x20); - slot->id = index; - slot->attr = 0x0f; - slot->reserved = 0x00; - slot->start[0] = 0x00; - slot->start[1] = 0x00; - /* FIXME: */ - slot->alias_checksum = 0x00; // checksum for 8.3 alias - - hexdump((char *)slot, 0x20); - - slot++; - count--; - index = count; - } - -/* memcpy(p, m->internal.dir+0x220, 0x20); */ - -/* p+=0x20; */ - dentry = (mpio_dir_entry_t *)slot; - - /* find uniq 8.3 filename */ - memset(f_8_3, 0x20, 12); - f_8_3[8]='.'; - f_8_3[12]=0x00; - - i=0; - points=0; - /* count points to later find the correct file extension */ - while (i<(strlen(filename))) - { - if (filename[i] == '.') - points++; - i++; - } - - /* if we do not find any points we set the value ridiculously high, - then everything falls into place */ - if (!points) - points=1024*1024; - - i=j=0; - while ((j<8) && (points) && (i<(strlen(filename)))) - { - if (filename[i] == '.') - { - points--; - } else { - if (filename[i]!=' ') { - f_8_3[j] = toupper(filename[i]); - j++; - } - } - i++; - } - - j=i; - while((points) && (j<(strlen(filename)))) - { - if (filename[j] == '.') - points--; - j++; - } - - i=9; - while ((i<12) && (j<(strlen(filename)))) - { - f_8_3[i] = toupper(filename[j]); - i++; - j++; - } - - /* This seems like a special case to me! */ - if (strcmp(MPIO_MPIO_RECORD, filename)==0) - { - f_8_3[6]='~'; - f_8_3[7]='0'; - } - - if (mpio_dentry_find_name_8_3(m, mem, f_8_3)) - { - f_8_3[6]='~'; - f_8_3[7]='1'; - } - - while(mpio_dentry_find_name_8_3(m, mem, f_8_3)) - f_8_3[7]++; - - -/* memcpy(dentry->name,"AAAAAAAA",8); */ -/* memcpy(dentry->ext,"MP3",3); */ - -/* hexdumpn(0, f_8_3, 13); */ - - memcpy(dentry->name, f_8_3, 8); - memcpy(dentry->ext, f_8_3+9, 3); - - free(unicode); - free(fname); - - return dentry; -} - - -int -mpio_dentry_get_size(mpio_t *m, mpio_mem_t mem, BYTE *buffer) -{ - mpio_dir_entry_t *dentry; - - if (!buffer) - return -1; - - UNUSED(m); - - dentry = (mpio_dir_entry_t *)buffer; - - if ((dentry->name[0] & 0x40) && - (dentry->attr == 0x0f) && - (dentry->start[0] == 0x00) && - (dentry->start[1] == 0x00)) { - dentry++; - while ((dentry->attr == 0x0f) && - (dentry->start[0] == 0x00) && - (dentry->start[1] == 0x00)) { - /* this/these are vfat slots */ - dentry++; - } - } - dentry++; - - return(((BYTE *)dentry) - buffer); -} - -BYTE* -mpio_dentry_next(mpio_t *m, mpio_mem_t mem, BYTE *buffer) -{ - int size; - BYTE *out; - - size = mpio_dentry_get_size(m, mem, buffer); - - if (size<=0) - return NULL; - - out = buffer + size; - - if (*out == 0x00) - { - debugn(3, "no more entries\n"); - return NULL; - } - - debugn(3, "next dentry: %08x\n", out); - - return out; -} - -int -mpio_dentry_get_raw(mpio_t *m, mpio_mem_t mem, BYTE *dentry, - BYTE *buffer, int bufsize) -{ - int size; - - size = mpio_dentry_get_size(m, mem, buffer); - debugn(3, "dentry size is: 0x%02x\n", size); - - if (size < 0) - return size; - - if (size > bufsize) - return -2; - - memcpy(buffer, dentry, size); - - return size; -} - -void -mpio_dentry_copy_from_slot(BYTE *buffer, mpio_dir_slot_t *slot) -{ - memcpy(buffer, slot->name0_4, 10); - memcpy(buffer + 10, slot->name5_10, 12); - memcpy(buffer + 22, slot->name11_12, 4); -} - -void -mpio_dentry_copy_to_slot(BYTE *buffer, mpio_dir_slot_t *slot) -{ - memcpy(slot->name0_4, buffer, 10); - memcpy(slot->name5_10, buffer + 10, 12); - memcpy(slot->name11_12, buffer + 22, 4); -} - -int -mpio_dentry_get(mpio_t *m, mpio_mem_t mem, BYTE *buffer, - BYTE *filename, int filename_size, - WORD *year, BYTE *month, BYTE *day, - BYTE *hour, BYTE *minute, DWORD *fsize, BYTE *type) -{ - BYTE filename_8_3[13]; - - return mpio_dentry_get_real(m, mem, buffer, filename, filename_size, - filename_8_3, - year, month, day, hour, minute, fsize, type); -} - -/* TODO: please clean me up !!! */ -int -mpio_dentry_get_real(mpio_t *m, mpio_mem_t mem, BYTE *buffer, - BYTE *filename, int filename_size, - BYTE *filename_8_3, - WORD *year, BYTE *month, BYTE *day, - BYTE *hour, BYTE *minute, DWORD *fsize, - BYTE *type) -{ - int date, time; - int vfat = 0; - int num_slots = 0; - int slots = 0; - int in = 0, out = 0, iconv_return; - mpio_dir_entry_t *dentry; - mpio_dir_slot_t *slot; - BYTE *unicode = 0; - BYTE *uc; - BYTE *fname = 0; - iconv_t ic; - int dsize, i; - - if (buffer == NULL) - return -1; - - dentry = (mpio_dir_entry_t *)buffer; - - if ((dentry->name[0] & 0x40) && - (dentry->attr == 0x0f) && - (dentry->start[0] == 0x00) && - (dentry->start[1] == 0x00)) - { - dsize = mpio_dentry_get_size(m, mem, buffer); - debugn(3, "dentry size is: 0x%02x\n", dsize); - hexdump(buffer, dsize); - num_slots = (dsize / 0x20) - 1; - slots = num_slots - 1; - dentry++; - vfat++; - in = num_slots * 26; - out = num_slots * 13; - unicode = malloc(in + 2); - memset(unicode, 0x00, (in+2)); - uc = unicode; - fname = filename; - slot = (mpio_dir_slot_t *)buffer; - mpio_dentry_copy_from_slot(unicode + (26 * slots), slot); - slots--; - - while ((dentry->attr == 0x0f) && - (dentry->start[0] == 0x00) && - (dentry->start[1] == 0x00)) - { - /* this/these are vfat slots */ - slot = (mpio_dir_slot_t *)dentry; - mpio_dentry_copy_from_slot((unicode + (26 * slots)), slot); - dentry++; - slots--; - } - } - - if (vfat) - { - ic = iconv_open(m->charset, UNICODE); - memset(fname, 0, filename_size); - hexdumpn(4, unicode, in+2); - debugn(4, "before iconv: in: %2d - out: %2d\n", in, out); - iconv_return = iconv(ic, (char **)&uc, &in, (char **)&fname, &out); - debugn(4, "after iconv: in: %2d - out: %2d (return: %d)\n", in, out, - iconv_return); - hexdumpn(4, filename, (num_slots*13)-out); - iconv_close(ic); - } - free(unicode); - - memcpy(filename_8_3, dentry->name, 8); - i=8; - while(filename_8_3[i-1]==' ') - i--; - filename_8_3[i++] = '.'; - memcpy(filename_8_3 + i, dentry->ext, 3); - i+=3; - while(filename_8_3[i-1]==' ') - i--; - filename_8_3[i] = 0; - hexdumpn(4, filename_8_3, 13); - - if (!vfat) - { - if (filename_size >= 12) - { - snprintf(filename, 13, "%s", filename_8_3); - /* UGLY !! */ - if (((strncmp(dentry->name, ". ", 8)==0) && - (strncmp(dentry->ext, " ", 3) == 0))) - filename[1]=0; - if (((strncmp(dentry->name, ".. ", 8)==0) && - (strncmp(dentry->ext, " ", 3) == 0))) - filename[2]=0; - } else { - snprintf(filename, filename_size, "%s", "ERROR"); - } - } - - date = (dentry->date[1] * 0x100) + dentry->date[0]; - *year = date / 512 + 1980; - *month = (date / 32) & 0xf; - *day = date & 0x1f; - - time = (dentry->time[1] * 0x100) + dentry->time[0]; - *hour = time / 2048; - *minute= (time / 32) & 0x3f; - - *fsize = dentry->size[3]; - *fsize *= 0x100; - *fsize += dentry->size[2]; - *fsize *= 0x100; - *fsize += dentry->size[1]; - *fsize *= 0x100; - *fsize += dentry->size[0]; - - if (dentry->attr & 0x10) { - /* is this a directory? */ - *type = FTYPE_DIR; - } else { - *type = FTYPE_PLAIN; - } - - return(((BYTE *)dentry) - buffer); -} - -/* read "size" sectors of fat into the provided buffer */ -int -mpio_rootdir_read (mpio_t *m, mpio_mem_t mem) -{ - mpio_smartmedia_t *sm; - BYTE recvbuff[SECTOR_SIZE]; - int i; - - if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - - for (i = 0; i < DIR_NUM; i++) { - if (mpio_io_sector_read(m, mem, (sm->dir_offset + i), recvbuff)) - return 1; - - memcpy(sm->root->dir + (i * SECTOR_SIZE), recvbuff, SECTOR_SIZE); - } - - return (0); -} - -int -mpio_rootdir_clear (mpio_t *m, mpio_mem_t mem) -{ - mpio_smartmedia_t *sm; - - if (mem == MPIO_INTERNAL_MEM) sm=&m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm=&m->external; - - memset(sm->root->dir, 0x00, DIR_SIZE); - - return 0; -} - -BYTE -mpio_dentry_is_dir(mpio_t *m, mpio_mem_t mem, BYTE *p) -{ - int s; - mpio_dir_entry_t *dentry; - BYTE r; - - s = mpio_dentry_get_size(m, mem, p); - s -= DIR_ENTRY_SIZE ; - - dentry = (mpio_dir_entry_t *)p; - - while (s != 0) { - dentry++; - s -= DIR_ENTRY_SIZE ; - } - - if (dentry->attr & 0x10) { - r = MPIO_OK; - } else { - r= !MPIO_OK; - } - - return r; -} - -int -mpio_dentry_get_filesize(mpio_t *m, mpio_mem_t mem, BYTE *p) -{ - int s; - int fsize; - mpio_dir_entry_t *dentry; - - s = mpio_dentry_get_size(m, mem, p); - s -= DIR_ENTRY_SIZE ; - - dentry = (mpio_dir_entry_t *)p; - - while (s != 0) { - dentry++; - s -= DIR_ENTRY_SIZE ; - } - - if (dentry->attr & 0x10) { - fsize = BLOCK_SIZE; - } else { - fsize = dentry->size[3]; - fsize *= 0x100; - fsize += dentry->size[2]; - fsize *= 0x100; - fsize += dentry->size[1]; - fsize *= 0x100; - fsize += dentry->size[0]; - } - - return fsize; -} - -long -mpio_dentry_get_time(mpio_t *m, mpio_mem_t mem, BYTE *p) -{ - int s; - mpio_dir_entry_t *dentry; - - s = mpio_dentry_get_size(m, mem, p); - s -= DIR_ENTRY_SIZE ; - - dentry = (mpio_dir_entry_t *)p; - - while (s != 0) { - dentry++; - s -= DIR_ENTRY_SIZE ; - } - - - return date_dos2unix((dentry->time[0]+dentry->time[1]*0x100), - (dentry->date[0]+dentry->date[1]*0x100)); -} - - - -mpio_fatentry_t * -mpio_dentry_get_startcluster(mpio_t *m, mpio_mem_t mem, BYTE *p) -{ - int s; - DWORD cluster; - BYTE i_index; - mpio_dir_slot_t *dentry; - mpio_fatentry_t *new; - - s = mpio_dentry_get_size(m, mem, p); - s -= DIR_ENTRY_SIZE ; - - dentry = (mpio_dir_slot_t *)p; - - while (s != 0) { - dentry++; - s -= DIR_ENTRY_SIZE ; - } - - cluster = dentry->start[1] * 0x100 + dentry->start[0]; - - if (mem == MPIO_INTERNAL_MEM) - { - i_index=dentry->start[0]; - cluster = mpio_fat_internal_find_startsector(m, cluster); - } - if (cluster < 0) - return NULL; - - new = mpio_fatentry_new(m, mem, cluster, FTYPE_MUSIC); - - if (mem == MPIO_INTERNAL_MEM) - { - new->entry=cluster; - new->i_index=i_index; - mpio_fatentry_entry2hw(m, new); - } - - debugn(2,"i_index=0x%02x\n", new->i_index); - - return new; -} - -int -mpio_dentry_put(mpio_t *m, mpio_mem_t mem, - BYTE *filename, int filename_size, - time_t date, DWORD fsize, WORD ssector, BYTE attr) -{ - BYTE *p; - mpio_dir_entry_t *dentry; - - /* read and copied code from mtools-3.9.8/directory.c - * to make this one right - */ - struct tm *now; - time_t date2 = date; - unsigned char hour, min_hi, min_low, sec; - unsigned char year, month_hi, month_low, day; - - - p = mpio_directory_open(m, mem); - if (p) { - while (*p != 0x00) - p += 0x20; - } else { - if (mem == MPIO_EXTERNAL_MEM) - p = m->external.cdir->dir; - if (mem == MPIO_INTERNAL_MEM) - p = m->internal.cdir->dir; - } - - dentry = mpio_dentry_filename_write(m, mem, p, filename, filename_size); - - dentry->attr = attr; - dentry->lcase = 0x00; - - /* read and copied code from mtools-3.9.8/directory.c - * to make this one right - */ - now = localtime(&date2); - dentry->ctime_ms = 0; - hour = now->tm_hour << 3; - min_hi = now->tm_min >> 3; - min_low = now->tm_min << 5; - sec = now->tm_sec / 2; - dentry->ctime[1] = dentry->time[1] = hour + min_hi; - dentry->ctime[0] = dentry->time[0] = min_low + sec; - year = (now->tm_year - 80) << 1; - month_hi = (now->tm_mon + 1) >> 3; - month_low = (now->tm_mon + 1) << 5; - day = now->tm_mday; - dentry -> adate[1] = dentry->cdate[1] = dentry->date[1] = year + month_hi; - dentry -> adate[0] = dentry->cdate[0] = dentry->date[0] = month_low + day; - - dentry->size[0] = fsize & 0xff; - dentry->size[1] = (fsize / 0x100) & 0xff; - dentry->size[2] = (fsize / 0x10000) & 0xff; - dentry->size[3] = (fsize / 0x1000000) & 0xff; - dentry->start[0] = ssector & 0xff; - dentry->start[1] = ssector / 0x100; - - /* what do we want to return? */ - return 0; -} - -BYTE * -mpio_dentry_find_name_8_3(mpio_t *m, BYTE mem, BYTE *filename) -{ - BYTE *p; - BYTE bdummy; - WORD wdummy; - BYTE fname[129]; - BYTE fname_8_3[13]; - DWORD ddummy; - BYTE *found = 0; - int i, j, len; - - p = mpio_directory_open(m, mem); - while ((p) && (!found)) { - mpio_dentry_get_real (m, mem, p, - fname, 128, - fname_8_3, - &wdummy, &bdummy, &bdummy, - &bdummy, &bdummy, &ddummy, &bdummy); - if ((strcmp(fname_8_3, filename) == 0) && - (strcmp(filename,fname_8_3) == 0)) { - found = p; - p = NULL; - } - - p = mpio_dentry_next(m, mem, p); - } - - return found; -} - -BYTE * -mpio_dentry_find_name(mpio_t *m, BYTE mem, BYTE *filename) -{ - BYTE *p; - BYTE bdummy; - WORD wdummy; - BYTE fname[129]; - DWORD ddummy; - BYTE *found = 0; - - p = mpio_directory_open(m, mem); - while ((p) && (!found)) { - mpio_dentry_get (m, mem, p, - fname, 128, - &wdummy, &bdummy, &bdummy, - &bdummy, &bdummy, &ddummy, &bdummy); - if ((strcmp(fname,filename) == 0) && (strcmp(filename,fname) == 0)) { - found = p; - p = NULL; - } - - p = mpio_dentry_next(m, mem, p); - } - - return found; -} - - -int -mpio_dentry_delete(mpio_t *m, BYTE mem, BYTE *filename) -{ - mpio_smartmedia_t *sm; - BYTE *start; - int size; - BYTE tmp[DIR_SIZE]; - - if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - - start = mpio_dentry_find_name(m, mem, filename); - - /* second try */ - if (!start) - start = mpio_dentry_find_name_8_3(m, mem, filename); - - if (!start) { - debugn(2, "could not find file: %s\n", filename); - return 0; - } - - size = mpio_dentry_get_size(m, mem, start); - - if (size <= 0) { - debug("fatal error in mpio_dentry_delete\n"); - return 0; - } - - debugn(5, "size: %2x\n", size); - - /* clear new buffer */ - memset(tmp, 0, DIR_SIZE); - /* copy before delete */ - if (start != sm->cdir->dir) - memcpy(tmp, sm->cdir->dir, (start - (sm->cdir->dir))); - /* copy after delete */ - memcpy(tmp + (start - (sm->cdir->dir)), (start + size), - (sm->cdir->dir + DIR_SIZE - (start + size))); - - memcpy(sm->cdir->dir, tmp, DIR_SIZE); - - return 0; -} - -void -mpio_dentry_move(mpio_t *m,mpio_mem_t mem,BYTE *m_file,BYTE *a_file) { - mpio_smartmedia_t *sm; - - BYTE *t0,*t1,*t2,*t3; - - int s0,s1,s2,s3; - int m_file_s,a_file_s; - BYTE tmp[DIR_SIZE]; - BYTE *b_file; - - if (mem == MPIO_INTERNAL_MEM) - sm = &m->internal; - - if (mem == MPIO_EXTERNAL_MEM) - sm = &m->external; - - if (m_file == a_file) - return; - - m_file_s = mpio_dentry_get_size(m, mem, m_file); - a_file_s = mpio_dentry_get_size(m, mem, a_file); - - // -- we determine the 'befor' file. The start of the region which needs to be moved down - // -- if a_file == NULL this is the start of the directory. - - if(a_file==NULL) { - b_file = sm->cdir->dir; - } else { - b_file = a_file + a_file_s; - } - - if(b_file == m_file) { - return; - } - - /** We disect the whole directory in four pieces. - in different ways according to the direction - the directoy entry is moved (up or down). - */ - - if(m_file > b_file) { - fprintf(stderr,"U "); - t0 = sm->cdir->dir; - s0 = b_file - sm->cdir->dir; - - t1 = m_file; - s1 = m_file_s; - - t2 = b_file; - s2 = m_file - b_file; - - t3 = m_file + m_file_s; - s3 = DIR_SIZE - (m_file-sm->cdir->dir) - m_file_s; - } else { - fprintf(stderr,"D "); - t0 = sm->cdir->dir; - s0 = m_file - sm->cdir->dir; - - t1 = m_file + m_file_s; - s1 = a_file + a_file_s - (m_file + m_file_s); - - t2 = m_file; - s2 = m_file_s; - - t3 = b_file; - s3 = DIR_SIZE - (b_file - sm->cdir->dir); - } - - if(s0) { - memcpy(tmp,t0,s0); - } - - if(s1) { - memcpy(tmp + s0 , t1 , s1 ); - } - - if(s2) { - memcpy(tmp + s0 + s1, t2, s2); - } - - if(s3) { - memcpy(tmp + s0 + s1 + s2, t3, s3); - } - - fprintf(stderr," -- t0=%ld, s0=%d, t1=%ld, s1=%d, t2=%ld, s2=%d, t3=%ld, s3=%d; sum=%d, DIRSIZE=%d\n", - (long)t0,s0,(long)t1,s1,(long)t2,s2,(long)t3,s3,s0+s1+s2+s3,DIR_SIZE); - - memcpy(sm->cdir->dir, tmp, DIR_SIZE); -} - -void -mpio_dentry_switch(mpio_t *m, mpio_mem_t mem, BYTE *file1, BYTE *file2) -{ - mpio_smartmedia_t *sm; - BYTE *p1, *p2; - BYTE *current; - int size1 , size2; - BYTE tmp[DIR_SIZE]; - - if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - - if (file1 == file2) - return; - - if (file1cdir->dir) - { - memcpy(current, sm->cdir->dir, p1 - sm->cdir->dir); - current += (p1 - sm->cdir->dir); - } - /* the second file*/ - memcpy(current, p2, size2); - current += size2; - /* between the files */ - memcpy(current, p1+size1, (p2-p1-size1)); - current += (p2-p1-size1); - /* the first file */ - memcpy(current, p1, size1); - current += size1; - /* and the rest */ - memcpy(current, p2+size2, (sm->cdir->dir+DIR_SIZE-p2-size2)); - - /* really update the directory */ - memcpy(sm->cdir->dir, tmp, DIR_SIZE); - - return; -} - -void -mpio_dentry_rename(mpio_t *m, mpio_mem_t mem, BYTE *p, BYTE *newfilename) -{ - mpio_smartmedia_t *sm; - BYTE *current; - int size1 , size2, offset, offset_d1, offset_d2; - BYTE tmp[DIR_SIZE]; - - if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - - current = sm->cdir->dir; - - size1 = mpio_dentry_get_size(m, mem, p) / 0x20; - size2 = (strlen(newfilename) / 13) + 1; - if ((strlen(newfilename) % 13)) - size2++; - - debugn(2, "size1: %d size2: %d\n", size1, size2); - - /* we want to copy the last dentry to the right location - * so we avoid reading and writing the same information - */ - size1--; /* kludge so we can do compares without worry */ - size2--; - - memcpy(tmp, current, DIR_SIZE); - offset = p - current; - offset_d1 = offset + (size1 * 0x20); - offset_d2 = offset + (size2 * 0x20); - - if (size2>size1) { - /* new filename needs at least one slot more than the old one */ - memcpy(current+offset_d2, tmp+offset_d1, (DIR_SIZE-offset_d1)); - } - - if (size2> offset) & 0x01 ); -} - -int -mpio_ecc_256_gen(BYTE *data, BYTE *ecc) -{ - BYTE p1, p1_; - BYTE p2, p2_; - BYTE p4, p4_; - - BYTE p08, p08_; - BYTE p16, p16_; - BYTE p32, p32_; - BYTE p64, p64_; - - BYTE p0128, p0128_; - BYTE p0256, p0256_; - BYTE p0512, p0512_; - BYTE p1024, p1024_; - - int i, j; - - /* init */ - p1=p1_=0; - p2=p2_=0; - p4=p4_=0; - - p08=p08_=0; - p16=p16_=0; - p32=p32_=0; - p64=p64_=0; - - p0128=p0128_=0; - p0256=p0256_=0; - p0512=p0512_=0; - p1024=p1024_=0; - - /* vertical */ - for (i=0; i<256; i++) { - - /* p1, p1_ */ - p1 ^= (get_bit(data[i], 7) ^ - get_bit(data[i], 5) ^ - get_bit(data[i], 3) ^ - get_bit(data[i], 1)); - p1_^= (get_bit(data[i], 6) ^ - get_bit(data[i], 4) ^ - get_bit(data[i], 2) ^ - get_bit(data[i], 0)); - - /* p2, p2_ */ - p2 ^= (get_bit(data[i], 7) ^ - get_bit(data[i], 6) ^ - get_bit(data[i], 3) ^ - get_bit(data[i], 2)); - p2_^= (get_bit(data[i], 5) ^ - get_bit(data[i], 4) ^ - get_bit(data[i], 1) ^ - get_bit(data[i], 0)); - - /* p4, p4_ */ - p4 ^= (get_bit(data[i], 7) ^ - get_bit(data[i], 6) ^ - get_bit(data[i], 5) ^ - get_bit(data[i], 4)); - p4_^= (get_bit(data[i], 3) ^ - get_bit(data[i], 2) ^ - get_bit(data[i], 1) ^ - get_bit(data[i], 0)); - } - - /* horizontal */ - for (i=0; i<8; i++) { - - for (j=0; j<256; j++) { - - /* p08, p08_ */ - if ((j & 0x01) == 0) - p08_^= get_bit(data[j], i); - if ((j & 0x01) == 1) - p08 ^= get_bit(data[j], i); - - /* p16, p16_ */ - if (((j/2) & 0x01) == 0) - p16_^= get_bit(data[j], i); - if (((j/2) & 0x01) == 1) - p16^= get_bit(data[j], i); - - /* p32, p32_ */ - if (((j/4) & 0x01) == 0) - p32_^= get_bit(data[j], i); - if (((j/4) & 0x01) == 1) - p32^= get_bit(data[j], i); - - /* p64, p64_ */ - if (((j/8) & 0x01) == 0) - p64_^= get_bit(data[j], i); - if (((j/8) & 0x01) == 1) - p64^= get_bit(data[j], i); - - - /* p0128, p0128_ */ - if (((j/16) & 0x01) == 0) - p0128_^= get_bit(data[j], i); - if (((j/16) & 0x01) == 1) - p0128 ^= get_bit(data[j], i); - - /* p0256, p0256_ */ - if (((j/32) & 0x01) == 0) - p0256_^= get_bit(data[j], i); - if (((j/32) & 0x01) == 1) - p0256^= get_bit(data[j], i); - - /* p0512, p0512_ */ - if (((j/64) & 0x01) == 0) - p0512_^= get_bit(data[j], i); - if (((j/64) & 0x01) == 1) - p0512^= get_bit(data[j], i); - - /* p1024, p1024_ */ - if (((j/128) & 0x01) == 0) - p1024_^= get_bit(data[j], i); - if (((j/128) & 0x01) == 1) - p1024^= get_bit(data[j], i); - - } - } - - ecc[0]=~((p64 << 7) | (p64_ << 6) | - (p32 << 5) | (p32_ << 4) | - (p16 << 3) | (p16_ << 2) | - (p08 << 1) | (p08_ << 0)); - - ecc[1]=~((p1024 << 7) | (p1024_ << 6) | - (p0512 << 5) | (p0512_ << 4) | - (p0256 << 3) | (p0256_ << 2) | - (p0128 << 1) | (p0128_ << 0)); - - ecc[2]=~((p4 << 7) | (p4_ << 6) | - (p2 << 5) | (p2_ << 4) | - (p1 << 3) | (p1_ << 2)); - - return 0; -} - - -int -mpio_ecc_256_check(BYTE *data, BYTE *ecc) -{ - BYTE own_ecc[3]; - BYTE check[3]; - BYTE c; - BYTE line, col; - - int v, i; - - mpio_ecc_256_gen(data, own_ecc); - if ((own_ecc[0]^ecc[0])| - (own_ecc[1]^ecc[1])| - (own_ecc[2]^ecc[2])) { - debugn(2, "ECC %2x %2x %2x vs. %2x %2x %2x\n", - ecc[0], ecc[1], ecc[2], own_ecc[0], own_ecc[1], own_ecc[2]); - check[0] = (ecc[0] ^ own_ecc[0]); - check[1] = (ecc[1] ^ own_ecc[1]); - check[2] = (ecc[2] ^ own_ecc[2]); - - v=1; - for(i=0; i<4; i++) - { - if (!((get_bit(check[1], i*2) ^ - (get_bit(check[1], i*2+1))))) - v=0; - if (!((get_bit(check[0], i*2) ^ - (get_bit(check[0], i*2+1))))) - v=0; - } - for(i=1; i<4; i++) - { - if (!((get_bit(check[2], i*2) ^ - (get_bit(check[2], i*2+1))))) - v=0; - } - - if (v) { - debug("correctable error detected ... fixing the bit\n"); - line = get_bit(check[1], 7) * 128 + - get_bit(check[1], 5) * 64 + - get_bit(check[1], 3) * 32 + - get_bit(check[1], 1) * 16 + - get_bit(check[0], 7) * 8 + - get_bit(check[0], 5) * 4 + - get_bit(check[0], 3) * 2 + - get_bit(check[0], 1); - col = get_bit(check[2], 7) * 4 + - get_bit(check[2], 5) * 2 + - get_bit(check[2], 3); - debug ("error in line: %d , col %d\n", line, col); - debug ("defect byte is: %02x\n", data[line]); - data[line] ^= ( 1 << col); - debug ("fixed byte is: %02x\n", data[line]); - } else { - debug("uncorrectable error detected. Sorry you lose!\n"); - return 1; - } - } - - return 0; -} - - - - diff --git a/libmpio/ecc.h b/libmpio/ecc.h deleted file mode 100644 index 6b04191..0000000 --- a/libmpio/ecc.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * $Id: ecc.h,v 1.2 2002/10/26 13:07:43 germeier Exp $ - * - * Library for USB MPIO-* - * - * Markus Germeier (mager@tzi.de) - * - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * */ - -#ifndef _MPIO_ECC_H_ -#define _MPIO_ECC_H_ - -#include "defs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* 256 Bytes Data, 3 Byte ECC to generate */ -int mpio_ecc_256_gen(BYTE *, BYTE *); -/* 256 Bytes Data, 3 Bytes ECC to check and possibly correct */ -int mpio_ecc_256_check(BYTE *, BYTE*); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libmpio/fat.c b/libmpio/fat.c deleted file mode 100644 index f67c2c1..0000000 --- a/libmpio/fat.c +++ /dev/null @@ -1,1039 +0,0 @@ -/* - * - * $Id: fat.c,v 1.27 2003/04/18 13:53:01 germeier Exp $ - * - * Library for USB MPIO-* - * - * Markus Germeier (mager@tzi.de) - * - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * */ - -#include "fat.h" -#include "io.h" -#include "debug.h" - -#include -#include - -/* I'm lazy so I hard code all the values */ - -BYTE mpio_part_016[0x10] = { - 0x80, 0x02, 0x0a, 0x00, 0x01, 0x03, 0x50, 0xf3, - 0x29, 0x00, 0x00, 0x00, 0xd7, 0x7c, 0x00, 0x00 -}; -BYTE mpio_part_032[0x10] = { - 0x80, 0x02, 0x04, 0x00, 0x01, 0x07, 0x50, 0xf3, - 0x23, 0x00, 0x00, 0x00, 0xdd, 0xf9, 0x00, 0x00 -}; -BYTE mpio_part_064[0x10] = { - 0x80, 0x01, 0x18, 0x00, 0x01, 0x07, 0x60, 0xf3, - 0x37, 0x00, 0x00, 0x00, 0xc9, 0xf3, 0x01, 0x00 -}; -BYTE mpio_part_128[0x10] = { - 0x80, 0x01, 0x10, 0x00, 0x06, 0x0f, 0x60, 0xf3, - 0x2f, 0x00, 0x00, 0x00, 0xd1, 0xe7, 0x03, 0x00 -}; - -/* ------------------------- */ - -BYTE mpio_pbr_head[0x10] = { - 0xe9, 0x00, 0x00, 0x4d, 0x53, 0x44, 0x4f, 0x53, - 0x35, 0x2e, 0x30, 0x00, 0x02, 0x20, 0x01, 0x00 -}; -BYTE mpio_pbr_016[0x13] = { - 0x02, 0x00, 0x01, 0xd7, 0x7c, 0xf8, 0x03, 0x00, - 0x10, 0x00, 0x04, 0x00, 0x29, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00 -}; -BYTE mpio_pbr_032[0x13] = { - 0x02, 0x00, 0x01, 0xdd, 0xf9, 0xf8, 0x06, 0x00, - 0x10, 0x00, 0x08, 0x00, 0x23, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00 -}; -BYTE mpio_pbr_064[0x13] = { - 0x02, 0x00, 0x01, 0x00, 0x00, 0xf8, 0x0c, 0x00, - 0x20, 0x00, 0x08, 0x00, 0x37, 0x00, 0x00, 0x00, - 0xc9, 0xf3, 0x01 -}; -BYTE mpio_pbr_128[0x13] = { - 0x02, 0x00, 0x01, 0x00, 0x00, 0xf8, 0x20, 0x00, - 0x20, 0x00, 0x10, 0x00, 0x2f, 0x00, 0x00, 0x00, - 0xd1, 0xe7, 0x03 -}; - -BYTE * -mpio_mbr_gen(BYTE size) -{ - BYTE *p; - - p = (BYTE *)malloc(SECTOR_SIZE); - memset(p, 0, SECTOR_SIZE); - - /* MBR signature */ - p[0x1fe] = 0x55; - p[0x1ff] = 0xaa; - - /* frist boot partition */ - switch(size) - { - case 16: - memcpy(p+0x1be, mpio_part_016, 0x10); - break; - case 32: - memcpy(p+0x1be, mpio_part_032, 0x10); - break; - case 64: - memcpy(p+0x1be, mpio_part_064, 0x10); - break; - case 128: - memcpy(p+0x1be, mpio_part_128, 0x10); - break; - default: - debug("This should never happen! (%d)\n", size); - exit(-1); - } - - /* all other partitions are set to zero */ - - return p; -} - -BYTE * -mpio_pbr_gen(BYTE size) -{ - BYTE *p; - - p = (BYTE *)malloc(SECTOR_SIZE); - memset(p, 0, SECTOR_SIZE); - - /* MBR signature */ - p[0x1fe] = 0x55; - p[0x1ff] = 0xaa; - - memcpy(p, mpio_pbr_head, 0x10); - /* BIOS parameter etc. */ - switch(size) - { - case 16: - memcpy(p+0x10, mpio_pbr_016, 0x13); - break; - case 32: - memcpy(p+0x10, mpio_pbr_032, 0x13); - break; - case 64: - memcpy(p+0x10, mpio_pbr_064, 0x13); - break; - case 128: - memcpy(p+0x10, mpio_pbr_128, 0x13); - break; - default: - debug("This should never happen! (%d)\n", size); - exit(-1); - } - - /* FAT id */ - if (size >=128) { - strcpy(p+0x36, "FAT16"); - } else { - strcpy(p+0x36, "FAT12"); - } - - return p; -} - -int -mpio_mbr_eval(mpio_smartmedia_t *sm) -{ - BYTE *pe; /* partition entry */ - int sector, head, cylinder; - - if ((sm->mbr[0x1fe] != 0x55) || (sm->mbr[0x1ff] != 0xaa)) - { - debug("This is not the MBR!\n"); - return 1; - } - - /* always use the first partition */ - /* we probably don't need to support others */ - pe = sm->mbr + 0x1be; - - head = (int)(*(pe+0x01) & 0xff); - sector = (int)(*(pe+0x02) & 0x3f); - cylinder = (int)((*(pe+0x02) >> 6) * 0x100 + *(pe + 0x03)); - - sm->pbr_offset=(cylinder * sm->geo.NumHead + head ) * - sm->geo.NumSector + sector - 1; - - return 0; - -} - - -int -mpio_pbr_eval(mpio_smartmedia_t *sm) -{ - BYTE *bpb; /* BIOS Parameter Block */ - int total_sector; - long temp; - - if ((sm->pbr[0x1fe] != 0x55) || (sm->pbr[0x1ff] != 0xaa)) - { - debug("This is not the PBR!\n"); - return 1; - } - - if (strncmp((sm->pbr+0x36),"FAT", 3) != 0) - { - debug("Did not find an FAT signature, *not* good!\n"); - return 2; - } - - bpb = sm->pbr + 0x0b; - - total_sector = (*(sm->pbr+0x14) * 0x100 + *(sm->pbr + 0x13)); - if (!total_sector) - total_sector = (*(sm->pbr+0x23) * 0x1000000 + - *(sm->pbr+0x22) * 0x10000 + - *(sm->pbr+0x21) * 0x100 + - *(sm->pbr+0x20)); - - /* 128 MB need 2 Bytes instead of 1.5 */ - if (sm->size != 128) - { - temp = ((total_sector / 0x20 * 0x03 / 0x02 / 0x200) + 0x01); - } else { - temp = ((total_sector / 0x20 * 0x02 / 0x200) + 0x01); - } - - sm->fat_offset = sm->pbr_offset + 0x01; - sm->fat_size = temp; - sm->fat_nums = *(sm->pbr + 0x10); - sm->dir_offset = sm->pbr_offset + 0x01 + temp * 2; - sm->max_cluster = (total_sector / BLOCK_SECTORS); - /* fix max clusters */ - temp*=2; - while (temp>=0x10) - { - sm->max_cluster--; - temp-=BLOCK_SECTORS; - } - - return 0; -} - - -void -mpio_fatentry_hw2entry(mpio_t *m, mpio_fatentry_t *f) -{ - mpio_smartmedia_t *sm; - BYTE chip, t; - DWORD value; - - if (f->mem == MPIO_INTERNAL_MEM) - { - sm = &m->internal; - - if (f->hw_address == 0xffffffff) - return ; - - value = f->hw_address; - t = value >> 24; - chip = 0; - - while(t/=2) - chip++; - - value &= 0xffffff; - value /= 0x20; - value += chip * (sm->max_cluster / sm->chips); - - f->entry = value; - - return; - } - - debug("This should never happen!\n"); - exit(-1); - - return; -} - - -void -mpio_fatentry_entry2hw(mpio_t *m, mpio_fatentry_t *f) -{ - mpio_smartmedia_t *sm; - DWORD cluster; - BYTE chip; - - if (f->mem == MPIO_INTERNAL_MEM) - { - sm = &m->internal; - - chip = f->entry / (sm->max_cluster / sm->chips); - cluster = f->entry - ((sm->max_cluster / sm->chips) * chip); - cluster *= 0x20; - cluster += 0x01000000 * (1 << chip); - - f->hw_address=cluster; - - return; - } - - debug("This should never happen!\n"); - exit(-1); - - return; -} - - - -int -mpio_bootblocks_read (mpio_t *m, mpio_mem_t mem) -{ - mpio_smartmedia_t *sm=0; - - int error; - - /* this should not be needed for internal memory, but ... */ - if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - if (!sm) - return 1; - - /* in case the external mem is defective we need this here! */ - sm->fat=0; - sm->fat_size=0; - sm->fat_nums=0; - - /* TODO: check a few things more, just to be sure */ - - /* read CIS (just in case it might me usefull) */ - if (mpio_io_sector_read(m, mem, MPIO_BLOCK_CIS, sm->cis)) - { - debug("error reading CIS\n"); - return 1; - } - - /* read MBR */ - /* the MBR is always located @ logical block 0, sector 0! */ - if (mpio_io_sector_read(m, mem, 0, sm->mbr)) - { - debug("error reading MBR\n"); - return 1; - } - - if (error=mpio_mbr_eval(sm)) - { - debug("problem with the MBR (#%d), so I won't try to access the card any" - "further.\n", error); - return 1; - } - - /* read PBR */ - if (mpio_io_sector_read(m, mem, sm->pbr_offset, sm->pbr)) - { - debug("error reading PBR\n"); - return 1; - } - - if (error=mpio_pbr_eval(sm)) - { - debug("problem with the PBR (#%d), so I won't try to access the card any" - "further.\n", error); - return 1; - } - - return 0; -} - -mpio_fatentry_t * -mpio_fatentry_new(mpio_t *m, mpio_mem_t mem, DWORD sector, BYTE ftype) -{ - mpio_smartmedia_t *sm; - mpio_fatentry_t *new; - - new = malloc (sizeof(mpio_fatentry_t)); - - if (new) - { - new->m = m; - new->mem = mem; - new->entry = sector; - - /* init FAT entry */ - memset(new->i_fat, 0xff, 0x10); - new->i_fat[0x00] = 0xaa; /* start of file */ - new->i_fat[0x06] = ftype; - new->i_fat[0x0b] = 0x00; - new->i_fat[0x0c] = 0x00; - new->i_fat[0x0d] = 0x00; - if (m->model >= MPIO_MODEL_FD100) { - /* 0x0e is a copy of the file index number */ - new->i_fat[0x0f] = 0x00; - } else { - new->i_fat[0x0e] = 'P'; - new->i_fat[0x0f] = 'C'; - } - } - - if (mem == MPIO_INTERNAL_MEM) - mpio_fatentry_entry2hw(m, new); - - return new; -} - -int -mpio_fatentry_plus_plus(mpio_fatentry_t *f) -{ - f->entry++; - - if (f->mem == MPIO_INTERNAL_MEM) { - if (f->entry >= f->m->internal.max_cluster) - { - f->entry--; - mpio_fatentry_entry2hw(f->m, f); - return 0; - } - mpio_fatentry_entry2hw(f->m, f); - } - - if (f->mem == MPIO_EXTERNAL_MEM) { - if (f->entry > f->m->external.max_cluster) - { - f->entry--; - return 0; - } - } - - return 1; -} - - -/* read "fat_size" sectors of fat into the provided buffer */ -int -mpio_fat_read (mpio_t *m, mpio_mem_t mem, - mpio_callback_init_t progress_callback) -{ - mpio_smartmedia_t *sm; - BYTE recvbuff[SECTOR_SIZE]; - int i; - - if (mem == MPIO_INTERNAL_MEM) - { - sm = &m->internal; - if (mpio_io_spare_read(m, mem, 0, sm->size, 0, sm->fat, - (sm->fat_size * SECTOR_SIZE), progress_callback)) - return 1; - return 0; - } - - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - - if (!sm) - return 1; - - for (i = 0; i < sm->fat_size; i++) { - if (mpio_io_sector_read(m, mem, (sm->fat_offset + i), recvbuff)) - return 1; - - memcpy(sm->fat + (i * SECTOR_SIZE), recvbuff, SECTOR_SIZE); - } - - return (0); -} - -int -mpio_fatentry_free(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f ) -{ - int e,i ; - mpio_smartmedia_t *sm; - - if (mem == MPIO_INTERNAL_MEM) { - sm = &m->internal; - e = f->entry * 0x10; - - /* be more strict to avoid writing - * to defective blocks! - */ - i=0; - while (i<0x10) - { - if (sm->fat[e+i] != 0xff) - return 0; - i++; - } - return 1; - } - - if (mem == MPIO_EXTERNAL_MEM) { - sm = &m->internal; - if (mpio_fatentry_read(m, mem, f) == 0) - return 1; - } - - return 0; -} - -DWORD -mpio_fatentry_read(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f ) -{ - mpio_smartmedia_t *sm; - int e; - int v; - - if (mem == MPIO_INTERNAL_MEM) { - sm = &m->internal; - e = f->entry * 0x10; - if (mpio_fatentry_is_defect(m, mem, f)) - return 0xffffffff; - - /* this is a special system file! */ - if((sm->fat[e+6] != FTYPE_MUSIC) && - (sm->fat[e+7] == 0xff) && - (sm->fat[e+8] == 0x00) && - (sm->fat[e+9] == 0xff) && - (sm->fat[e+10] == 0xff)) - return 0xffffffff; - /* this is a special system file! */ -/* this is not correct!! */ -/* if (sm->fat[e+6] == FTYPE_CONF) */ -/* return 0xffffffff; */ - /* this is a special system file! */ - if((sm->fat[e+6] != FTYPE_MUSIC) && - (sm->fat[e+0x0b] == 0xff) && - (sm->fat[e+0x0c] == 0xff) && - (sm->fat[e+0x0d] == 0xff)) - return 0xffffffff; - - if((sm->fat[e+7] == 0xff) && - (sm->fat[e+8] == 0xff) && - (sm->fat[e+9] == 0xff) && - (sm->fat[e+10] == 0xff)) - return 0xffffffff; - - v = sm->fat[e+7] * 0x1000000 + - sm->fat[e+8] * 0x10000 + - sm->fat[e+9] * 0x100 + - sm->fat[e+10]; - - return v; - } - - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - - if (!sm->fat) - { - debug ("error, no space for FAT allocated!\n"); - return 0; - } - - - if (sm->size == 128) { - /* 2 Byte per entry */ - e = f->entry * 2; - v = sm->fat[e + 1] * 0x100 + sm->fat[e]; - } else { - /* 1.5 Byte per entry */ - /* Nibble order: x321 */ - e = (f->entry * 3 / 2); -/* printf("mager: byte (%d/%d)\n", e, e+1); */ - if ((f->entry & 0x01) == 0) { - /* LLxH */ - /* 21x3 */ - v = (sm->fat[e + 1] & 0x0f) * 0x100 + sm->fat[e]; - } else { - /* 1x32 */ - v = (sm->fat[e + 1] * 0x10) + (sm->fat[e] >> 4); - } - } - - return v; -} - -int -mpio_fatentry_write(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f, WORD value) -{ - mpio_smartmedia_t *sm; - int e; - BYTE backup; - - if (mem == MPIO_INTERNAL_MEM) - { - debug("This should not be used for internal memory!\n"); - exit(-1); - } - - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - - if (sm->size == 128) - { - /* 2 Byte per entry */ - e = f->entry * 2; - sm->fat[e] = value & 0xff; - sm->fat[e + 1] = (value >> 8 ) & 0xff; - } else { - /* 1.5 Byte per entry */ - e = (f->entry * 3 / 2); - if ((f->entry & 0x01) == 0) { - /* 21x3 */ - sm->fat[e] = value & 0xff; - backup = sm->fat[e + 1] & 0xf0; - sm->fat[e + 1] = backup | (( value / 0x100 ) & 0x0f); - } else { - /* 1x32 */ - sm->fat[e + 1] = (value / 0x10) & 0xff; - backup = sm->fat[e] & 0x0f; - sm->fat[e] = backup | ( (value * 0x10) & 0xf0 ); - } - } - - return 0; -} - -int -mpio_fat_internal_find_startsector(mpio_t *m, BYTE start) -{ - mpio_fatentry_t *f; - mpio_smartmedia_t *sm = &m->internal; - int found=-1; - - f = mpio_fatentry_new(m, MPIO_INTERNAL_MEM, 0, FTYPE_MUSIC); - - while(mpio_fatentry_plus_plus(f)) - { - if ((sm->fat[f->entry * 0x10] == 0xaa) && - (sm->fat[f->entry * 0x10 + 1] == start)) - found=f->entry; - } - - free(f); - - return found; -} - -BYTE -mpio_fat_internal_find_fileindex(mpio_t *m) -{ - mpio_fatentry_t *f; - mpio_smartmedia_t *sm = &m->internal; - BYTE index[256]; - BYTE found; /* hmm, ... */ - - memset(index, 1, 256); - - f = mpio_fatentry_new(m, MPIO_INTERNAL_MEM, 0, FTYPE_MUSIC); - while(mpio_fatentry_plus_plus(f)) - { - if (sm->fat[f->entry * 0x10 + 1] != 0xff) - index[sm->fat[f->entry * 0x10 + 1]] = 0; - } - free(f); - - found=6; - while((found<256) && (!index[found])) - found++; - - if (found==256) - { - debug("Oops, did not find a new fileindex!\n" - "This should never happen, aborting now!, Sorry!\n"); - exit(-1); - } - - return found; -} - - -int -mpio_fat_free_clusters(mpio_t *m, mpio_mem_t mem) -{ - mpio_smartmedia_t *sm; - mpio_fatentry_t *f; - int i; - int e = 0; - int fsize; - - if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - - if (sm->fat) - { - f = mpio_fatentry_new(m, mem, 0, FTYPE_MUSIC); - do - { - if (mpio_fatentry_free(m, mem, f)) - e++; - } while (mpio_fatentry_plus_plus(f)); - free(f); - } else { - f = 0; - } - - - return (e * 16); -} - -mpio_fatentry_t * -mpio_fatentry_find_free(mpio_t *m, mpio_mem_t mem, BYTE ftype) -{ - mpio_fatentry_t *f; - - f = mpio_fatentry_new(m, mem, 1, ftype); - - while(mpio_fatentry_plus_plus(f)) - { - if (mpio_fatentry_free(m, mem, f)) - return f; - } - - free(f); - - return NULL; -} - -int -mpio_fatentry_next_free(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f) -{ - mpio_fatentry_t backup; - - memcpy(&backup, f, sizeof(mpio_fatentry_t)); - - while(mpio_fatentry_plus_plus(f)) - { - if (mpio_fatentry_free(m, mem, f)) - { - if (mem == MPIO_INTERNAL_MEM) - f->i_fat[0x00] = 0xee; - return 1; - } - } - - /* no free entry found, restore entry */ - memcpy(f, &backup, sizeof(mpio_fatentry_t)); - - return 0; -} - -int -mpio_fatentry_next_entry(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f) -{ - mpio_smartmedia_t *sm; - DWORD value; - DWORD endvalue; - - value = mpio_fatentry_read(m, mem, f); - - if (value == 0xaaaaaaaa) - return -1; - - if (mem == MPIO_INTERNAL_MEM) - { - sm = &m->internal; - f->hw_address = value; - - mpio_fatentry_hw2entry(m, f); - - endvalue = 0xffffffff; - } - - - if (mem == MPIO_EXTERNAL_MEM) - { - sm = &m->external; - f->entry = value; - - if (sm->size==128) - { - endvalue = 0xfff8; - } else { - endvalue = 0xff8; - } - } - - if (value >= endvalue) - return 0; - - return 1; -} - - -int -mpio_fat_clear(mpio_t *m, mpio_mem_t mem) -{ - mpio_smartmedia_t *sm; - mpio_fatentry_t *f; - - if (mem == MPIO_INTERNAL_MEM) { - sm = &m->internal; - - f = mpio_fatentry_new(m, mem, 1, FTYPE_MUSIC); - do { - mpio_fatentry_set_free(m, mem, f) ; - } while(mpio_fatentry_plus_plus(f)); - free(f); - } - - if (mem == MPIO_EXTERNAL_MEM) { - sm = &m->external; - memset(sm->fat, 0x00, (sm->fat_size * SECTOR_SIZE)); - sm->fat[0] = 0xf8; - sm->fat[1] = 0xff; - sm->fat[2] = 0xff; - /* for FAT 16 */ - if (sm->size == 128) - sm->fat[3] = 0xff; - } - - return 0; -} - -/* - * This function acutally writes both, - * the FAT _and_ the root directory - * - */ - -int -mpio_fat_write(mpio_t *m, mpio_mem_t mem) -{ - mpio_smartmedia_t *sm; - mpio_fatentry_t *f; - BYTE dummy[BLOCK_SIZE]; - WORD i; - DWORD block; - - if (mem == MPIO_INTERNAL_MEM) { - sm = &m->internal; - - if (sm->cdir == sm->root) - { - f=mpio_fatentry_new(m, mem, 0, FTYPE_MUSIC); - mpio_io_block_delete(m, mem, f); - free(f); - - memset(dummy, 0x00, BLOCK_SIZE); - - /* only write the root dir */ - for (i= 0; i< 0x20; i++) - { - - if (iroot->dir + SECTOR_SIZE * i)); - } else { - /* fill the rest of the block with zeros */ - mpio_io_sector_write(m, mem, i, dummy); - } - } - } else { - mpio_directory_write(m, mem, sm->cdir); - } - - } - - if (mem == MPIO_EXTERNAL_MEM) - { - sm=&m->external; - - memset(dummy, 0xff, BLOCK_SIZE); - - for (i = 0; i < (sm->dir_offset + DIR_NUM) ; i++) { - /* before writing to a new block delete it! */ - if (((i / 0x20) * 0x20) == i) { - block = mpio_zone_block_find_seq(m, mem, (i/0x20)); - if (block == MPIO_BLOCK_NOT_FOUND) - { - block = mpio_zone_block_find_free_seq(m, mem, (i/0x20)); - } - if (block == MPIO_BLOCK_NOT_FOUND) - { - debug("This should never happen!"); - exit(-1); - } - - mpio_io_block_delete_phys(m, mem, block); - } - - /* remeber: logical sector 0 is the MBR! */ - if (i == 0) - mpio_io_sector_write(m, mem, 0, sm->mbr); - if ((i > 0) && (i < sm->pbr_offset)) - mpio_io_sector_write(m, mem, i, dummy); - - if (i == sm->pbr_offset) - mpio_io_sector_write(m, mem, sm->pbr_offset, sm->pbr); - - if ((i >= sm->fat_offset) && (i < (sm->fat_offset + (2*sm->fat_size)))) - mpio_io_sector_write(m, mem, i, - (sm->fat + SECTOR_SIZE * - ((i - sm->fat_offset) % sm->fat_size))); - - if (i>=sm->dir_offset) - mpio_io_sector_write(m, mem, i, - (sm->root->dir + - (i - sm->dir_offset) * SECTOR_SIZE)); - } - - if (sm->cdir != sm->root) - mpio_directory_write(m, mem, sm->cdir); - - } - - - return 0; -} - -int -mpio_fatentry_set_free (mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f) -{ - int e; - mpio_smartmedia_t *sm; - - if (mem == MPIO_INTERNAL_MEM) - { - sm = &m->internal; - e = f->entry * 0x10; - memset((sm->fat+e), 0xff, 0x10); - } - - if (mem == MPIO_EXTERNAL_MEM) - { - sm = &m->internal; - mpio_fatentry_write(m, mem, f, 0); - } - - return 0; -} - -int -mpio_fatentry_set_defect(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f) -{ - int e; - mpio_smartmedia_t *sm; - - if (mem == MPIO_INTERNAL_MEM) - { - sm = &m->internal; - e = f->entry * 0x10; - memset((sm->fat+e), 0xaa, 0x10); - } - - if (mem == MPIO_EXTERNAL_MEM) - { - sm = &m->internal; - mpio_fatentry_write(m, mem, f, 0xfff7); - } - - return 0; -} - -int -mpio_fatentry_is_defect(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f) -{ - int e; - mpio_smartmedia_t *sm; - - if (mem == MPIO_INTERNAL_MEM) - { - sm = &m->internal; - e = f->entry * 0x10; - if (mpio_fatentry_free(m, mem, f)) - return 0; - /* check if this block became defective */ - if (m->model >= MPIO_MODEL_FD100) { - /* newer models */ - if ((sm->fat[e+0x0f] != 0) || - (sm->fat[e+0x01] != sm->fat[e+0x0e])) - { - debug("defective block encountered, abort reading! (newer models check)\n"); - return 1; - } - } else - if ((sm->fat[e+0x0e] != 'P') || - (sm->fat[e+0x0f] != 'C') || - ((sm->fat[e+0x00] != 0xaa) && - (sm->fat[e+0x00] != 0xee))) - { - debug("defective block encountered, abort reading! (older models check)\n"); - return 1; - } - } - - if (mem == MPIO_EXTERNAL_MEM) - { - if (mpio_fatentry_read(m, mem, f)==0xfff7) - return 1; - } - - return 0; -} - -int -mpio_fatentry_set_eof(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f) -{ - int e; - mpio_smartmedia_t *sm; - - if (mem == MPIO_INTERNAL_MEM) - { - sm = &m->internal; - e = f->entry * 0x10; - memset((f->i_fat+0x07), 0xff, 4); - memcpy((sm->fat+e), f->i_fat, 0x10); - } - - if (mem == MPIO_EXTERNAL_MEM) - { - sm = &m->internal; - mpio_fatentry_write(m, mem, f, 0xffff); - } - - return 0; -} - -int -mpio_fatentry_set_next(mpio_t *m, mpio_mem_t mem, - mpio_fatentry_t *f, mpio_fatentry_t *value) -{ - int e; - mpio_smartmedia_t *sm; - - if (mem == MPIO_INTERNAL_MEM) - { - sm = &m->internal; - e = f->entry * 0x10; - - f->i_fat[0x07]= value->hw_address / 0x1000000; - f->i_fat[0x08]=(value->hw_address / 0x10000 ) & 0xff; - f->i_fat[0x09]=(value->hw_address / 0x100 ) & 0xff; - f->i_fat[0x0a]= value->hw_address & 0xff; - - memcpy((sm->fat+e), f->i_fat, 0x10); - } - - if (mem == MPIO_EXTERNAL_MEM) - { - sm = &m->internal; - mpio_fatentry_write(m, mem, f, value->entry); - } - - return 0; -} - diff --git a/libmpio/fat.h b/libmpio/fat.h deleted file mode 100644 index 6b7451f..0000000 --- a/libmpio/fat.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * - * $Id: fat.h,v 1.11 2003/04/18 13:53:01 germeier Exp $ - * - * Library for USB MPIO-* - * - * Markus Germeier (mager@tzi.de) - * - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * */ - -#ifndef _MPIO_FAT_H_ -#define _MPIO_FAT_H_ - -#include "defs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* generate fresh boot sectors for formatting of external mem */ -BYTE *mpio_mbr_gen(BYTE); -BYTE *mpio_pbr_gen(BYTE); - -/* only needed for external memory */ -int mpio_bootblocks_read(mpio_t *, mpio_mem_t); -int mpio_mbr_eval(mpio_smartmedia_t *); -int mpio_pbr_eval(mpio_smartmedia_t *); - -/* functions on the FAT for internal *and* external */ -int mpio_fat_read(mpio_t *, mpio_mem_t, mpio_callback_init_t); -int mpio_fat_write(mpio_t *, mpio_mem_t); -int mpio_fat_clear(mpio_t *, mpio_mem_t); -int mpio_fat_free_clusters(mpio_t *, mpio_mem_t); -int mpio_fat_free(mpio_t *, mpio_mem_t); - -/* functions to iterate through the FAT linked list(s) */ -mpio_fatentry_t *mpio_fatentry_new(mpio_t *, mpio_mem_t, DWORD, BYTE); -int mpio_fatentry_plus_plus(mpio_fatentry_t *); - -mpio_fatentry_t *mpio_fatentry_find_free(mpio_t *, mpio_mem_t, BYTE); -int mpio_fatentry_next_free(mpio_t *, mpio_mem_t, - mpio_fatentry_t *); -int mpio_fatentry_next_entry(mpio_t *, mpio_mem_t, - mpio_fatentry_t *); -DWORD mpio_fatentry_read(mpio_t *, mpio_mem_t, mpio_fatentry_t *); -int mpio_fatentry_write(mpio_t *, mpio_mem_t, mpio_fatentry_t *, - WORD); - -int mpio_fatentry_set_free (mpio_t *, mpio_mem_t, - mpio_fatentry_t *); -int mpio_fatentry_set_defect(mpio_t *, mpio_mem_t, - mpio_fatentry_t *); -int mpio_fatentry_set_eof(mpio_t *, mpio_mem_t, - mpio_fatentry_t *); -int mpio_fatentry_set_next(mpio_t *, mpio_mem_t, - mpio_fatentry_t *, mpio_fatentry_t *); -int mpio_fatentry_is_defect(mpio_t *, mpio_mem_t, - mpio_fatentry_t *); - -/* finding a file is fundamental different for internal mem */ -int mpio_fat_internal_find_startsector(mpio_t *, BYTE); -BYTE mpio_fat_internal_find_fileindex(mpio_t *); - -/* mapping logical <-> physical for internal memory only */ -void mpio_fatentry_hw2entry(mpio_t *, mpio_fatentry_t *); -void mpio_fatentry_entry2hw(mpio_t *, mpio_fatentry_t *); - -#ifdef __cplusplus -} -#endif - -#endif /* _MPIO_FAT_H_ */ diff --git a/libmpio/id3.c b/libmpio/id3.c deleted file mode 100644 index 14e0688..0000000 --- a/libmpio/id3.c +++ /dev/null @@ -1,292 +0,0 @@ -/* - * $Id: id3.c,v 1.2 2003/04/21 10:37:16 germeier Exp $ - * - * Library for accessing Digit@lways MPIO players - * Copyright (C) 2003 Markus Germeier - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc.,g 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#include -#include -#include - -#include "id3.h" -#include "debug.h" -#include "mplib.h" - -#ifdef MPLIB -void -mpio_id3_get_content(id3_tag *tag, id3_tag *tag2, int field, - BYTE out[INFO_LINE]) -{ - id3_content *content; - id3_text_content *text_content; - - content = mp_get_content(tag, field); - if (!content) - content = mp_get_content(tag2, field); - if (content) - { - text_content = mp_parse_artist(content); - debugn(2, "Found (%d): %s\n", field, text_content->text); - strncpy(out, text_content->text, INFO_LINE); - } else { - strcpy(out,""); - } - -} - -void -mpio_id3_copy_tag(BYTE *src, BYTE *dest, int *offset) -{ - int i=0; - int last=0; - - /* find last non-space character, so we can strip */ - /* trailing spaces */ - while(src[i]) - if (src[i++]!=0x20) - last=i; - - i=0; - while((*offset<(INFO_LINE-1)) && (src[i]) && (iid3 = value; - return m->id3; -#else - return 0; -#endif /* MPLIB */ -} - -/* query ID3 rewriting support */ -BYTE -mpio_id3_get(mpio_t *m) -{ -#ifdef MPLIB - return m->id3; -#else - return 0; -#endif /* MPLIB */ -} - -/* ID3 rewriting: do the work */ -/* context, src filename, uniq filename template */ -int -mpio_id3_do(mpio_t *m, BYTE *src, BYTE *tmp) -{ -#ifdef MPLIB - int fd, in; - BYTE buf[BLOCK_SIZE]; - int r, w; - int i, j, t; - id3_tag *tag, *tag2, *new_tag; - id3_tag_list *tag_list; - id3_tag_list new_tag_list; - id3_content *content; - id3_content new_content; - id3_text_content *text_content; - id3v2_tag *v2_tag; - BYTE data_artist[INFO_LINE]; - BYTE data_title[INFO_LINE]; - BYTE data_album[INFO_LINE]; - BYTE data_year[INFO_LINE]; - BYTE data_genre[INFO_LINE]; - BYTE data_comment[INFO_LINE]; - BYTE data_track[INFO_LINE]; - - BYTE mpio_tag[INFO_LINE]; - char *mpio_tag_unicode; - - char *uc; - iconv_t ic; - int fin, fout; - char *fback, *back; - - if (!m->id3) - return 0; - - sprintf(tmp, "/tmp/MPIO-XXXXXXXXXXXXXXX", INFO_LINE); - - fd = mkstemp(tmp); - if (fd==-1) return 0; - sprintf(m->id3_temp, tmp, INFO_LINE); - - in = open(src, O_RDONLY); - if (in==-1) return 0; - - do { - r=read(in, buf, BLOCK_SIZE); - if (r>0) - w=write(fd, buf, r); - } while (r>0); - - close (in); - - tag_list = mp_get_tag_list_from_fd(fd); - if (!tag_list) - { - debug("no tag list found!\n"); - return 0; - } - - tag = tag_list->tag; - tag2 = NULL; - if (tag_list->next) - tag2 = tag_list->next->tag; - - /* read tags from file */ - mpio_id3_get_content(tag, tag2, MP_ARTIST, data_artist); - mpio_id3_get_content(tag, tag2, MP_TITLE, data_title); - mpio_id3_get_content(tag, tag2, MP_ALBUM, data_album); - mpio_id3_get_content(tag, tag2, MP_GENRE, data_genre); - mpio_id3_get_content(tag, tag2, MP_COMMENT, data_comment); - mpio_id3_get_content(tag, tag2, MP_YEAR, data_year); - mpio_id3_get_content(tag, tag2, MP_TRACK, data_track); - - /* build new tag */ - mpio_tag[0]=0x00; - i=j=t=0; - - while ((t<(INFO_LINE-1) && m->id3_format[i]!=0)) - { - if (m->id3_format[i] == '%') - { - i++; - switch(m->id3_format[i]) - { - case 'p': - mpio_id3_copy_tag(data_artist, mpio_tag, &t); - break; - case 't': - mpio_id3_copy_tag(data_title, mpio_tag, &t); - break; - case 'a': - mpio_id3_copy_tag(data_album, mpio_tag, &t); - break; - case 'g': - mpio_id3_copy_tag(data_genre, mpio_tag, &t); - break; - case 'c': - mpio_id3_copy_tag(data_comment, mpio_tag, &t); - break; - case 'y': - mpio_id3_copy_tag(data_year, mpio_tag, &t); - break; - case 'n': - mpio_id3_copy_tag(data_track, mpio_tag, &t); - break; - default: - mpio_tag[t] = m->id3_format[i]; - } - } else { - mpio_tag[t] = m->id3_format[i]; - t++; - } - - i++; - } - mpio_tag[t]=0x00; - - debugn(2, "new_tag: %s\n", mpio_tag); - - /* convert tag to UNICODELITTLE */ - fin = strlen(mpio_tag) + 1; - fout = fin*2 + 2; - ic = iconv_open("UNICODELITTLE", "ASCII"); - fback = mpio_tag; - mpio_tag_unicode = (char *)malloc(2*INFO_LINE+3); - back = (char *)mpio_tag_unicode; - *back=0x01; - back++; - *back=0xff; - back++; - *back=0xfe; - back++; - - debugn(2,"iconv before %s %d %d\n", fback, fin, fout); - iconv(ic, (char **)&fback, &fin, (char **)&back, &fout); - debugn(2,"iconv after %s %d %d\n", fback, fin, fout); - iconv_close(ic); - hexdumpn(2, mpio_tag, strlen(mpio_tag)); - hexdumpn(2, (char *)mpio_tag_unicode, (2*strlen(mpio_tag))+3); - - /* build new ID3 v2 tag with only TXXX field */ - new_content.length=(2*strlen(mpio_tag))+3; - new_content.data = (char *)malloc(new_content.length); - new_content.compressed=0; - new_content.encrypted=0; - memcpy(new_content.data, mpio_tag_unicode, new_content.length); - - new_tag = mp_alloc_tag_with_version (2); - mp_set_custom_content(new_tag, "TXXX", &new_content); - - v2_tag = (id3v2_tag *)new_tag->tag; - v2_tag->header->unsyncronization=0; - v2_tag->header->is_experimental=0; - - new_tag_list.tag = new_tag; - new_tag_list.next = NULL; - new_tag_list.first = NULL; - - /* delete ID3 v2 tag from file */ - mp_del_tags_by_ver_from_fd(fd, 2); - close (fd); - - /* write new ID3 v2 tag to file */ - mp_write_to_file(&new_tag_list, tmp); - - free(mpio_tag_unicode); - - return 1; -#else - return 0; -#endif /* MPLIB */ -} - -int -mpio_id3_end(mpio_t *m) -{ -#ifdef MPLIB - if (m->id3_temp[0]) - unlink(m->id3_temp); - m->id3_temp[0] = 0x00; - return 1; -#else - return 0; -#endif /* MPLIB */ -} - -void -mpio_id3_format_set(mpio_t *m, BYTE *format) -{ - strncpy(m->id3_format, format, INFO_LINE); -} - -/* get format string for rewriting*/ -void -mpio_id3_format_get(mpio_t *m, BYTE *format) -{ - strncpy(format, m->id3_format, INFO_LINE); -} diff --git a/libmpio/id3.h b/libmpio/id3.h deleted file mode 100644 index 7ea8940..0000000 --- a/libmpio/id3.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * $Id: id3.h,v 1.1 2003/04/19 09:32:48 germeier Exp $ - * - * Library for accessing Digit@lways MPIO players - * Copyright (C) 2003 Markus Germeier - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#ifndef _MPIO_ID3_H_ -#define _MPIO_ID3_H_ - -#include "defs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* ID3 rewriting: do the work */ -/* context, src filename, uniq filename template */ -int mpio_id3_do(mpio_t *, BYTE *, BYTE *); - -/* ID3: clean up temp file */ -int mpio_id3_end(mpio_t *); - -#ifdef __cplusplus -} -#endif - - -#endif /* _MPIO_ID3_H_ */ diff --git a/libmpio/io.c b/libmpio/io.c deleted file mode 100644 index 0ef8258..0000000 --- a/libmpio/io.c +++ /dev/null @@ -1,1213 +0,0 @@ -/* -*- linux-c -*- */ - -/* - * - * $Id: io.c,v 1.25 2003/04/18 13:53:01 germeier Exp $ - * - * Library for USB MPIO-* - * - * Markus Germeier (mager@tzi.de) - * - * uses code from mpio_stat.c by - * Yuji Touya (salmoon@users.sourceforge.net) - * - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * */ - -/* - * - * low level I/O - * - * - */ - -#include -#include -#include -#include - -#include "io.h" -#include "debug.h" -#include "ecc.h" - -BYTE model2externalmem(mpio_model_t); -DWORD blockaddress_encode(DWORD); -DWORD blockaddress_decode(BYTE *); -void fatentry2hw(mpio_fatentry_t *, BYTE *, DWORD *); - -/* small hack to handle external addressing on different MPIO models */ -BYTE -model2externalmem(mpio_model_t model) -{ - BYTE m; - - switch(model) - { - case MPIO_MODEL_DMG: - case MPIO_MODEL_DMG_PLUS: - m = 0x80; - break; - default: - m = 0x10; - } - - return m; -} - -/* encoding and decoding of blockaddresses */ - -DWORD -blockaddress_encode(DWORD ba) -{ - WORD addr; - BYTE p = 0, c = 0; - BYTE high, low; - - high = 0x10 | ((ba / 0x80) & 0x07); - low = (ba * 2) & 0xff; - - c = high; - while (c) - { - if (c & 0x01) - p ^= 1; - c /= 2; - } - - c = low; - while (c) - { - if (c & 0x01) - p ^= 0x01; - c /= 2; - } - - addr = (high * 0x100) + low + p; - - return addr; -} - - -DWORD -blockaddress_decode(BYTE *entry) -{ - WORD ba; - WORD value; - BYTE p=0, high, low; - int i, t; - - /* check for "easy" defect block */ - t=1; - for(i=0; i<0x10; i++) - if (entry[i] != 0) - t=0; - if (t) - return MPIO_BLOCK_DEFECT; - - /* check for "easy" defect block */ - t=1; - for(i=0; i<0x10; i++) - if (entry[i] != 0xff) - t=0; - if (t) - return MPIO_BLOCK_FREE; - - /* check for "strange" errors */ - if ((entry[6] != entry[11]) || - (entry[7] != entry[12])) - { - debug("error: different block addresses found:\n"); - hexdumpn(1, entry, 0x10); - return MPIO_BLOCK_DEFECT; - } - - ba = entry[6] * 0x100 + entry[7]; - - /* special values */ - if (ba == 0xffff) - return MPIO_BLOCK_DEFECT; - if (ba == 0x0000) - return MPIO_BLOCK_CIS; - - /* check parity */ - value = ba; - while (value) - { - if (value & 0x01) - p ^= 0x01; - - value /= 2; - } - if (p) - { - debug("parity error found in block address: %2x\n", ba); - return MPIO_BLOCK_DEFECT; - } - - high = ((ba / 0x100) & 0x07); - low = ((ba & 0x0ff) / 2); - - return (high * 0x80 + low); -} - -/* foobar */ - -void -fatentry2hw(mpio_fatentry_t *f, BYTE *chip, DWORD *address) -{ - mpio_smartmedia_t *sm; - - if (f->mem == MPIO_INTERNAL_MEM) - { - sm = &f->m->internal; - /* hexdump((char *)&f->entry, 4); */ - /* hexdump((char *)&f->hw_address, 4); */ - *chip = f->hw_address / 0x1000000; - *address = f->hw_address & 0x0ffffff; - } - if (f->mem == MPIO_EXTERNAL_MEM) - { - sm = &f->m->external; - *chip = MPIO_EXTERNAL_MEM; - *address = mpio_zone_block_find_log(f->m, f->mem, f->entry); - debugn(3, "mager: %06x (logical: %04x)\n", *address, f->entry); - } - return; -} - -/* - * zone management - */ - -int -mpio_zone_init(mpio_t *m, mpio_cmd_t mem) -{ - mpio_smartmedia_t *sm; - int i; - int zone, block, e; - - if (mem != MPIO_EXTERNAL_MEM) - { - debug("called function with wrong memory selection!\n"); - return -1; - } - sm = &m->external; - - for(i=0; imax_blocks; i++) - { - zone = i / MPIO_ZONE_PBLOCKS; - block= i % MPIO_ZONE_PBLOCKS; - - e = i * 0x10; - - sm->zonetable[zone][block]=blockaddress_decode(sm->spare+e); - - hexdumpn(4, sm->spare+e, 0x10); - debugn(2, "decoded: %04x\n", sm->zonetable[zone][block]); - } - -} - -DWORD -mpio_zone_block_find_log(mpio_t *m, mpio_cmd_t mem, DWORD lblock) -{ - mpio_smartmedia_t *sm; - int v; - - if (mem != MPIO_EXTERNAL_MEM) - { - debug("called function with wrong memory selection!\n"); - return -1; - } - sm = &m->external; - - /* OK, I can't explain this right now, but it does work, - * see Software Driver v3.0, page 31 - */ - v = lblock + (sm->size/64); - - return (mpio_zone_block_find_seq(m, mem, v)); -} - -DWORD -mpio_zone_block_find_seq(mpio_t *m, mpio_cmd_t mem, DWORD lblock) -{ - mpio_smartmedia_t *sm; - int i, f, v; - int zone, block; - - if (mem != MPIO_EXTERNAL_MEM) - { - debug("called function with wrong memory selection!\n"); - return -1; - } - sm = &m->external; - - if ((lblock>=MPIO_BLOCK_CIS) && (lblock<(MPIO_BLOCK_CIS + BLOCK_SECTORS))) - { - zone = 0; - block = MPIO_BLOCK_CIS; - } else { - zone = lblock / MPIO_ZONE_LBLOCKS; - block = lblock % MPIO_ZONE_LBLOCKS; - } - - f=0; - for (i=(MPIO_ZONE_PBLOCKS-1); i >=0; i--) - { - - if (sm->zonetable[zone][i]==block) - { - f++; - v=i; - } - } - - if (f>1) - debug("found more than one block, using first one\n"); - - if (!f) - { - debugn(2, "block not found\n"); - return MPIO_BLOCK_NOT_FOUND; - } - - return ((zone * BLOCK_SECTORS * MPIO_ZONE_PBLOCKS ) + v * BLOCK_SECTORS); -} - -DWORD -mpio_zone_block_set_free(mpio_t *m, mpio_cmd_t mem, DWORD lblock) -{ - DWORD value; - int zone, block; - mpio_smartmedia_t *sm; - - if (mem != MPIO_EXTERNAL_MEM) - { - debug("called function with wrong memory selection!\n"); - return -1; - } - sm = &m->external; - - value = mpio_zone_block_find_log(m, mem, lblock); - - mpio_zone_block_set_free_phys(m, mem, value); - - return value; -} - -void -mpio_zone_block_set_free_phys(mpio_t *m, mpio_cmd_t mem, DWORD value) -{ - int zone, block; - mpio_smartmedia_t *sm; - - if (mem != MPIO_EXTERNAL_MEM) - { - debug("called function with wrong memory selection!\n"); - return; - } - sm = &m->external; - - zone = value / BLOCK_SECTORS; - block = zone % MPIO_ZONE_PBLOCKS; - zone = zone / MPIO_ZONE_PBLOCKS; - - sm->zonetable[zone][block] = MPIO_BLOCK_FREE; - - return; -} - -void -mpio_zone_block_set_defect_phys(mpio_t *m, mpio_cmd_t mem, DWORD value) -{ - int zone, block; - mpio_smartmedia_t *sm; - - if (mem != MPIO_EXTERNAL_MEM) - { - debug("called function with wrong memory selection!\n"); - return; - } - sm = &m->external; - - zone = value / BLOCK_SECTORS; - block = zone % MPIO_ZONE_PBLOCKS; - zone = zone / MPIO_ZONE_PBLOCKS; - - sm->zonetable[zone][block] = MPIO_BLOCK_DEFECT; - - return; -} - -void -mpio_zone_block_set(mpio_t *m, mpio_cmd_t mem, DWORD pblock) -{ - int zone, block, pb; - - pb = pblock / BLOCK_SECTORS; - zone = pb / MPIO_ZONE_PBLOCKS; - block = pb % MPIO_ZONE_PBLOCKS; - - m->external.zonetable[zone][block] = MPIO_BLOCK_FREE ; - -} - -DWORD -mpio_zone_block_find_free_log(mpio_t *m, mpio_cmd_t mem, DWORD lblock) -{ - mpio_smartmedia_t *sm; - int v; - - if (mem != MPIO_EXTERNAL_MEM) - { - debug("called function with wrong memory selection!\n"); - return -1; - } - sm = &m->external; - - /* OK, I can't explain this right now, but it does work, - * see Software Driver v3.0, page 31 - */ - v = lblock + (sm->size/64); - - return (mpio_zone_block_find_free_seq(m, mem, v)); -} - -DWORD -mpio_zone_block_find_free_seq(mpio_t *m, mpio_cmd_t mem, DWORD lblock) -{ - DWORD value; - int zone, block, i; - mpio_smartmedia_t *sm; - - if (mem != MPIO_EXTERNAL_MEM) - { - debug("called function with wrong memory selection!\n"); - return -1; - } - sm = &m->external; - - value = mpio_zone_block_find_seq(m, mem, lblock); - - if (value != MPIO_BLOCK_NOT_FOUND) - { - debug("logical block numbers is already assigned! (%4x)\n", lblock); - exit (-1); - } - - if ((lblock>=MPIO_BLOCK_CIS) && (lblock<(MPIO_BLOCK_CIS + BLOCK_SECTORS))) - { - zone = 0; - block = MPIO_BLOCK_CIS; - } else { - zone = lblock / MPIO_ZONE_LBLOCKS; - block = lblock % MPIO_ZONE_LBLOCKS; - } - - i=0; - while ((sm->zonetable[zone][i]!=MPIO_BLOCK_FREE) && (izonetable[zone][i] = block; - - return ((zone * BLOCK_SECTORS * MPIO_ZONE_PBLOCKS ) + i * BLOCK_SECTORS); -} - - -WORD -mpio_zone_block_get_logical(mpio_t *m, mpio_cmd_t mem, DWORD pblock) -{ - int zone, block, pb; - - pb = pblock / BLOCK_SECTORS; - zone = pb / MPIO_ZONE_PBLOCKS; - block = pb % MPIO_ZONE_PBLOCKS; - - return m->external.zonetable[zone][block]; -} - - - - - -/* - * low-low level functions - */ - -/* - * Set command packet - * - * parameter: - * - * cmd: commando code - * mem: internal/external - * index: sector/block - * size: size of used memory chip - * wsize: write size, only for PUT_BLOCK - * buffer: output buffer of command packet - * - */ - -int -mpio_io_set_cmdpacket(mpio_t *m, mpio_cmd_t cmd, mpio_mem_t mem, DWORD index, - WORD size, BYTE wsize, BYTE *buffer) -{ - BYTE memory; - - /* clear cmdpacket*/ - memset(buffer, 0, 0x40); - - *buffer = cmd; - memory = mem; - if (mem == MPIO_EXTERNAL_MEM) - memory = model2externalmem(m->model); - - *(buffer + 0x01) = memory; - *(buffer + 0x03) = (BYTE) (index & 0x00ff); - *(buffer + 0x04) = (BYTE)((index & 0xff00) >> 8); - /* SM cards with less or equal 32 MB only need 2 Bytes - * to address sectors or blocks. - * The highest byte has to be 0xff in that case! - */ - if (size <= 32) - { - *(buffer + 0x05) = 0xff; - } else { - *(buffer + 0x05) = (BYTE) (index >> 16); - } - /* is this always 0x48 in case of a block write ?? */ - *(buffer + 0x06) = wsize; - - memcpy((buffer + 0x3b), "jykim", 5); - - return (0); -} - -/* - * write chunk of data to MPIO filedescriptor - * - * parameter: - * - * fd: filedescriptor - * block: data buffer (has to be num_bytes) - * num_bytes: size of data buffer - * - */ -int -mpio_io_bulk_write(int fd, BYTE *block, int num_bytes) -{ - BYTE *p; - int count, bytes_left, bytes_written; - - bytes_left = num_bytes; - bytes_written = 0; - p = block; - - do - { - count = write (fd, p, bytes_left); - if (count > 0) - { - p += count; - bytes_written += count; - bytes_left -= count; - } - } while (bytes_left > 0 && count > 0); - - return bytes_written; -} - -/* - * read chunk of data from MPIO filedescriptor - * - * parameter: - * - * fd: filedescriptor - * block: return buffer (has to be num_bytes) - * num_bytes: size of return buffer - * - */ -int -mpio_io_bulk_read (int fd, BYTE *block, int num_bytes) -{ - int total_read, count, bytes_left; - BYTE *p; - - total_read = 0; - bytes_left = num_bytes; - p = block; - - do - { - count = read (fd, p, bytes_left); - - if (count > 0) - { - total_read += count; - bytes_left -= count; - p += count; - } - } while (total_read < num_bytes && count > 0); - - return total_read; -} - -/* - * low level functions - */ - -/* - * read version block from MPIO - * - * parameter: - * - * m: mpio context - * buffer: return buffer (has to be CMD_SIZE) - * - */ -int -mpio_io_version_read(mpio_t *m, BYTE *buffer) -{ - int nwrite, nread; - BYTE cmdpacket[CMD_SIZE], status[CMD_SIZE]; - - /* Send command packet to MPIO */ - mpio_io_set_cmdpacket (m, GET_VERSION, 0, 0, 0xff, 0, cmdpacket); - - debugn (5, ">>> MPIO\n"); - hexdump (cmdpacket, sizeof(cmdpacket)); - - nwrite = mpio_io_bulk_write (m->fd, cmdpacket, 0x40); - - if (nwrite != CMD_SIZE) - { - debug ("Failed to send command.\n\n"); - close (m->fd); - return 0; - } - - /* Receive packet from MPIO */ - nread = mpio_io_bulk_read (m->fd, status, 0x40); - - if (nread == -1 || nread != 0x40) - { - debug ("Failed to read Sector.\n%x\n",nread); - close (m->fd); - return 0; - } - - debugn (5, "<<< MPIO\n"); - hexdump (status, 0x40); - - memcpy(buffer, status, 0x40); - - return CMD_SIZE; -} - -/* - * read sector from SmartMedia - * - * parameter: - * - * m: mpio context - * mem: MPIO_{INTERNAL,EXTERNAL}_MEM - * index: index number of sector to read - * output: return buffer (has to be SECTOR_SIZE) - * - */ - -/* right now we assume we only want to read single sectors from - * the _first_ internal memory chip - */ - -int -mpio_io_sector_read(mpio_t *m, BYTE mem, DWORD index, BYTE *output) -{ - mpio_smartmedia_t *sm=0; - DWORD sector; - int nwrite, nread; - BYTE cmdpacket[CMD_SIZE], recvbuff[SECTOR_TRANS]; - - if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - if (!sm) - { - debug("error in memory selection, aborting\n"); - exit (-1); - } - - if (mem == MPIO_INTERNAL_MEM) - { - sector = index; - } else { - /* find the correct physical block first! */ - if ((index>=MPIO_BLOCK_CIS) && (index<(MPIO_BLOCK_CIS + BLOCK_SECTORS))) - { - sector = mpio_zone_block_find_seq(m, mem, MPIO_BLOCK_CIS); - sector+= (index % MPIO_BLOCK_CIS); - } else { - sector = mpio_zone_block_find_seq(m, mem, (index / 0x20)); - sector+= (index % 0x20); - } - } - - debugn (2, "sector: %8x (%06x)\n", index, sector); - - mpio_io_set_cmdpacket (m, GET_SECTOR, mem, sector, sm->size, 0, cmdpacket); - - debugn (5, "\n>>> MPIO\n"); - hexdump (cmdpacket, sizeof(cmdpacket)); - - nwrite = mpio_io_bulk_write (m->fd, cmdpacket, 0x40); - - if(nwrite != CMD_SIZE) - { - debug ("\nFailed to send command.\n\n"); - close (m->fd); - return 1; - } - - /* Receive packet from MPIO */ - nread = mpio_io_bulk_read (m->fd, recvbuff, SECTOR_TRANS); - - if(nread != SECTOR_TRANS) - { - debug ("\nFailed to read Sector.\n%x\n", nread); - close (m->fd); - return 1; - } - - /* check ECC Area information */ - if (mem==MPIO_EXTERNAL_MEM) - { - if (mpio_ecc_256_check (recvbuff, - (recvbuff + SECTOR_SIZE + 13)) || - mpio_ecc_256_check ((recvbuff + (SECTOR_SIZE / 2)), - (recvbuff + SECTOR_SIZE + 8)) ) - debug ("ECC error @ (%02x : %06x)\n", mem, index); - } - - /* This should not be needed: - * we don't have ECC information for the internal memory - * we only read the directory through this function - */ - /* if (mem==MPIO_INTERNAL_MEM) */ - /* { */ - /* debugn(2, "WARNING, code for internal FAT entry (in ECC area)" */ - /* " not yet in place!!\n"); */ - /* } */ - - debugn (5, "\n<<< MPIO\n"); - hexdump (recvbuff, SECTOR_TRANS); - - memcpy(output, recvbuff, SECTOR_SIZE); - - return 0; -} - -/* - * write sector to SmartMedia - * - * parameter: - * - * m: mpio context - * mem: MPIO_{INTERNAL,EXTERNAL}_MEM - * index: index number of sector to read - * input: data buffer (has to be SECTOR_SIZE) - * - */ - -/* right now we assume we only want to write single sectors from - * the _first_ internal memory chip - */ - -int -mpio_io_sector_write(mpio_t *m, BYTE mem, DWORD index, BYTE *input) -{ - int nwrite; - mpio_smartmedia_t *sm; - DWORD pvalue; - DWORD block_address, ba; - BYTE cmdpacket[CMD_SIZE], sendbuff[SECTOR_TRANS]; - - if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - if (!sm) - { - debug("error in memory selection, aborting\n"); - exit (-1); - } - - /* we have to: - * - find the physical block (or allocate a new one) - * - calculate the logical block for zone management - */ - - if (mem == MPIO_EXTERNAL_MEM) - { - if (index==MPIO_BLOCK_DEFECT) - { - block_address = 0; - pvalue = 0; - } else { - if ((index>=MPIO_BLOCK_CIS) && - (index<(MPIO_BLOCK_CIS + BLOCK_SECTORS))) - { - block_address = 0; - if (index==MPIO_BLOCK_CIS) - { - pvalue=mpio_zone_block_find_free_seq(m, mem, index); - } else { - /* find the block from the block list! */ - pvalue=mpio_zone_block_find_seq(m, mem, MPIO_BLOCK_CIS); - } - if (pvalue != MPIO_BLOCK_NOT_FOUND) - pvalue = pvalue + index - MPIO_BLOCK_CIS; - - } else { - block_address = blockaddress_encode(index / BLOCK_SECTORS); - if ((index % BLOCK_SECTORS) == 0) - { - /* this is the first write to the block: allocate a new one */ - /* ... and mark it with the block_address */ - pvalue=mpio_zone_block_find_free_seq(m, mem, - (index / BLOCK_SECTORS)); - } else { - /* find the block from the block list! */ - pvalue=mpio_zone_block_find_seq(m, mem, (index / BLOCK_SECTORS)); - } - if (pvalue != MPIO_BLOCK_NOT_FOUND) - pvalue = pvalue + (index % BLOCK_SECTORS); - - } - - if (pvalue == MPIO_BLOCK_NOT_FOUND) - { - debug ("Oops, this should never happen! (%6x : %6x)\n", - index, block_address); - exit (-1); - } - } - } else { - pvalue = index; - } - - mpio_io_set_cmdpacket(m, PUT_SECTOR, mem, pvalue, sm->size, 0, cmdpacket); - - debugn (5, "\n>>> MPIO\n"); - hexdump (cmdpacket, sizeof(cmdpacket)); - - nwrite = mpio_io_bulk_write(m->fd, cmdpacket, 0x40); - - if(nwrite != CMD_SIZE) - { - debug ("\nFailed to send command.\n\n"); - close (m->fd); - return 1; - } - - memset(sendbuff, 0, SECTOR_TRANS); - memset(sendbuff + SECTOR_SIZE, 0xff, 0x10); - memcpy(sendbuff, input, SECTOR_SIZE); - - if (mem==MPIO_EXTERNAL_MEM) - { - if (index == MPIO_BLOCK_DEFECT) { - memset(sendbuff + SECTOR_SIZE, 0, 0x10); - mpio_zone_block_set_defect_phys(m, mem, pvalue); - } else { - - /* generate ECC information for spare area ! */ - mpio_ecc_256_gen(sendbuff, - sendbuff + SECTOR_SIZE + 0x0d); - mpio_ecc_256_gen(sendbuff + (SECTOR_SIZE / 2), - sendbuff + SECTOR_SIZE + 0x08); - if (index == MPIO_BLOCK_DEFECT) { - memset(sendbuff + SECTOR_SIZE, 0, 0x10); - } else { - if (index == MPIO_BLOCK_CIS) { - memset(sendbuff + SECTOR_SIZE + 0x06, 0, 2); - memset(sendbuff + SECTOR_SIZE + 0x0b, 0, 2); - } else { - ba = (block_address / 0x100) & 0xff; - sendbuff[SECTOR_SIZE + 0x06] = ba; - sendbuff[SECTOR_SIZE + 0x0b] = ba; - - ba = block_address & 0xff; - sendbuff[SECTOR_SIZE + 0x07] = ba; - sendbuff[SECTOR_SIZE + 0x0c] = ba; - } - } - - } - } - - /* easy but working, we write back the FAT info we read before */ - if (mem==MPIO_INTERNAL_MEM) - memcpy((sendbuff+SECTOR_SIZE), sm->fat, 0x10); - - debugn (5, "\n>>> MPIO\n"); - hexdump(sendbuff, SECTOR_TRANS); - - /* write sector MPIO */ - nwrite = mpio_io_bulk_write(m->fd, sendbuff, SECTOR_TRANS); - - if(nwrite != SECTOR_TRANS) - { - debug ("\nFailed to read Sector.\n%x\n", nwrite); - close (m->fd); - return 1; - } - - return 0; -} - -/* - * read/write of blocks - */ -int -mpio_io_block_read(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f, BYTE *output) -{ - int i=0; - int nwrite, nread; - mpio_smartmedia_t *sm; - BYTE chip; - DWORD address; - BYTE cmdpacket[CMD_SIZE], recvbuff[BLOCK_TRANS]; - - if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - - fatentry2hw(f, &chip, &address); - - mpio_io_set_cmdpacket(m, GET_BLOCK, chip, address, sm->size, 0, cmdpacket); - - debugn(5, "\n>>> MPIO\n"); - hexdump(cmdpacket, sizeof(cmdpacket)); - - nwrite = mpio_io_bulk_write(m->fd, cmdpacket, CMD_SIZE); - - if(nwrite != CMD_SIZE) - { - debug ("\nFailed to send command.\n\n"); - close (m->fd); - return 1; - } - - /* Receive packet from MPIO */ - nread = mpio_io_bulk_read(m->fd, recvbuff, BLOCK_TRANS); - - if(nread != BLOCK_TRANS) - { - debug ("\nFailed to read Block.\n%x\n",nread); - close (m->fd); - return 1; - } - - debugn(5, "\n<<< MPIO\n"); - hexdump(recvbuff, BLOCK_TRANS); - - for (i = 0; i < BLOCK_SECTORS; i++) - { - /* check ECC Area information */ - if (mem==MPIO_EXTERNAL_MEM) { - if (mpio_ecc_256_check ((recvbuff + (i * SECTOR_TRANS)), - ((recvbuff +(i * SECTOR_TRANS) - + SECTOR_SIZE +13))) || - mpio_ecc_256_check ((recvbuff + (i * SECTOR_TRANS) - + (SECTOR_SIZE / 2)), - ((recvbuff +(i * SECTOR_TRANS) - + SECTOR_SIZE + 8)))) - debug ("ECC error @ (%02x : %06x)\n", chip, address); - } - - memcpy(output + (i * SECTOR_SIZE), - recvbuff + (i * SECTOR_TRANS), - SECTOR_SIZE); - } - - return 0; -} - -/* Read spare is only usefull for the internal memory, - * the FAT lies there. It is updated during the - * mpio_io_{sector,block}_{read,write} operations. - * - * For external SmartMedia cards we have a "seperate" FAT - * which is read and updated just like on a regular floppy - * disc or hard drive. - * - */ - -int -mpio_io_spare_read(mpio_t *m, BYTE mem, DWORD index, WORD size, - BYTE wsize, BYTE *output, int toread, - mpio_callback_init_t progress_callback) -{ - mpio_smartmedia_t *sm; - int i; - int nwrite, nread; - int chip = 0; - int chips = 0; - BYTE cmdpacket[CMD_SIZE]; - - if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - - chips = sm->chips; - - for (chip = 1; chip <= chips; chip++) - { - if (mem == MPIO_INTERNAL_MEM) - mpio_io_set_cmdpacket(m, GET_SPARE_AREA, (1 << (chip-1)), - index, (size / sm->chips), - wsize, cmdpacket); - if (mem == MPIO_EXTERNAL_MEM) - mpio_io_set_cmdpacket(m, GET_SPARE_AREA, mem, index, size, - wsize, cmdpacket); - debugn(5, "\n>>> MPIO\n"); - hexdump(cmdpacket, sizeof(cmdpacket)); - - nwrite = mpio_io_bulk_write(m->fd, cmdpacket, CMD_SIZE); - - if(nwrite != CMD_SIZE) { - debug ("\nFailed to send command.\n\n"); - close (m->fd); - return 1; - } - - /* Receive packet from MPIO */ - for (i = 0; i < (toread / chips / CMD_SIZE); i++) - { - nread = mpio_io_bulk_read (m->fd, - output + (i * CMD_SIZE) + - (toread / chips * (chip - 1)), - CMD_SIZE); - - if ((progress_callback) && (i % 256)) - (*progress_callback)(mem, - (i*CMD_SIZE+(toread/chips*(chip-1))), - toread ); - - if(nread != CMD_SIZE) - { - debug ("\nFailed to read Block.\n%x\n",nread); - close (m->fd); - return 1; - } - debugn(5, "\n<<< MPIO\n"); - hexdump(output + (i * CMD_SIZE) + (toread / chips * (chip - 1)), - CMD_SIZE); - } - } - if (progress_callback) - (*progress_callback)(mem, toread, toread); - - return 0; -} - -int -mpio_io_block_delete(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f) -{ - BYTE chip=0; - DWORD address; - mpio_smartmedia_t *sm; - - if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - - fatentry2hw(f, &chip, &address); - - if (address == MPIO_BLOCK_NOT_FOUND) - { - debug("hmm, what happens here? (%4x)\n", f->entry); - return 0; - } - - return (mpio_io_block_delete_phys(m, chip, address)); -} - -int -mpio_io_block_delete_phys(mpio_t *m, BYTE chip, DWORD address) -{ - mpio_smartmedia_t *sm; - int nwrite, nread; - BYTE cmdpacket[CMD_SIZE], status[CMD_SIZE]; - - /* Send command packet to MPIO */ - - if (chip == MPIO_INTERNAL_MEM) sm = &m->internal; - /* hack to support 2+4 internal chips - * who ever allowed me to write code??? -mager - */ - if (chip == (MPIO_INTERNAL_MEM+1)) sm = &m->internal; - if (chip == (MPIO_INTERNAL_MEM+3)) sm = &m->internal; - if (chip == (MPIO_INTERNAL_MEM+7)) sm = &m->internal; - if (chip == MPIO_EXTERNAL_MEM) - { - sm = &m->external; - mpio_zone_block_set_free_phys(m, chip, address); - } - - mpio_io_set_cmdpacket(m, DEL_BLOCK, chip, address, sm->size, 0, cmdpacket); - - debugn (5, ">>> MPIO\n"); - hexdump (cmdpacket, sizeof(cmdpacket)); - - nwrite = mpio_io_bulk_write(m->fd, cmdpacket, 0x40); - - if (nwrite != CMD_SIZE) - { - debug ("Failed to send command.\n\n"); - close (m->fd); - return 0; - } - -/* Receive packet from MPIO */ - nread = mpio_io_bulk_read (m->fd, status, CMD_SIZE); - - if ((nread == -1) || (nread != CMD_SIZE)) - { - debug ("Failed to read Sector.\n%x\n",nread); - close (m->fd); - return 0; - } - - debugn(5, "<<< MPIO\n"); - hexdump(status, CMD_SIZE); - - if (status[0] != 0xc0) - { - debugn (2,"error formatting Block %02x:%06x\n", - chip, address); - if (chip == MPIO_EXTERNAL_MEM) - { - sm = &m->external; - mpio_zone_block_set_defect_phys(m, chip, address); - } - } - - return CMD_SIZE; -} - -int -mpio_io_block_write(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f, BYTE *data) -{ - mpio_smartmedia_t *sm; - int nwrite; - int i; - DWORD block_address, ba; - BYTE cmdpacket[CMD_SIZE], sendbuff[BLOCK_TRANS]; - BYTE chip=0; - DWORD address; - - if (mem == MPIO_INTERNAL_MEM) - { - sm = &m->internal; - fatentry2hw(f, &chip, &address); - } - - if (mem == MPIO_EXTERNAL_MEM) - { - sm = &m->external; - /* find free physical block */ - chip = MPIO_EXTERNAL_MEM; - address = mpio_zone_block_find_free_log(m, mem, f->entry); - } - - /* build block for transfer to MPIO */ - for (i = 0; i < BLOCK_SECTORS; i++) - { - memcpy(sendbuff + (i * SECTOR_TRANS), - data + (i * SECTOR_SIZE), - SECTOR_SIZE); - memset(sendbuff + (i * SECTOR_TRANS) + SECTOR_SIZE, - 0xff, CMD_SIZE); - - if (mem == MPIO_INTERNAL_MEM) - { - if (i == 0) - { - memcpy((sendbuff+SECTOR_SIZE+(i * SECTOR_TRANS)), - f->i_fat, 0x10); -/* debug("address %02x:%06x\n", chip, address); */ -/* hexdumpn(0, f->i_fat, 0x10); */ - } - } - - /* fill in block information */ - if (mem == MPIO_EXTERNAL_MEM) - { - block_address = mpio_zone_block_get_logical(m, mem, address); - block_address = blockaddress_encode(block_address); - - ba = (block_address / 0x100) & 0xff; - sendbuff[(i * SECTOR_TRANS) + SECTOR_SIZE + 0x06] = ba; - sendbuff[(i * SECTOR_TRANS) + SECTOR_SIZE + 0x0b] = ba; - - ba = block_address & 0xff; - sendbuff[(i * SECTOR_TRANS) + SECTOR_SIZE + 0x07] = ba; - sendbuff[(i * SECTOR_TRANS) + SECTOR_SIZE + 0x0c] = ba; - - /* generate ECC Area information */ - mpio_ecc_256_gen ((sendbuff + (i * SECTOR_TRANS)), - ((sendbuff + (i * SECTOR_TRANS) - + SECTOR_SIZE + 13))); - mpio_ecc_256_gen ((sendbuff + (i * SECTOR_TRANS) - + (SECTOR_SIZE / 2)), - ((sendbuff + (i * SECTOR_TRANS) - + SECTOR_SIZE + 8))); - } - } - - mpio_io_set_cmdpacket(m, PUT_BLOCK, chip, address, sm->size, 0x48 , cmdpacket); - - debugn(5, "\n>>> MPIO\n"); - hexdump(cmdpacket, sizeof(cmdpacket)); - - nwrite = mpio_io_bulk_write(m->fd, cmdpacket, CMD_SIZE); - - if(nwrite != CMD_SIZE) - { - debug ("\nFailed to send command.\n\n"); - close (m->fd); - return 1; - } - - /* send packet to MPIO */ - debugn(5, "\n<<< MPIO\n"); - hexdump(sendbuff, BLOCK_TRANS); - nwrite = mpio_io_bulk_write (m->fd, sendbuff, BLOCK_TRANS); - - if(nwrite != BLOCK_TRANS) - { - debug ("\nFailed to read Block.\n%x\n",nwrite); - close (m->fd); - return 1; - } - - return 0; -} diff --git a/libmpio/io.h b/libmpio/io.h deleted file mode 100644 index 1c2baf9..0000000 --- a/libmpio/io.h +++ /dev/null @@ -1,95 +0,0 @@ -/* -*- linux-c -*- */ - -/* - * - * $Id: io.h,v 1.13 2003/04/04 22:03:05 germeier Exp $ - * - * Library for USB MPIO-* - * - * Markus Germeier (mager@tzi.de) - * - * uses code from mpio_stat.c by - * Yuji Touya (salmoon@users.sourceforge.net) - * - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * */ - -#ifndef _MPIO_IO_H_ -#define _MPIO_IO_H_ - -#include "defs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* phys.<->log. block mapping */ -int mpio_zone_init(mpio_t *, mpio_cmd_t); -/* context, memory bank, logical block */ -/* returns address of physical block! */ -DWORD mpio_zone_block_find_log(mpio_t *, mpio_cmd_t, DWORD); - /* context, memory bank, sequential block (for sector addressing) */ -/* returns address of physical block! */ -DWORD mpio_zone_block_find_seq(mpio_t *, mpio_cmd_t, DWORD); -/* context, memory bank, logical block */ -/* find used physical block and mark it as unused! */ -/* returns address of physical block! (to delete the physical block!) */ -DWORD mpio_zone_block_set_free(mpio_t *, mpio_cmd_t, DWORD); -/* context, memory bank, physical block */ -void mpio_zone_block_set_free_phys(mpio_t *, mpio_cmd_t, DWORD); -/* context, memory bank, physical block */ -void mpio_zone_block_set_defect_phys(mpio_t *, mpio_cmd_t, DWORD); -/* context, memory bank, logical block */ -/* looks for a free physical block to be used for given logical block */ -/* mark the found block used for this logical block */ -/* returns address of physical block! */ -DWORD mpio_zone_block_find_free_log(mpio_t *, mpio_cmd_t, DWORD); -DWORD mpio_zone_block_find_free_seq(mpio_t *, mpio_cmd_t, DWORD); -/* return zone-logical block for a given physical block */ -WORD mpio_zone_block_get_logical(mpio_t *, mpio_cmd_t, DWORD); - - -/* real I/O */ -int mpio_io_set_cmdpacket(mpio_t *, mpio_cmd_t, mpio_mem_t, - DWORD, WORD, BYTE, BYTE *); - -int mpio_io_bulk_read (int, BYTE *, int); -int mpio_io_bulk_write(int, BYTE *, int); - -/* read version block into memory */ -int mpio_io_version_read(mpio_t *, BYTE *); - -/* */ -int mpio_io_sector_read (mpio_t *, BYTE, DWORD, BYTE *); -int mpio_io_sector_write(mpio_t *, BYTE, DWORD, BYTE *); - -/* */ -int mpio_io_block_read (mpio_t *, mpio_mem_t, mpio_fatentry_t *, BYTE *); -int mpio_io_block_write (mpio_t *, mpio_mem_t, mpio_fatentry_t *, BYTE *); -int mpio_io_block_delete(mpio_t *, mpio_mem_t, mpio_fatentry_t *); -/* needed for formatting of external memory */ -int mpio_io_block_delete_phys(mpio_t *, BYTE, DWORD); - -/* */ -int mpio_io_spare_read (mpio_t *, BYTE, DWORD, WORD, BYTE, BYTE *, int, - mpio_callback_init_t); - -#ifdef __cplusplus -} -#endif - -#endif /* _MPIO_IO_H_ */ diff --git a/libmpio/mpio.c b/libmpio/mpio.c deleted file mode 100644 index 04c3b58..0000000 --- a/libmpio/mpio.c +++ /dev/null @@ -1,1301 +0,0 @@ -/* - * - * $Id: mpio.c,v 1.53 2003/04/19 23:58:02 germeier Exp $ - * - * Library for USB MPIO-* - * - * Markus Germeier (mager@tzi.de) - * - * uses code from mpio_stat.c by - * Yuji Touya (salmoon@users.sourceforge.net) - * - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * */ - -#include -#include -#include -#include -#include -#include - -#include "cis.h" -#include "defs.h" -#include "debug.h" -#include "directory.h" -#include "io.h" -#include "mpio.h" -#include "smartmedia.h" -#include "fat.h" - -void mpio_bail_out(void); -void mpio_init_internal(mpio_t *); -void mpio_init_external(mpio_t *); -int mpio_check_filename(mpio_filename_t); - -int mpio_file_get_real(mpio_t *, mpio_mem_t, mpio_filename_t, mpio_filename_t, - mpio_callback_t, BYTE **); - -int mpio_file_put_real(mpio_t *, mpio_mem_t, mpio_filename_t, mpio_filename_t, - mpio_filetype_t, mpio_callback_t, BYTE *, int); - -static BYTE *mpio_model_name[] = { - "MPIO-DME", - "MPIO-DMG", - "MPIO-DMG+", - "MPIO-DMB", - "MPIO-DMB+", - "MPIO-DMK", - "MPIO-FD100", - "MPIO-FL100", - "MPIO-FY100", - "unknown" -}; - -static mpio_error_t mpio_errors[] = { - { MPIO_ERR_FILE_NOT_FOUND, - "The selected file can not be found." }, - { MPIO_ERR_NOT_ENOUGH_SPACE, - "There is not enough space left on the selected memory card." }, - { MPIO_ERR_FILE_EXISTS, - "The selected file already exists and can not be overwritten. Remove it first." }, - { MPIO_ERR_FAT_ERROR, - "Internal error while reading the FAT." }, - { MPIO_ERR_READING_FILE, - "The selected file can not be read." }, - { MPIO_ERR_PERMISSION_DENIED, - "There are not enough rights to access the file/directory." }, - { MPIO_ERR_WRITING_FILE, - "There are no permisson to write to the selected file." }, - { MPIO_ERR_DIR_TOO_LONG, - "The selected directory name is to long." }, - { MPIO_ERR_DIR_NOT_FOUND, - "The selected directory can not be found." }, - { MPIO_ERR_DIR_NOT_A_DIR, - "The selected directory is not a directory." }, - { MPIO_ERR_DIR_NAME_ERROR, - "The selected directory name is not allowed." }, - { MPIO_ERR_DIR_NOT_EMPTY, - "The selected directory is not empty." }, - { MPIO_ERR_DEVICE_NOT_READY, - "Could not open " MPIO_DEVICE "\n" - "Verify that the mpio module is loaded and " - "your MPIO is\nconnected and powered up.\n" }, - { MPIO_ERR_OUT_OF_MEMORY, - "Out of Memory." }, - { MPIO_ERR_INTERNAL, - "Oops, internal ERROR. :-(" }, - { MPIO_ERR_INT_STRING_INVALID, - "Internal Error: Supported is invalid!" } -}; - -static const int mpio_error_num = sizeof mpio_errors / sizeof(mpio_error_t); - -static int _mpio_errno = 0; - -#define MPIO_ERR_RETURN(err) { mpio_id3_end(m); _mpio_errno = err; return -1 ; } - -#define MPIO_CHECK_FILENAME(filename) \ - if (!mpio_check_filename(filename)) { \ - MPIO_ERR_RETURN(MPIO_ERR_INT_STRING_INVALID); \ - } - -void -mpio_bail_out(void){ - printf("I'm utterly confused and aborting now, sorry!"); - printf("Please report this to: mpio-devel@lists.sourceforge.net\n"); - exit(1); -} - -int -mpio_check_filename(mpio_filename_t filename) -{ - BYTE *p=filename; - - while (p < (filename + MPIO_FILENAME_LEN)) - { - if (*p) - return 1; - p++; - } - - return 0; -} - -void -mpio_init_internal(mpio_t *m) -{ - mpio_smartmedia_t *sm = &m->internal; - BYTE i_offset = 0x18; - - /* init main memory parameters */ - sm->manufacturer = m->version[i_offset]; - sm->id = m->version[i_offset + 1]; - sm->chips = 1; - if (!(mpio_id_valid(m->version[i_offset]))) - { - sm->manufacturer = 0; - sm->id = 0; - sm->size = 0; - debug("WARNING: no internal memory found\n"); - return; - } - - - /* look for further installed memory chips - * models with 1, 2 and 4 chips are known - * (there _really_ shouldn't be any other versions out there ...) - */ - while ((sm->chips < 4) && - (mpio_id_valid(m->version[i_offset + (2 * sm->chips)]))) - { - if(mpio_id2mem(sm->id) != - mpio_id2mem(m->version[i_offset + (2 * sm->chips) + 1])) - { - printf("Found a MPIO with internal chips of different sizes!"); - mpio_bail_out(); - } - sm->chips++; - } - - if ((sm->chips == 3) || (sm->chips > 4)) - { - printf("Found a MPIO with %d internal chips", sm->chips); - mpio_bail_out(); - } - - sm->size = sm->chips * mpio_id2mem(sm->id); - debugn(2, "found %d chip(s) with %d MB => %d MB internal mem\n", - sm->chips, mpio_id2mem(sm->id), sm->size); - - /* used for size calculations (see mpio_memory_free) */ - mpio_id2geo(sm->id, &sm->geo); - - /* read FAT information from spare area */ - sm->max_cluster = (sm->size * 1024) / 16; /* 1 cluster == 16 KB */ - sm->max_blocks = sm->max_cluster; - debugn(2, "max_cluster: %d\n", sm->max_cluster); - /* 16 bytes per cluster */ - sm->fat_size = (sm->max_cluster * 16) / SECTOR_SIZE; - debugn(2, "fat_size: %04x\n", sm->fat_size * SECTOR_SIZE); - sm->fat = malloc(sm->fat_size * SECTOR_SIZE); - /* fat will be read in mpio_init, so we can more easily handle - a callback function */ - - if (!(sm->fat_size)) - { - printf("Some values on the way to the FAT calculations did not compute. :-(\n"); - mpio_bail_out(); - } - - - /* Read directory from internal memory */ - sm->dir_offset=0; - sm->root = malloc (sizeof(mpio_directory_t)); - sm->root->name[0] = 0; - sm->root->next = NULL; - sm->root->prev = NULL; - mpio_rootdir_read(m, MPIO_INTERNAL_MEM); - sm->cdir = sm->root; -} - -void -mpio_init_external(mpio_t *m) -{ - mpio_smartmedia_t *sm = &(m->external); - BYTE e_offset = 0x20; - - /* heuristic to find the right offset for the external memory */ - while((e_offset < 0x3a) && !(mpio_id_valid(m->version[e_offset]))) - e_offset++; - - if ((mpio_id_valid(m->version[e_offset])) && - (m->model != MPIO_MODEL_FL100)) /* ignore external memory ATM until - we know how to support it! */ - { - sm->manufacturer = m->version[e_offset]; - sm->id = m->version[e_offset + 1]; - } else { - sm->manufacturer = 0; - sm->id = 0; - sm->chips = 0; - sm->size = 0; - } - - /* init memory parameters if external memory is found */ - if (sm->id != 0) - { - /* Read things from external memory (if available) */ - sm->size = mpio_id2mem(sm->id); - sm->chips = 1; /* external is always _one_ chip !! */ - - mpio_id2geo(sm->id, &sm->geo); - - if (sm->size < 16) - { - debug("Sorry, I don't believe this software works with " - "SmartMedia Cards less than 16MB\n" - "Proceed with care and send any findings to: " - "mpio-devel@lists.sourceforge.net\n"); - } - - /* for reading the spare area later! */ - sm->max_blocks = sm->size / 16 * 1024; /* 1 cluster == 16 KB */ - sm->spare = malloc(sm->max_blocks * 0x10); - } - - /* setup directory support */ - sm->dir_offset=0; - sm->root = malloc (sizeof(mpio_directory_t)); - sm->root->name[0] = 0; - sm->root->next = NULL; - sm->root->prev = NULL; - sm->cdir = sm->root; -} - -mpio_t * -mpio_init(mpio_callback_init_t progress_callback) -{ - mpio_t *new_mpio; - mpio_smartmedia_t *sm; - int id_offset; - BYTE i; - - new_mpio = malloc(sizeof(mpio_t)); - if (!new_mpio) { - debug ("Error allocating memory for mpio_t"); - return NULL; - } - memset(new_mpio, 0, sizeof(mpio_t)); - - new_mpio->fd = open(MPIO_DEVICE, O_RDWR); - - if (new_mpio->fd < 0) { - _mpio_errno = MPIO_ERR_DEVICE_NOT_READY; - return NULL; - } - - /* Read Version Information */ - mpio_io_version_read(new_mpio, new_mpio->version); - - /* fill in values */ - snprintf(new_mpio->firmware.id, 12, "%s", new_mpio->version); - /* fix for newer versions which have a 0x00 in their version */ - for (i=0x0c ; i<0x10 ; i++) - if (new_mpio->version[i] == 0x00) - new_mpio->version[i]=' '; - snprintf(new_mpio->firmware.major, 3, "%s", new_mpio->version + 0x0c); - snprintf(new_mpio->firmware.minor, 3, "%s", new_mpio->version + 0x0e); - snprintf(new_mpio->firmware.year, 5, "%s", new_mpio->version + 0x10); - snprintf(new_mpio->firmware.month, 3, "%s", new_mpio->version + 0x14); - snprintf(new_mpio->firmware.day, 3, "%s", new_mpio->version + 0x16); - - /* there are different identification strings! */ - if (strncmp(new_mpio->version, "MPIO", 4) == 0) { - /* strings: "MPIOxy " */ - id_offset = 4; - - /* string: "MPIO-xy " */ - if (new_mpio->version[id_offset] == '-') - id_offset++; - - /* identify different versions */ - switch (new_mpio->version[id_offset]) - { - case 'E': - new_mpio->model = MPIO_MODEL_DME; - break ; - case 'K': - new_mpio->model = MPIO_MODEL_DMK; - break ; - case 'G': - new_mpio->model = MPIO_MODEL_DMG; - if (new_mpio->version[id_offset+1] == 'P') - new_mpio->model = MPIO_MODEL_DMG_PLUS; - break ; - case 'B': - new_mpio->model = MPIO_MODEL_DMB; - if (new_mpio->version[id_offset+1] == 'P') - new_mpio->model = MPIO_MODEL_DMB_PLUS; - break; - default: - new_mpio->model = MPIO_MODEL_UNKNOWN; - } - } else if (strncmp(new_mpio->version, "FD100", 5) == 0) { - new_mpio->model = MPIO_MODEL_FD100; - } else if (strncmp(new_mpio->version, "FL100", 5) == 0) { - /* we assume this model is not supported */ - new_mpio->model = MPIO_MODEL_FL100; - debug("FL100 found: External memory is ignored, because we don't know how" - " to support it at the moment (MultiMediaCards instead of SmartMedia)\n"); - } else if (strncmp(new_mpio->version, "FY100", 5) == 0) { - new_mpio->model = MPIO_MODEL_FY100; - /* I assume this is like the FD100/FL100, I didn't had the chance to - look at a FY100 firmware yet. -mager */ - debug("FY100 found: Beware, this model is not tested and we don't know" - " if it does work!\n"); - } else { - new_mpio->model = MPIO_MODEL_UNKNOWN; - } - - if (new_mpio->model == MPIO_MODEL_UNKNOWN) { - debug("Unknown version string found!\n" - "Please report this to: mpio-devel@lists.sourceforge.net\n"); - hexdumpn(1, new_mpio->version, CMD_SIZE); - } - - /* internal init */ - mpio_init_internal(new_mpio); - - /* external init */ - mpio_init_external(new_mpio); - - /* read FAT/spare area */ - if (new_mpio->internal.id) - mpio_fat_read(new_mpio, MPIO_INTERNAL_MEM, progress_callback); - - /* read the spare area (for block mapping) */ - if (new_mpio->external.id) - { - sm = &new_mpio->external; - mpio_io_spare_read(new_mpio, MPIO_EXTERNAL_MEM, 0, - sm->size, 0, sm->spare, - (sm->max_blocks * 0x10), progress_callback); - mpio_zone_init(new_mpio, MPIO_EXTERNAL_MEM); - - /* card might be defect */ - if (mpio_bootblocks_read(new_mpio, MPIO_EXTERNAL_MEM)==0) - { - sm->fat = malloc(SECTOR_SIZE*sm->fat_size); - mpio_fat_read(new_mpio, MPIO_EXTERNAL_MEM, NULL); - mpio_rootdir_read(new_mpio, MPIO_EXTERNAL_MEM); - } - } - - /* set default charset for filename conversion */ - new_mpio->charset=strdup(MPIO_CHARSET); - - /* disable ID3 rewriting support */ - new_mpio->id3=0; - strncpy(new_mpio->id3_format, MPIO_ID3_FORMAT, INFO_LINE); - new_mpio->id3_temp[0]=0x00; - - return new_mpio; -} - -/* - * returns available memory - * - * free: give back free memory size - * - */ -int -mpio_memory_free(mpio_t *m, mpio_mem_t mem, int *free) -{ - if (mem==MPIO_INTERNAL_MEM) { - if (!m->internal.size) { - *free=0; - return 0; - } - *free=mpio_fat_free_clusters(m, mem); - return (m->internal.geo.SumSector - * SECTOR_SIZE / 1000 * m->internal.chips); - } - - if (mem==MPIO_EXTERNAL_MEM) { - if (!m->external.size) { - *free=0; - return 0; - } - *free=mpio_fat_free_clusters(m, mem); - return (m->external.geo.SumSector * SECTOR_SIZE / 1000); - } - - return 0; -} - -void -mpio_close(mpio_t *m) -{ - if (m) { - close(m->fd); - - if(m->internal.fat) - free(m->internal.fat); - if(m->external.fat) - free(m->external.fat); - - free(m); - } -} - -mpio_model_t -mpio_get_model(mpio_t *m) -{ - mpio_model_t r; - - if (m) - { - r = m->model; - } else { - r = MPIO_MODEL_UNKNOWN; - } - - return r; -} - -void -mpio_get_info(mpio_t *m, mpio_info_t *info) -{ - int max=INFO_LINE-1; - snprintf(info->firmware_id, max, "\"%s\"", m->firmware.id); - snprintf(info->firmware_version, max, "%s.%s", - m->firmware.major, m->firmware.minor); - snprintf(info->firmware_date, max, "%s.%s.%s", - m->firmware.day, m->firmware.month, m->firmware.year); - snprintf(info->model, max, "%s", mpio_model_name[m->model]); - - if (!m->internal.id) - { - snprintf(info->mem_internal, max, "not available"); - } else { - if (m->internal.chips == 1) - { - snprintf(info->mem_internal, max, "%3dMB (%s)", - mpio_id2mem(m->internal.id), - mpio_id2manufacturer(m->internal.manufacturer)); - } else { - snprintf(info->mem_internal, max, "%3dMB (%s) - %d chips", - mpio_id2mem(m->internal.id)*m->internal.chips, - mpio_id2manufacturer(m->internal.manufacturer), - m->internal.chips); - } - } - - if (m->external.id) - { - snprintf(info->mem_external, max, "%3dMB (%s)", - mpio_id2mem(m->external.id), - mpio_id2manufacturer(m->external.manufacturer)); - } else { - snprintf(info->mem_external, max, "not available"); - } - -} - - -int -mpio_file_get_as(mpio_t *m, mpio_mem_t mem, mpio_filename_t filename, - mpio_filename_t as, mpio_callback_t progress_callback) -{ - return mpio_file_get_real(m, mem, filename, as, progress_callback, NULL); -} - -int -mpio_file_get(mpio_t *m, mpio_mem_t mem, mpio_filename_t filename, - mpio_callback_t progress_callback) -{ - return mpio_file_get_real(m, mem, filename, NULL, progress_callback, NULL); -} - -int -mpio_file_get_to_memory(mpio_t *m, mpio_mem_t mem, mpio_filename_t filename, - mpio_callback_t progress_callback, BYTE **memory) -{ - return mpio_file_get_real(m, mem, filename, NULL, progress_callback, memory); -} - -int -mpio_file_get_real(mpio_t *m, mpio_mem_t mem, mpio_filename_t filename, - mpio_filename_t as, mpio_callback_t progress_callback, - BYTE **memory) -{ - mpio_smartmedia_t *sm; - BYTE block[BLOCK_SIZE]; - int fd, towrite; - BYTE *p; - mpio_fatentry_t *f = 0; - struct utimbuf utbuf; - long mtime; - DWORD filesize, fsize; - BYTE abort = 0; - int merror; - - MPIO_CHECK_FILENAME(filename); - - if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - - if(as==NULL) { - as = filename; - } - - /* find file */ - p = mpio_dentry_find_name(m, mem, filename); - if (!p) - p = mpio_dentry_find_name_8_3(m, mem, filename); - - if (p) - f = mpio_dentry_get_startcluster(m, mem, p); - - if (f && p) { - filesize=fsize=mpio_dentry_get_filesize(m, mem, p); - - if (memory) - { - *memory = malloc(filesize); - } else { - unlink(filename); - fd = open(as, (O_RDWR | O_CREAT), (S_IRWXU | S_IRGRP | S_IROTH)); - } - - do - { - mpio_io_block_read(m, mem, f, block); - - if (filesize > BLOCK_SIZE) { - towrite = BLOCK_SIZE; - } else { - towrite = filesize; - } - - if (memory) - { - memcpy((*memory)+(fsize-filesize) , block, towrite); - } else { - if (write(fd, block, towrite) != towrite) { - debug("error writing file data\n"); - close(fd); - free (f); - MPIO_ERR_RETURN(MPIO_ERR_WRITING_FILE); - } - } - - filesize -= towrite; - - if (progress_callback) - abort=(*progress_callback)((fsize-filesize), fsize); - if (abort) - debug("aborting operation"); - - } while ((((merror=(mpio_fatentry_next_entry(m, mem, f)))>0) && - (filesize>0)) && (!abort)); - - if (merror<0) - debug("defective block encountered!\n"); - - if(!memory) - { - close (fd); - free (f); - } - - /* read and copied code from mtools-3.9.8/mcopy.c - * to make this one right - */ - mtime=mpio_dentry_get_time(m, mem, p); - utbuf.actime = mtime; - utbuf.modtime = mtime; - utime(filename, &utbuf); - - } else { - debugn(2, "unable to locate the file: %s\n", filename); - _mpio_errno=MPIO_ERR_FILE_NOT_FOUND; - } - - return (fsize-filesize); -} - -int -mpio_file_put_as(mpio_t *m, mpio_mem_t mem, mpio_filename_t filename, - mpio_filename_t as, mpio_filetype_t filetype, - mpio_callback_t progress_callback) -{ - return mpio_file_put_real(m, mem, filename, as, filetype, - progress_callback, NULL,0); -} - -int -mpio_file_put(mpio_t *m, mpio_mem_t mem, mpio_filename_t filename, - mpio_filetype_t filetype, mpio_callback_t progress_callback) -{ - return mpio_file_put_real(m, mem, filename, NULL, filetype, - progress_callback, NULL,0); -} - -int -mpio_file_put_from_memory(mpio_t *m, mpio_mem_t mem, mpio_filename_t filename, - mpio_filetype_t filetype, - mpio_callback_t progress_callback, - BYTE *memory, int memory_size) -{ - return mpio_file_put_real(m, mem, filename, NULL, filetype, - progress_callback, memory, memory_size); -} - -int -mpio_file_put_real(mpio_t *m, mpio_mem_t mem, mpio_filename_t i_filename, - mpio_filename_t o_filename, mpio_filetype_t filetype, - mpio_callback_t progress_callback, - BYTE *memory, int memory_size) -{ - mpio_smartmedia_t *sm; - mpio_fatentry_t *f, current, firstblock, backup; - WORD start; - BYTE block[BLOCK_SIZE]; - BYTE use_filename[INFO_LINE]; - int fd, toread; - struct stat file_stat; - struct tm tt; - time_t curr; - int id3; - - BYTE *p = NULL; - DWORD filesize, fsize, free, blocks; - BYTE abort = 0; - - if(o_filename == NULL) { - o_filename = i_filename; - } - - MPIO_CHECK_FILENAME(o_filename); - - if (mem==MPIO_INTERNAL_MEM) sm=&m->internal; - if (mem==MPIO_EXTERNAL_MEM) sm=&m->external; - - if (memory) - { - fsize=filesize=memory_size; - } else { - id3 = mpio_id3_do(m, i_filename, use_filename); - if (!id3) - strncat(use_filename, i_filename, INFO_LINE); - if (stat((const char *)use_filename, &file_stat)!=0) { - debug("could not find file: %s\n", use_filename); - MPIO_ERR_RETURN(MPIO_ERR_FILE_NOT_FOUND); - } - fsize=filesize=file_stat.st_size; - debugn(2, "filesize: %d\n", fsize); - } - - /* check if there is enough space left */ - mpio_memory_free(m, mem, &free); - if (free*1024entry; - } - - /* find file-id for internal memory */ - if (mem==MPIO_INTERNAL_MEM) - { - f->i_index=mpio_fat_internal_find_fileindex(m); - debugn(2, "fileindex: %02x\n", f->i_index); - f->i_fat[0x01]= f->i_index; - if (m->model >= MPIO_MODEL_FD100) - f->i_fat[0x0e] = f->i_index; - start = f->i_index; - - /* number of blocks needed for file */ - blocks = filesize / 0x4000; - if (filesize % 0x4000) - blocks++; - debugn(2, "blocks: %02x\n", blocks); - f->i_fat[0x02]=(blocks / 0x100) & 0xff; - f->i_fat[0x03]= blocks & 0xff; - } - - if (!memory) - { - /* open file for reading */ - fd = open(use_filename, O_RDONLY); - if (fd==-1) - { - debug("could not open file: %s\n", use_filename); - MPIO_ERR_RETURN(MPIO_ERR_FILE_NOT_FOUND); - } - } - - while ((filesize>BLOCK_SIZE) && (!abort)) { - - if (filesize>=BLOCK_SIZE) { - toread=BLOCK_SIZE; - } else { - toread=filesize; - } - - if (memory) - { - memcpy(block, memory+(fsize-filesize), toread); - } else { - if (read(fd, block, toread)!=toread) { - debug("error reading file data\n"); - close(fd); - MPIO_ERR_RETURN(MPIO_ERR_READING_FILE); - } - } - filesize -= toread; - - /* get new free block from FAT and write current block out */ - memcpy(¤t, f, sizeof(mpio_fatentry_t)); - if (!(mpio_fatentry_next_free(m, mem, f))) - { - debug ("Found no free cluster during mpio_file_put\n" - "This should never happen\n"); - exit(-1); - } - mpio_fatentry_set_next(m ,mem, ¤t, f); - mpio_io_block_write(m, mem, ¤t, block); - - if (progress_callback) - abort=(*progress_callback)((fsize-filesize), fsize); - } - - /* handle the last block to write */ - - if (filesize>=BLOCK_SIZE) { - toread=BLOCK_SIZE; - } else { - toread=filesize; - } - - if (memory) - { - memcpy(block, memory+(fsize-filesize), toread); - } else { - if (read(fd, block, toread)!=toread) { - debug("error reading file data\n"); - close(fd); - MPIO_ERR_RETURN(MPIO_ERR_READING_FILE); - } - } - filesize -= toread; - - /* mark end of FAT chain and write last block */ - mpio_fatentry_set_eof(m ,mem, f); - mpio_io_block_write(m, mem, f, block); - - if (!memory) - close(fd); - - if (progress_callback) - (*progress_callback)((fsize-filesize), fsize); - - if (abort) - { /* delete the just written blocks, because the user - * aborted the operation - */ - debug("aborting operation\n"); - debug("removing already written blocks\n"); - - filesize=fsize; - - memcpy(¤t, &firstblock, sizeof(mpio_fatentry_t)); - memcpy(&backup, &firstblock, sizeof(mpio_fatentry_t)); - - while (mpio_fatentry_next_entry(m, mem, ¤t)) - { - mpio_io_block_delete(m, mem, &backup); - mpio_fatentry_set_free(m, mem, &backup); - memcpy(&backup, ¤t, sizeof(mpio_fatentry_t)); - - if (filesize > BLOCK_SIZE) - { - filesize -= BLOCK_SIZE; - } else { - filesize -= filesize; - } - - if (progress_callback) - (*progress_callback)((fsize-filesize), fsize); - } - mpio_io_block_delete(m, mem, &backup); - mpio_fatentry_set_free(m, mem, &backup); - - if (filesize > BLOCK_SIZE) - { - filesize -= BLOCK_SIZE; - } else { - filesize -= filesize; - } - - if (progress_callback) - (*progress_callback)((fsize-filesize), fsize); - - } else { - if (memory) - { - time(&curr); - tt = * localtime(&curr); - } - mpio_dentry_put(m, mem, - o_filename, strlen(o_filename), - ((memory)?mktime(&tt):file_stat.st_ctime), - fsize, start, 0x20); - } - - mpio_id3_end(m); - - return fsize-filesize; -} - -int -mpio_file_switch(mpio_t *m, mpio_mem_t mem, - mpio_filename_t file1, mpio_filename_t file2) -{ - BYTE *p1, *p2; - - /* find files */ - p1 = mpio_dentry_find_name(m, mem, file1); - if (!p1) - p1 = mpio_dentry_find_name_8_3(m, mem, file1); - - p2 = mpio_dentry_find_name(m, mem, file2); - if (!p2) - p2 = mpio_dentry_find_name_8_3(m, mem, file2); - - if ((!p1) || (!p2)) - MPIO_ERR_RETURN(MPIO_ERR_FILE_NOT_FOUND); - - mpio_dentry_switch(m, mem, p1, p2); - - return 0; -} - -int -mpio_file_rename(mpio_t *m, mpio_mem_t mem, - mpio_filename_t old, mpio_filename_t new) -{ - BYTE *p; - - /* find files */ - p = mpio_dentry_find_name(m, mem, old); - if (!p) - p = mpio_dentry_find_name_8_3(m, mem, old); - - if (!p) - MPIO_ERR_RETURN(MPIO_ERR_FILE_NOT_FOUND); - - mpio_dentry_rename(m, mem, p, new); - - return 0; -} - -int mpio_file_move(mpio_t *m,mpio_mem_t mem, mpio_filename_t file, - mpio_filename_t after) -{ - BYTE *p1,*p2; - - if( ( p1 = mpio_dentry_find_name(m,mem,file)) == NULL ) { - if( (p1 = mpio_dentry_find_name_8_3(m, mem, file)) == NULL ) { - MPIO_ERR_RETURN(MPIO_ERR_FILE_NOT_FOUND); - } - } - - if(after!=NULL) { - if( ( p2 = mpio_dentry_find_name(m,mem,after)) == NULL ) { - if( (p2 = mpio_dentry_find_name_8_3(m, mem, after)) == NULL ) { - MPIO_ERR_RETURN(MPIO_ERR_FILE_NOT_FOUND); - } - } - } - - fprintf(stderr," -- moving '%s' after '%s'\n",file,after); - - mpio_dentry_move(m,mem,p1,p2); - - return 0; -} - -int -mpio_memory_format(mpio_t *m, mpio_mem_t mem, - mpio_callback_t progress_callback) -{ - int data_offset; - mpio_smartmedia_t *sm; - mpio_fatentry_t *f; - DWORD clusters; - BYTE abort = 0; - BYTE *cis, *mbr, *pbr; - BYTE defect[SECTOR_SIZE]; - int i; - - if (mem == MPIO_INTERNAL_MEM) - { - sm=&m->internal; - data_offset = 0x01; - } - - if (mem == MPIO_EXTERNAL_MEM) - { - sm = &m->external; - data_offset = 0x02; - } - - clusters = sm->size*128; - - - /* TODO: read and write "Config.dat" so the player does not become "dumb" */ - if (mem==MPIO_INTERNAL_MEM) - { - /* clear the fat before anything else, so we can mark clusters defective - * if we found a bad block - */ - /* external mem must be handled diffrently, - * see comment(s) below! - */ - mpio_fat_clear(m, mem); - f = mpio_fatentry_new(m, mem, data_offset, FTYPE_MUSIC); - do - { - - if (!mpio_io_block_delete(m, mem, f)) - mpio_fatentry_set_defect(m, mem, f); - - if (progress_callback) - { - if (!abort) - { - abort=(*progress_callback)(f->entry, sm->max_cluster + 1); - if (abort) - debug("received abort signal, but ignoring it!\n"); - } else { - (*progress_callback)(f->entry, sm->max_cluster + 1); - } - } - - } while (mpio_fatentry_plus_plus(f)); - free(f); - } - - if (mem == MPIO_EXTERNAL_MEM) { - /* delete all blocks! */ - - i=0; - while (i < sm->max_blocks) - { - mpio_io_block_delete_phys(m, mem, (i * BLOCK_SECTORS)); - i++; - - if (progress_callback) - { - if (!abort) - { - abort=(*progress_callback)(i, sm->max_blocks); - if (abort) - debug("received abort signal, but ignoring it!\n"); - } else { - (*progress_callback)(i, sm->max_blocks); - } - } - - - } - - /* generate "defect" first block */ - mpio_io_sector_write(m, mem, MPIO_BLOCK_DEFECT, defect); - - /* format CIS area */ - f = mpio_fatentry_new(m, mem, MPIO_BLOCK_CIS, FTYPE_MUSIC); - /* mpio_io_block_delete(m, mem, f); */ - free(f); - cis = (BYTE *)mpio_cis_gen(); /* hmm, why this cast? */ - mpio_io_sector_write(m, mem, MPIO_BLOCK_CIS, cis); - mpio_io_sector_write(m, mem, MPIO_BLOCK_CIS+1, cis); - free(cis); - - /* generate boot blocks ... */ - mbr = (BYTE *)mpio_mbr_gen(m->external.size); - pbr = (BYTE *)mpio_pbr_gen(m->external.size); - /* ... copy the blocks to internal memory structurs ... */ - memcpy(sm->cis, cis, SECTOR_SIZE); - memcpy(sm->mbr, mbr, SECTOR_SIZE); - memcpy(sm->pbr, pbr, SECTOR_SIZE); - /* ... and set internal administration accordingly */ - mpio_mbr_eval(sm); - mpio_pbr_eval(sm); - - if (!sm->fat) /* perhaps we have to build a new FAT */ - sm->fat=malloc(sm->fat_size*SECTOR_SIZE); - mpio_fat_clear(m, mem); - - /* TODO: for external memory we have to work a little "magic" - * to identify and mark "bad blocks" (because we have a set of - * spare ones! - */ - } - - mpio_rootdir_clear(m, mem); - - /* this writes the FAT *and* the root directory */ - mpio_fat_write(m, mem); - - if (progress_callback) - (*progress_callback)(sm->max_cluster+1, sm->max_cluster+1); - - return 0; -} - -int -mpio_file_del(mpio_t *m, mpio_mem_t mem, mpio_filename_t filename, - mpio_callback_t progress_callback) -{ - BYTE *p; - mpio_smartmedia_t *sm; - mpio_fatentry_t *f, backup; - DWORD filesize, fsize; - BYTE abort=0; - - MPIO_CHECK_FILENAME(filename); - - if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - - if ((strcmp(filename, "..") == 0) || - (strcmp(filename, ".") == 0)) - { - debugn(2, "directory name not allowed: %s\n", filename); - MPIO_ERR_RETURN(MPIO_ERR_DIR_NAME_ERROR); - } - - /* find file */ - p = mpio_dentry_find_name(m, mem, filename); - if (!p) - p = mpio_dentry_find_name_8_3(m, mem, filename); - - if (p) - f = mpio_dentry_get_startcluster(m, mem, p); - - if (f && p) { - if (mpio_dentry_is_dir(m, mem, p) == MPIO_OK) - { - /* ugly */ - mpio_directory_cd(m, mem, filename); - if (mpio_directory_is_empty(m, mem, sm->cdir) != MPIO_OK) - { - mpio_directory_cd(m, mem, ".."); - MPIO_ERR_RETURN(MPIO_ERR_DIR_NOT_EMPTY); - } else { - mpio_directory_cd(m, mem, ".."); - } - } - - filesize=fsize=mpio_dentry_get_filesize(m, mem, p); - do - { - debugn(2, "sector: %4x\n", f->entry); - - mpio_io_block_delete(m, mem, f); - - if (filesize != fsize) - mpio_fatentry_set_free(m, mem, &backup); - - memcpy(&backup, f, sizeof(mpio_fatentry_t)); - - if (filesize > BLOCK_SIZE) - { - filesize -= BLOCK_SIZE; - } else { - filesize -= filesize; - } - - if (progress_callback) - { - if (!abort) - { - abort=(*progress_callback)((fsize-filesize), fsize); - if (abort) - debug("received abort signal, but ignoring it!\n"); - } else { - (*progress_callback)((fsize-filesize), fsize); - } - } - - } while (mpio_fatentry_next_entry(m, mem, f)); -/* mpio_io_block_delete(m, mem, &backup); */ - mpio_fatentry_set_free(m, mem, &backup); - free(f); - - } else { - debugn(2, "unable to locate the file: %s\n", filename); - MPIO_ERR_RETURN(MPIO_ERR_FILE_NOT_FOUND); - } - - mpio_dentry_delete(m, mem, filename); - - return MPIO_OK; -} - -int -mpio_sync(mpio_t *m, mpio_mem_t mem) -{ - mpio_smartmedia_t *sm; - - if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; - if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; - - if (!sm->size) - return 0; - - /* this writes the FAT *and* the root directory */ - return mpio_fat_write(m, mem); -} - -int -mpio_health(mpio_t *m, mpio_mem_t mem, mpio_health_t *r) -{ - mpio_smartmedia_t *sm; - int i, j, zones; - mpio_fatentry_t *f; - - if (mem == MPIO_INTERNAL_MEM) - { - sm = &m->internal; - r->num = sm->chips; - - f = mpio_fatentry_new(m, mem, 0x00, FTYPE_MUSIC); - - for (i=0 ; i < sm->chips; i++) - { - r->data[i].spare = 0; - r->data[i].total = (sm->max_cluster / sm->chips); - r->data[i].broken = 0; - /* now count the broken blocks */ - for(j=0; jdata[i].total; j++) - { - if (mpio_fatentry_is_defect(m, mem, f)) - r->data[i].broken++; - mpio_fatentry_plus_plus(f); - } - } - - free(f); - - return MPIO_OK; - } - - - if (mem == MPIO_EXTERNAL_MEM) - { - sm = &m->external; - - zones = sm->max_cluster / MPIO_ZONE_LBLOCKS + 1; - r->num = zones; - - for(i=0; idata[i].spare = (i?24:22); /* first zone has only 23 due to CIS */ - r->data[i].total = MPIO_ZONE_PBLOCKS; - r->data[i].broken = 0; - /* now count the broken blocks */ - for(j=0; jzonetable[i][j] == MPIO_BLOCK_DEFECT) - r->data[i].broken++; - } - if (r->data[i].spare < r->data[i].broken) - debug("(spare blocks expect trouble!\n"); - } - return MPIO_OK; - } - - return MPIO_ERR_INTERNAL; -} - -int -mpio_memory_dump(mpio_t *m, mpio_mem_t mem) -{ - BYTE block[BLOCK_SIZE]; - int i; - - if (mem == MPIO_INTERNAL_MEM) - { - hexdump(m->internal.fat, m->internal.max_blocks*0x10); - hexdump(m->internal.root->dir, DIR_SIZE); - } - - if (mem == MPIO_EXTERNAL_MEM) - { - hexdump(m->external.spare, m->external.max_blocks*0x10); - hexdump(m->external.fat, m->external.fat_size*SECTOR_SIZE); - hexdump(m->external.root->dir, DIR_SIZE); - } - - for (i = 0 ; i<=0x100 ; i++) - mpio_io_sector_read(m, mem, i, block); - - return 0; -} - -int -mpio_errno(void) -{ - int no = _mpio_errno; - _mpio_errno = 0; - - return no; -} - -char * -mpio_strerror(int err) -{ - int i; - - if (err >= 0) return NULL; - - for (i = 0; i < mpio_error_num; i++) { - if (mpio_errors[i].id == err) - return mpio_errors[i].msg; - } - - return NULL; -} - -void -mpio_perror(char *prefix) -{ - char *msg = mpio_strerror(_mpio_errno); - - if (msg == NULL) return; - - if (prefix) - fprintf(stderr, "%s: %s\n", prefix, msg); - else - fprintf(stderr, "%s\n", msg); -} diff --git a/libmpio/mpio.h b/libmpio/mpio.h deleted file mode 100644 index 5684b3d..0000000 --- a/libmpio/mpio.h +++ /dev/null @@ -1,218 +0,0 @@ -#/* -*- linux-c -*- */ - -/* - * $Id: mpio.h,v 1.18 2003/04/19 23:58:02 germeier Exp $ - * - * Library for USB MPIO-* - * - * Markus Germeier (mager@tzi.de) - * - * uses code from mpio_stat.c by - * Yuji Touya (salmoon@users.sourceforge.net) - * - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * */ - -#ifndef _MPIO_H_ -#define _MPIO_H_ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "defs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - *init and shutdown - */ - -mpio_t *mpio_init(mpio_callback_init_t); -void mpio_close(mpio_t *); - -/* - * request information - */ - -/* get version */ -void mpio_get_info(mpio_t *, mpio_info_t *); -/* get model */ -mpio_model_t mpio_get_model(mpio_t *); -/* retrieves free memory in bytes */ -int mpio_memory_free(mpio_t *, mpio_mem_t, int *free); - -/* - * charset for filename encoding/converting - */ -BYTE *mpio_charset_get(mpio_t *); -BYTE mpio_charset_set(mpio_t *, BYTE *); - -/* - * directory operations - */ - -/* context, memory bank */ -BYTE* mpio_directory_open(mpio_t *, mpio_mem_t); -/* context, memory bank, directory name */ -int mpio_directory_make(mpio_t *, mpio_mem_t, BYTE *); -/* context, memory bank, directory name */ -int mpio_directory_cd(mpio_t *, mpio_mem_t, BYTE *); -/* context, memory bank, directory name buffer space */ -void mpio_directory_pwd(mpio_t *, mpio_mem_t, BYTE pwd[INFO_LINE]); -/* context, dir context */ -BYTE* mpio_dentry_next(mpio_t *, mpio_mem_t, BYTE *); -/* context, dir context */ -int mpio_dentry_get(mpio_t *, mpio_mem_t, BYTE *, BYTE *, int,WORD *, - BYTE *, BYTE *, BYTE *, BYTE *, DWORD *, BYTE *); - -/* - * reading/writing/deleting of files - */ - -int mpio_file_get_as(mpio_t *, mpio_mem_t, mpio_filename_t, - mpio_filename_t,mpio_callback_t); - -/* context, memory bank, filename, callback */ -int mpio_file_get(mpio_t *, mpio_mem_t, mpio_filename_t, mpio_callback_t); - -/* context, memory bank, filename, filetype, callback */ -int mpio_file_put(mpio_t *, mpio_mem_t, mpio_filename_t, mpio_filetype_t, - mpio_callback_t); - -/* context, memory bank, filename, as, filetype, callback */ -int mpio_file_put_as(mpio_t *, mpio_mem_t, mpio_filename_t, - mpio_filename_t, mpio_filetype_t, - mpio_callback_t); - -/* context, memory bank, filename, callback */ -int mpio_file_del(mpio_t *, mpio_mem_t, mpio_filename_t, mpio_callback_t); - -/* - * reading/writing files into memory (used for config+font files) - */ - -/* context, memory bank, filename, callback, pointer to memory */ -/* the needed memory is allocated and the memory pointer is return */ -/* via the "BYTE **" */ - -int mpio_file_get_to_memory(mpio_t *, mpio_mem_t, mpio_filename_t, - mpio_callback_t, BYTE **); - -/* context, memory bank, filename, filetype, callback ... */ -/* ... memory pointer, size of file */ -int mpio_file_put_from_memory(mpio_t *, mpio_mem_t, mpio_filename_t, - mpio_filetype_t, mpio_callback_t, - BYTE *, int); - -/* - * rename a file on the MPIO - */ -/* context, memory bank, filename, filename */ -int mpio_file_rename(mpio_t *, mpio_mem_t, - mpio_filename_t, mpio_filename_t); - -/* - * switch position of two files - */ -/* context, memory bank, filename, filename */ -int mpio_file_switch(mpio_t *, mpio_mem_t, - mpio_filename_t, mpio_filename_t); - -/* Move a named file after a given file. If after==NULL move it - to the top of the list, -*/ - -int mpio_file_move(mpio_t *,mpio_mem_t m,mpio_filename_t,mpio_filename_t); - -/* - * formating a memory (internal mem or external SmartMedia card) - */ - -/* context, memory bank, callback */ -int mpio_memory_format(mpio_t *, mpio_mem_t, mpio_callback_t); - -/* mpio_sync has to be called after every set of mpio_file_{del,put} - * operations to write the current state of FAT and (root) directory. - * This is done explicitly to avoid writing these informations to often - * and thereby exhausting the SmartMedia chips - */ -/* context, memory bank */ -int mpio_sync(mpio_t *, mpio_mem_t); - -/* - * ID3 rewriting support - */ - -/* enable disable ID3 rewriting support */ -BYTE mpio_id3_set(mpio_t *, BYTE); -/* query ID3 rewriting support */ -BYTE mpio_id3_get(mpio_t *); - -/* set format string for rewriting*/ -void mpio_id3_format_set(mpio_t *, BYTE *); -/* get format string for rewriting*/ -void mpio_id3_format_get(mpio_t *, BYTE *); - -/* - * "special" functions - */ - -/* returns health status of selected memory */ -int mpio_health(mpio_t *, mpio_mem_t, mpio_health_t *); - -/* - * error handling - */ - -/* returns error code of last error */ -int mpio_errno(void); - -/* returns the description of the error */ -char * mpio_strerror(int err); - -/* prints the error message of the last error*/ -void mpio_perror(char *prefix); - -/* - * debugging - */ - -/* context, memory bank */ -int mpio_memory_dump(mpio_t *, mpio_mem_t); - -/* - * timeline: - * --------- - * 2004: some functions to change the order of files - * 2005: read mp3 tags of the files - */ - -#ifdef __cplusplus -} -#endif - -#endif /* _MPIO_H_ */ - - diff --git a/libmpio/mplib/mplib.c b/libmpio/mplib/mplib.c new file mode 100644 index 0000000..afa7066 --- /dev/null +++ b/libmpio/mplib/mplib.c @@ -0,0 +1,1011 @@ +/* + * mplib - a library that enables you to edit ID3 tags + * Copyright (C) 2001,2002 Stefan Podkowinski + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if STDC_HEADERS +# include +# include +#elif HAVE_STRINGS_H +# include +#endif /*STDC_HEADERS*/ + +#if HAVE_UNISTD_H +# include +# include +#endif + +#include +#include +#include + +#include "xmalloc.h" +#include "mplib.h" +#include "mplib_s.h" +#include "mplib_s.c" + + + +/******************************************************************************************* + * Extern functions + *******************************************************************************************/ + + + +/******************************************************************************************* + * Get + *******************************************************************************************/ + + mpeg_header* + mp_get_mpeg_header_from_file(const char* filename) + { + mpeg_header *ret; + int fd; + + if(!filename) return NULL; + + fd = open(filename, O_RDONLY); + if(fd == -1) return NULL; + + ret = mp_get_mpeg_header_from_fd(fd); + close(fd); + return ret; + } + + +mpeg_header* +mp_get_mpeg_header_from_fd(int fd) +{ + mpeg_header *h; + unsigned char c[5]; + + h = XMALLOCD(mpeg_header, "mp_get_mpeg_header_from_fd:h"); + + if(id3_lseek_syncword(fd)) goto exit_on_error; + + if(read(fd, c, 4) < 4) goto exit_on_error; + + memset(h, 0, sizeof(h)); + h->syncword = (c[1] & 240); + h->syncword <<= 8; + h->syncword |= c[0]; + h->version = (c[1] & 8) >> 3; + h->layer = (c[1] & 6) >> 1; + h->protbit = (c[1] & 1); + h->bitrate = (c[2] & 240) >> 4; + h->samplingfreq = (c[2] & 12) >> 2; + h->padbit = (c[2] & 2) >> 1; + h->privbit = (c[2] & 1); + h->mode = (c[3] & 192) >> 6; + h->mode_ext = (c[3] & 48) >> 4; + h->copyright = (c[3] & 8) >> 3; + h->originalhome = (c[3] & 4) >> 2; + h->emphasis = (c[3] & 3); + + return h; + + exit_on_error: + xfree(h); + return NULL; +} + +char* +mp_get_str_version(const mpeg_header *h) +{ + return h->version == 0 ? "MPEG 2" : "MPEG 1"; +} + +char* +mp_get_str_layer(const mpeg_header *h) +{ + switch(h->layer) + { + case 1: return "Layer III"; + case 2: return "Layer II"; + case 3: return "Layer I"; + default: return "undefined"; + } +} + +char* +mp_get_str_bitrate(const mpeg_header *h) +{ + char *buf = (char *)xmallocd0(11, "mp_get_str_bitrate:buf"); + + if(h->version == 1) /* MPEG 1 */ + { + switch(h->layer) + { + case 1: + snprintf(buf, sizeof buf, "%d kBit/s", br_1_3[h->bitrate]); + return buf; + case 2: + snprintf(buf, sizeof buf, "%d kBit/s", br_1_2[h->bitrate]); + return buf; + case 3: + snprintf(buf, sizeof buf, "%d kBit/s", br_1_1[h->bitrate]); + return buf; + default: + return "undefined"; + } + } + else /* MPEG 2 */ + { + switch(h->layer) + { + case 1: + snprintf(buf, sizeof buf, "%d kBit/s", br_2_3[h->bitrate]); + return buf; + case 2: + snprintf(buf, sizeof buf, "%d kBit/s", br_2_2[h->bitrate]); + return buf; + case 3: + snprintf(buf, sizeof buf, "%d kBit/s", br_2_1[h->bitrate]); + return buf; + default: + return "undefined"; + } + } +} + +char* +mp_get_str_samplingfreq(const mpeg_header *h) +{ + if(h->version == 1) + { + switch(h->samplingfreq) + { + case 0: return "44100 Hz"; + case 1: return "48000 Hz"; + case 2: return "32000 Hz"; + default: return "undefined"; + } + } + else + { + switch(h->samplingfreq) + { + case 0: return "22050 Hz"; + case 1: return "24000 Hz"; + case 2: return "16000 Hz"; + default: return "undefined"; + } + } +} + +char* +mp_get_str_mode(const mpeg_header *h) +{ + switch(h->mode) + { + case 0: return "Stereo"; + case 1: return "Joint-Stereo"; + case 2: return "Dual-Channel"; + case 3: return "Mono"; + default: return "undefined"; + } +} + +id3_tag_list* +mp_get_tag_list_from_file(const char* filename) +{ + id3_tag_list *ret; + int fd; + + if(!filename) return NULL; + + fd = open(filename, O_RDONLY); + if(fd == -1) return NULL; + + ret = mp_get_tag_list_from_fd(fd); + close(fd); + return ret; +} + +id3_tag_list* +mp_get_tag_list_from_fd(int fd) +{ + id3_tag_list *tag_list = NULL; + id3_tag_list *tag_list2 = NULL; + id3v2_tag *v2tag = NULL; + id3v1_tag *v1tag = NULL; + id3_tag *tag = NULL; + + v2tag = id3v2_get_tag(fd); + if(v2tag) + { + tag = XMALLOCD0(id3_tag, "mp_get_tag_list_from_fd:tag"); + if(v2tag->header->version_minor == 3 || v2tag->header->version_minor == 4) + tag->version = 2; + else + tag->version = -1; + tag->tag = v2tag; + + tag_list = XMALLOCD(id3_tag_list, "mp_get_tag_list_from_fd:tag_list"); + tag_list->tag = tag; + tag_list->next = NULL; + tag_list->first = tag_list; + } + + v1tag = id3v1_get_tag(fd); + if(v1tag) + { + tag = XMALLOCD(id3_tag, "mp_get_tag_list_from_fd:tag"); + tag->version = 1; + tag->tag = v1tag; + + if(tag_list) + { + tag_list2 = XMALLOCD(id3_tag_list, "mp_get_tag_list_from_fd:tag_list2"); + tag_list2->tag = tag; + tag_list2->next = NULL; + tag_list2->first = tag_list; + tag_list->next = tag_list2; + } + else + { + tag_list = XMALLOCD(id3_tag_list, "mp_get_tag_list_from_fd:tag_list"); + tag_list->tag = tag; + tag_list->next = NULL; + tag_list->first = tag_list; + } + } + + return tag_list; +} + +id3_content* +mp_get_content(const id3_tag *tag, int field) +{ + return mp_get_content_at_pos(tag, field, 0); +} + +id3_content* +mp_get_content_at_pos(const id3_tag *tag, int field, int pos) +{ + int i; + char *c; + id3_content *ret; + + if(!tag || !tag->tag) + { + errno = MP_EERROR; + return NULL; + } + + if(tag->version == 1) + { + if(pos != 0) + { + errno = MP_EERROR; + return NULL; + } + else return id3v1_get_content(tag->tag, field); + } + else if(tag->version == 2) + { + id3v2_tag *v2 = tag->tag; + char *val; + + switch(field) + { + case MP_ARTIST: + return mp_get_content_custom_at_pos(tag, "TPE1", pos); + case MP_TITLE: + return mp_get_content_custom_at_pos(tag, "TIT2", pos); + case MP_ALBUM: + return mp_get_content_custom_at_pos(tag, "TALB", pos); + case MP_GENRE: + return mp_get_content_custom_at_pos(tag, "TCON", pos); + case MP_COMMENT: + return mp_get_content_custom_at_pos(tag, "COMM", pos); + case MP_YEAR: + return mp_get_content_custom_at_pos(tag, "TYER", pos); + case MP_TRACK: + return mp_get_content_custom_at_pos(tag, "TRCK", pos); + } + errno = MP_EFNF; + return NULL; + } + else + { + errno = MP_EVERSION; + return NULL; + } +} + +id3_content* +mp_get_content_custom(const id3_tag* tag, const char*field) +{ + if(!tag) + { + errno = MP_EERROR; + return NULL; + } + else if(tag->version != 2) + { + errno = MP_EVERSION; + return NULL; + } + + return id3v2_get_content_at_pos(tag->tag, field, 0); + +} + +id3_content* +mp_get_content_custom_at_pos(const id3_tag* tag, const char*field, int pos) +{ + if(!tag) + { + errno = MP_EERROR; + return NULL; + } + else if(tag->version != 2) + { + errno = MP_EVERSION; + return NULL; + } + + + return id3v2_get_content_at_pos(tag->tag, field, pos); +} + + +/******************************************************************************************* + * Set + *******************************************************************************************/ + + int + mp_set_content(id3_tag* tag, const int field, id3_content* new_content) + { + id3v1_tag *v1; + id3v2_tag *v2; + + + if(!tag) return MP_EERROR; + + if(tag->version == 2) + { + return mp_set_content_at_pos(tag, field, new_content, 0); + } + else if(tag->version == 1) + { + unsigned char c; + char *my_val; + int len, j; + + v1 = tag->tag; + + switch(field) + { + +#define FLD(str1, str2, str3, str4) \ + case str1:\ + if(!new_content) v1->str2 = NULL;\ + else\ + {\ + id3_text_content *tc = str4(new_content);\ + if(strlen(tc->text) > str3 || tc->encoding != ISO_8859_1)\ + {\ + mp_convert_to_v2(tag);\ + mp_free_text_content(tc);\ + return mp_set_content(tag, field, new_content);\ + }\ + \ + v1->str2 = tc->text;\ + xfree(tc);\ + }\ + break; + + FLD(MP_ARTIST, artist, 30, mp_parse_artist); + FLD(MP_TITLE, title, 30, mp_parse_title); + FLD(MP_ALBUM, album, 30, mp_parse_album); + FLD(MP_YEAR, year, 4, mp_parse_year); + + case MP_COMMENT: + if(!new_content) v1->comment = NULL; + else + { + id3_comment_content *tc = mp_parse_comment(new_content); + if(strlen(tc->text) > 30 || tc->short_descr || tc->encoding != ISO_8859_1) + { + mp_convert_to_v2(tag); + mp_free_comment_content(tc); + return mp_set_content(tag, field, new_content); + } + v1->comment = xmallocd0(strlen(tc->text)+1, + "mp_set_content:v1->comment"); + memcpy(v1->comment, tc->text, strlen(tc->text)); + mp_free_comment_content(tc); + } + break; + + case MP_TRACK: + if(!new_content) v1->track = 0; + else + { + id3_text_content *tc = mp_parse_track(new_content); +#ifdef HAVE_STRTOL + errno = 0; + j = strtol(tc->text, (char **)NULL, 10); + if(errno != ERANGE) v1->track = j; + else return MP_EERROR; +#else + v1->track = atoi(tc->text); +#endif + mp_free_text_content(tc); + } + break; + + case MP_GENRE: + if(!new_content) v1->genre = 0xFF; + else + { + int b = 0, i; + id3_text_content *tc = mp_parse_genre(new_content); + /* i = strlen(tc->text); */ + for(c = 0; c < GLL; c++) { + if(!strcmp(genre_list[c], tc->text)) + { + v1->genre = c; + b = 1; + } + } + mp_free_text_content(tc); + if(!b) + { + mp_convert_to_v2(tag); + return mp_set_content(tag, field, new_content); + } + break; + } + } + } + else if(tag->version == -1) return MP_EVERSION; + else return MP_EFNF; + + return 0; + } + +int +mp_set_content_at_pos(id3_tag* tag, const int field, id3_content* new_content, int pos) +{ + char* c; + + if(!tag) return MP_EERROR; + if(field < MP_ARTIST || field > MP_TRACK) return MP_EFNF; + + if(tag->version == 1 && pos == 0) return mp_set_content(tag, field, new_content); + + switch(field) + { + case MP_ARTIST: c = "TPE1"; break; + case MP_TITLE: c = "TIT2"; break; + case MP_ALBUM: c = "TALB"; break; + case MP_TRACK: c = "TRCK"; break; + case MP_YEAR: c = "TYER"; break; + case MP_COMMENT: c = "COMM"; break; + case MP_GENRE: c = "TCON"; break; + } + return mp_set_custom_content_at_pos(tag, c, new_content, pos); +} + +int +mp_set_custom_content(id3_tag* tag, char* field, id3_content* new_content) +{ + return mp_set_custom_content_at_pos(tag, field, new_content, 0); +} + +int +mp_set_custom_content_at_pos(id3_tag* tag, char* field, id3_content* new_content, int pos) +{ + id3v2_tag *v2; + + if(!tag || !field || strlen(field) != 4) return MP_EERROR; + + if(tag->version == 1) + { + if(mp_convert_to_v2(tag)) + return MP_EERROR; + } + else if(tag->version == -1) return MP_EVERSION; + + v2 = (id3v2_tag*)tag->tag; + if(!v2->frame_list) + { + v2->frame_list = XMALLOCD0(id3v2_frame_list, + "mp_set_custom_content_at_pos:v2->frame_list"); + id3_add_frame(v2->frame_list, field, new_content->data, new_content->length); + } + else + { + id3v2_frame *frame; + + if((frame = id3_lookup_frame(v2->frame_list, field, pos))) + { + if(new_content) + { + long len, len_sync; + /* make sync safe */ + len = new_content->length; + len_sync = id3_sync(new_content->data, len); + + xfree(frame->data); + frame->data = xmallocd(new_content->length, + "mp_set_custom_content_at_pos:frame->data"); + memcpy(frame->data, new_content->data, new_content->length); + frame->status_flag = 0; + if(len != len_sync) frame->format_flag = 64; + else frame->format_flag = 0; + frame->data_size = len_sync; + } + else id3_remove_frame(v2->frame_list, frame); + } + else if(pos == 0) id3_add_frame(v2->frame_list, field, new_content->data, new_content->length); + else return MP_EFNF; + } + + return 0; +} + +/******************************************************************************************* + * Write & delete + *******************************************************************************************/ + int + mp_write_to_file(const id3_tag_list* tag_list, const char *filename) + { + int ret; + int fd; + + if(!filename) return MP_EERROR; + + fd = open(filename, O_RDWR); + if(fd == -1) return MP_EERROR; + + ret = mp_write_to_fd(tag_list, fd); + close(fd); + return ret; + } + + + int + mp_write_to_fd(const id3_tag_list* tag_list, const int fd) + { + id3_tag *tag; + id3v1_tag *v1; + id3v2_tag *v2; + id3_tag_list *mylist; + int ret = 0; + + if(!tag_list) { + ret |= id3v1_del_tag(fd); + ret |= id3v2_del_tag(fd, NULL); + return ret; + } + + while(tag_list) + { + tag = tag_list->tag; + if(!tag) + { + tag_list = tag_list->next; + continue; + } + + if(tag->version == 1) + { + id3v1_del_tag(fd); + ret |= id3v1_add_tag(fd, tag->tag); + } + else if(tag->version == 2) + { + int pad = 0; + id3v2_frame_list *frame_list; + id3v2_tag *old_v2; + id3v2_tag *v2 = tag->tag; + + /* calculate tag size */ + v2->header->total_tag_size = 10; + if(v2->header->has_footer) v2->header->total_tag_size += 10; + if(v2->header->has_extended_header) v2->header->total_tag_size += v2->header->extended_header->size; + frame_list = v2->frame_list; + while(frame_list) + { + v2->header->total_tag_size += frame_list->data->data_size + 10; + frame_list = frame_list->next; + } + + /* this is where padding handling takes place */ + /* we must get the old tag to see if padding can be used */ + old_v2 = id3v2_get_tag(fd); + if(old_v2) { + if(v2->header->total_tag_size > old_v2->header->total_tag_size) + { + /* padding not sufficent */ + ret |= id3v2_del_tag(fd, old_v2); + ret |= id3v2_add_tag(fd, v2, NULL); + } + else + { + ret |= id3v2_add_tag(fd, v2, old_v2); + } + id3v2_free_tag(old_v2); + } else { + ret |= id3v2_add_tag(fd, v2, NULL); + } + + } + else + { + ret |= MP_EVERSION; + } + + tag_list = tag_list->next; + } /* tag list */ + + return ret; + } + +int +mp_del_tags_from_file(const char* filename) +{ + int ret, fd; + + if(!filename) return 1; + + fd = open(filename, O_RDWR); + if(fd == -1) return 1; + + ret = mp_del_tags_from_fd(fd); + close(fd); + return ret; +} + +int +mp_del_tags_from_fd(const int fd) +{ + int ret = 0; + + ret |= id3v1_del_tag(fd); + ret |= id3v2_del_tag(fd, NULL); + + return ret; +} + +int +mp_del_tags_by_ver_from_file(const char* filename, const int version) +{ + int fd, ret; + + if(!filename) return 1; + + fd = open(filename, O_RDWR); + if(fd == -1) return 1; + + ret = mp_del_tags_by_ver_from_fd(fd, version); + close(fd); + return ret; +} + +int +mp_del_tags_by_ver_from_fd(const int fd, const int version) +{ + if(version == 1) return id3v1_del_tag(fd); + else if(version == 2) return id3v2_del_tag(fd, NULL); + else return MP_EVERSION; +} + + + + +/******************************************************************************************* + * Misc + *******************************************************************************************/ + + int + mp_convert_to_v2(id3_tag *tag) + { + id3v1_tag *v1; + id3_tag *tmp; + id3_content* content; + + if(tag->version == 2) return 0; + else if(tag->version == -1) return MP_EVERSION; + + tmp = mp_alloc_tag_with_version(2); + + v1 = (id3v1_tag*)tag->tag; + + content = mp_assemble_text_content(v1->artist, ISO_8859_1); + if(v1->artist) mp_set_content(tmp, MP_ARTIST, content); + + content = mp_assemble_text_content(v1->title, ISO_8859_1); + if(v1->title) mp_set_content(tmp, MP_TITLE, content); + + content = mp_assemble_text_content(v1->album, ISO_8859_1); + if(v1->album) mp_set_content(tmp, MP_ALBUM, content); + + content = mp_assemble_text_content(v1->year, ISO_8859_1); + if(v1->year) mp_set_content(tmp, MP_YEAR, content); + + content = mp_assemble_comment_content(v1->comment, NULL, ISO_8859_1, NULL); + if(v1->comment) mp_set_content(tmp, MP_COMMENT, content); + + if(v1->genre != 0xFF) + { + char *c = xmallocd(strlen(genre_list[v1->genre]) + 1, + "mp_convert_to_v2:c"); + strcpy(c, genre_list[v1->genre]); + content = mp_assemble_text_content(c, ISO_8859_1); + mp_set_content(tmp, MP_GENRE, content); + } + if(v1->track > 0) + { + char *trk = (char *)xmallocd(4, "mp_convert_to_v2:trk"); + snprintf(trk, 3, "%d", v1->track); + trk[3] = 0; + content = mp_assemble_text_content(trk, ISO_8859_1); + mp_set_content(tmp, MP_TRACK, content); + } + + tag->version = 2; + tag->tag = tmp->tag; + + id3v1_free_tag(v1); + xfree(tmp); + + return 0; + } + +int +mp_convert_to_v1(id3_tag *tag) +{ + id3v1_tag *v1; + id3_tag* tmp; + id3_content* content; + id3_text_content* tc; + id3_comment_content* cc; + char* c; + int j, k = 0; + + if(tag->version == 1) return 0; + else if(tag->version == -1) return MP_EVERSION; + + v1 = XMALLOCD0(id3v1_tag, "mp_convert_to_v1:v1"); + + content = mp_get_content(tag, MP_ARTIST); + tc = mp_parse_artist(content); + v1->artist = tc->text; + xfree(tc); + mp_free_content(content); + + content = mp_get_content(tag, MP_TITLE); + tc = mp_parse_title(content); + v1->title = tc->text; + xfree(tc); + mp_free_content(content); + + content = mp_get_content(tag, MP_ALBUM); + tc = mp_parse_album(content); + v1->album = tc->text; + xfree(tc); + mp_free_content(content); + + content = mp_get_content(tag, MP_YEAR); + tc = mp_parse_year(content); + v1->year = tc->text; + xfree(tc); + mp_free_content(content); + + content = mp_get_content(tag, MP_COMMENT); + cc = mp_parse_comment(content); + v1->comment = cc->text; + xfree(cc->language); + xfree(cc->short_descr); + xfree(cc); + mp_free_content(content); + + content = mp_get_content(tag, MP_TRACK); + tc = mp_parse_track(content); + c = tc->text; + if(c) + { +#ifdef HAVE_STRTOL + errno = 0; + j = strtol(c, (char **)NULL, 10); + if(errno != ERANGE) v1->track = j; + else v1->track = 0; +#else + v1->track = atoi(c); +#endif + } + else v1->track = 0; + xfree(c); + mp_free_text_content(tc); + mp_free_content(content); + + content = mp_get_content(tag, MP_GENRE); + tc = mp_parse_genre(content); + c = tc->text; + for(j = 0; c, j < GLL; j++) { + if(!strcmp(genre_list[j], c)) + { + v1->genre = j; + k = 1; + } + } + if(!c) v1->genre = 0xFF; + xfree(c); + mp_free_text_content(tc); + mp_free_content(content); + + id3v1_truncate_tag(v1); + + id3v2_free_tag(tag->tag); + + tag->version = 1; + tag->tag = v1; + + return 0; +} + +int +mp_is_valid_v1_value(int field, char *value) +{ + int len = 30; + int j; + + switch(field) { + case MP_YEAR: + len = 4; + break; + + case MP_TRACK: +#ifdef HAVE_STRTOL + errno = 0; + j = strtol(value, (char **)NULL, 10); + if(errno != ERANGE) return 1; + else return 0; +#else + return 1; /* poor fellow */ +#endif + + case MP_GENRE: + for(j = 0; j < GLL; j++) { + if(!strcmp(genre_list[j], value)) + { + return 1; + } + return 0; + } + } + + /* Check string length */ + if(strlen(value) > len) return 0; + else return 1; +} + + +void +mp_free_list(id3_tag_list *list) +{ + if(!list) return; + + /* free tag */ + if(list->tag) mp_free_tag(list->tag); + + /* free next element */ + if(list->next) mp_free_list(list->next); + + /* free this element */ + xfree(list); +} + +id3_tag* +mp_alloc_tag(void) +{ + /* The tags initialized version makes a different. Generally spoken, we + like to make id3v1 tags if possible and therefor set the version to 1 + here. This matters in mp_set_content(). */ + return mp_alloc_tag_with_version(1); +} + +id3_tag* +mp_alloc_tag_with_version(int v) +{ + id3_tag* ret; + + if(v != 1 && v != 2) return NULL; + + ret = XMALLOCD(id3_tag, "mp_alloc_tag_with_version:ret"); + ret->version = v; + if(v == 1) + { + ret->tag = XMALLOCD0(id3v1_tag, "mp_alloc_tag_with_version:ret->tag"); + ((id3v1_tag*)ret->tag)->genre = 0xFF; + } + else + { + id3v2_tag *v2; + /* XXX */ + ret->tag = XMALLOCD0(id3v2_tag, "mp_alloc_tag_with_version:ret->tag"); + v2 = (id3v2_tag*)ret->tag; + v2->header = XMALLOCD0(id3v2_header, "mp_alloc_tag_with_version:v2->header"); +//if ID3VERSION == "2.4" + v2->header->version_minor = 4; +//else + v2->header->version_minor = 3; +//endif + v2->header->version_revision = 0; + v2->header->unsyncronization = 1; + v2->header->has_extended_header = 0; + v2->header->is_experimental = 1; + v2->header->has_footer = 0; + v2->header->flags = 0; + v2->header->total_tag_size = 0; + v2->header->extended_header = NULL; + v2->frame_list = NULL; + } + return ret; +} + +void +mp_free_tag(id3_tag *tag) +{ + if(!tag) return; + + if(tag->version == 1) + { + id3v1_free_tag(tag->tag); + } + else if(tag->version == 2) + { + id3v2_free_tag(tag->tag); + } + xfree(tag); +} + +void +mp_free_content(id3_content *content) +{ + if(!content) return; + xfree(content->data); + xfree(content); +} + +void +mp_free_text_content(id3_text_content *content) +{ + if(!content) return; + xfree(content->text); + xfree(content); +} + +void +mp_free_comment_content(id3_comment_content *content) +{ + if(!content) return; + xfree(content->language); + xfree(content->short_descr); + xfree(content->text); + xfree(content); +} + + diff --git a/libmpio/mplib/mplib.h b/libmpio/mplib/mplib.h new file mode 100644 index 0000000..8b3fe64 --- /dev/null +++ b/libmpio/mplib/mplib.h @@ -0,0 +1,438 @@ +/* + * mplib - a library that enables you to edit ID3 tags + * Copyright (C) 2001,2002 Stefan Podkowinski + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __MPLIB_H +#define __MPLIB_H + + +/* __BEGIN_DECLS should be used at the beginning of your declarations, + so that C++ compilers don't mangle their names. Use __END_DECLS at + the end of C declarations. */ +#undef __BEGIN_DECLS +#undef __END_DECLS +#ifdef __cplusplus +# define __BEGIN_DECLS extern "C" { +# define __END_DECLS } +#else +# define __BEGIN_DECLS /* empty */ +# define __END_DECLS /* empty */ +#endif + +/* __P is a macro used to wrap function prototypes, so that compilers + that don't understand ANSI C prototypes still work, and ANSI C + compilers can issue warnings about type mismatches. */ +#undef __P +#if defined (__STDC__) || defined (_AIX) \ + || (defined (__mips) && defined (_SYSTYPE_SVR4)) \ + || defined(WIN32) || defined(__cplusplus) +# define __P(protos) protos +#else +# define __P(protos) () +#endif + + +__BEGIN_DECLS + + + +/*************************************/ +/* Defines */ +/*************************************/ + +#define MP_ARTIST 1 +#define MP_TITLE 2 +#define MP_ALBUM 3 +#define MP_GENRE 4 +#define MP_COMMENT 5 +#define MP_YEAR 6 +#define MP_TRACK 7 + +#define ISO_8859_1 0 +#define UTF16 1 +#define UTF16BE 2 +#define UTF8 3 + + +/*************************************/ +/* errno values */ +/*************************************/ +#define MP_EERROR 1 +#define MP_EFNF 2 +#define MP_EFCOMPR 3 +#define MP_EFENCR 4 +/*define MP_EUNICODE 5*/ +#define MP_EVERSION 6 + + +/*************************************/ +/* Structs and company */ +/*************************************/ + +/* Header structure with 4 segments containing 32 bit header information */ +typedef struct _mpeg_header +{ + unsigned int syncword; /* Sync Word */ + unsigned int version; /* Version number */ + unsigned int layer; /* Layer number */ + unsigned int protbit; /* Protection Bit */ + unsigned int bitrate; /* kbit/sec */ + unsigned int samplingfreq; /* hz */ + unsigned int padbit; /* Padding bit */ + unsigned int privbit; /* Private Bit */ + unsigned int mode; /* Stereo, Joint-Stereo, Dual-Channel, Mono */ + unsigned int mode_ext; /* Mode extension */ + unsigned int copyright; /* Copyright yes/no */ + unsigned int originalhome; /* Original datastream yes/no */ + unsigned int emphasis; /* Emphasis bits */ +} mpeg_header; + + +/* Generic tag structure */ +typedef struct _id3_tag +{ + int version; /* tags version, either 1 or 2 or -1 if not supported */ + void *tag; /* pointer to specific struct */ +} id3_tag; + + +/* list of tags found in file */ +typedef struct _id3_tag_list +{ + id3_tag *tag; + struct _id3_tag_list *next; + struct _id3_tag_list *first; +} id3_tag_list; + + +/* + * The following structures are ment as low-level data holders. I strongly + * suggest you to use the appropriate generic functions below to access them. + */ + +/* V 1 */ + +/* ID3v1 tag structure */ +typedef struct _id3v1_tag +{ + char *title; + char *artist; + char *album; + char *year; + char *comment; + unsigned char track; /* track binary encoded */ + unsigned char genre; /* index on genre list - 0xFF for null */ +} id3v1_tag; + + +/* V 2 */ + +/* ID3v2 Frame structure */ +typedef struct _id3v2_frame +{ + char* frame_id; /* The frame id e.g. TALB */ + unsigned char status_flag; + unsigned char format_flag; + char *data; + unsigned int data_size; /* frame size excluding header, incl. enc.,lang.,etc. + (total frame size - 10) */ +} id3v2_frame; + +/* single linked list referencing a number of frames */ +typedef struct _id3v2_frame_list +{ + struct _id3v2_frame *data; + struct _id3v2_frame_list *next; + struct _id3v2_frame_list *start; +} id3v2_frame_list; + +/* ID3v2 Extended Header structure */ +typedef struct _id3v2_extended_header +{ + unsigned long size; + char *flag_bytes; + unsigned int no_flag_bytes; + unsigned int is_update; + unsigned int crc_data_present; + unsigned char crc_data_length; + unsigned char* crc_data; + unsigned int restrictions; + unsigned char restrictions_data_length; + unsigned char* restrictions_data; +} id3v2_extended_header; + +/* ID3v2 Header structure */ +typedef struct _id3v2_header +{ + /* Version 2.minor.revision */ + unsigned int version_minor; + unsigned int version_revision; + char flags; /* Flags - should only be set by mplib and does only contain + the following infos */ + unsigned int unsyncronization; + unsigned int has_extended_header; + unsigned int is_experimental; + unsigned int has_footer; + unsigned long total_tag_size; /* is size of all tag elements including + header and footer (each 10 bytes) */ + id3v2_extended_header *extended_header; /* Extended header */ +} id3v2_header; + + +/* ID3v2 tag structure */ +typedef struct _id3v2_tag +{ + id3v2_header *header; + id3v2_frame_list *frame_list; +} id3v2_tag; + +/* A fields content unparsed */ +typedef struct _id3_content +{ + unsigned int compressed; + unsigned int encrypted; + char *data; + unsigned int length; +} id3_content; + +typedef enum _id3_encoding +{ + iso_8859_1 = ISO_8859_1, + utf16 = UTF16, + utf16be = UTF16BE, + utf8 = UTF8 +} id3_encoding; + +typedef struct _id3_text_content +{ + id3_encoding encoding; + char *text; /* Null terminated text */ +} id3_text_content; + +typedef struct _id3_comment_content +{ + id3_encoding encoding; + char *language; /* ISO Language code */ + char *short_descr; /* Null term. content short description */ + char *text; /* Null terminated text */ +} id3_comment_content; + +/***************************************/ +/* Functions */ +/***************************************/ + +/* Allocates a MPEG header structure from a file + * Arg 1 - The filename + * Returns - A pointer to a new initialized header structure - NULL on IO Error + */ +extern mpeg_header *mp_get_mpeg_header_from_file __P((const char*)); + + +/* Gets the header structure from a file descriptor + * Arg 1 - The file descriptor + * Returns - A pointer to a new initialized header structure - NULL on IO Error + */ +extern mpeg_header *mp_get_mpeg_header_from_fd __P((int)); + + +/* Frees a mpeg header structure + * Arg 1 - The allocated mpeg header + */ +#define mp_free_mpeg_header(str) xfree(str) + + +/* Allocates a label with the appropriate header field value as a string */ +extern char *mp_get_str_version __P((const mpeg_header*)); +extern char *mp_get_str_layer __P((const mpeg_header*)); +extern char *mp_get_str_bitrate __P((const mpeg_header*)); +extern char *mp_get_str_samplingfreq __P((const mpeg_header*)); +extern char *mp_get_str_mode __P((const mpeg_header*)); + + +/* Allocates and fills a list of tags found in the given file. This list + * will contain at least one and at most two tags or is NULL if no tags + * have been found. + * Arg 1 - The files name/file descriptor to search for tags + * Returns - A pointer to a initialized list struct or null if no tags have + * been found + */ +extern id3_tag_list* mp_get_tag_list_from_file __P((const char*)); +extern id3_tag_list* mp_get_tag_list_from_fd __P((int)); + + +/* Frees a tag list beginning with the given element XXX */ +extern void mp_free_list __P((id3_tag_list*)); + + +/* Gets the first content found of a specified field in the given tag and + * allocates a struct. + * Arg 1 - The tag + * Arg 2 - The fields identifier + * + * Returns The new allocated content for the specified field or NULL + * On NULL: errno set to the following values + * MP_EERROR - General failure: may occure on wrong usage, but should never happen + * MP_EFNF - Field does not exists in tag /invalid identifier + * MP_EVERSION - Tag has a version set that is not supported by the library + */ +extern id3_content* mp_get_content __P((const id3_tag*, int)); + +/* It's posible that a tag has multiple ocurances of a field. + * Use this function to get a specified field by position. The first + * ocurance of the field in the tag is 0. + * e.g.: To get the third comment in an id3v2 tag use + * mp_get_content_at_pos(tag, MP_COMMENT, 2); + * Arg 1 - The tag + * Arg 2 - The fields identifier + * Arg 3 - The content position in the tag + * Returns - see mp_get_content + */ +extern id3_content* mp_get_content_at_pos __P((const id3_tag*, int, int)); + +/* Gets a custom fields content and allocates a struct. This function can + * only be applied to ID3v2 tags. It will lookup a by the given identifier + * and return its content. + * Arg 1 - The tag + * Arg 2 - The field names identifier e.g. ENCR + * Returns - see mp_get_content + */ +extern id3_content* mp_get_content_custom __P((const id3_tag*, const char*)); + +/* See mp_get_content_at_pos() and mp_get_content_custom() + * Arg 1 - The tag + * Arg 2 - The field names identifier e.g. ENCR + * Arg 3 - The content position in the tag + * Returns - see mp_get_content + */ +extern id3_content* mp_get_content_custom_at_pos __P((const id3_tag*, const char*, int)); + +/* Frees a content struct */ +extern void mp_free_content __P((id3_content*)); +extern void mp_free_text_content __P((id3_text_content*)); +extern void mp_free_comment_content __P((id3_comment_content*)); + + +/* Copys the value of a specified field into the given tag. The content + * argument may be freed after using this function. The way a content + * is represented in a tag depends from the tags version and kind of field. + * I.e. it may be nessecary to represent a track number as a binary value in a v1 + * tag or to embeded it into a frame for a v2 tag. The caller just needs to + * give the correct identifier with the value as a id3_content and to take + * care of freeing the id3_content value afterwards. + * Arg 1 - The tag to edit + * Arg 2 - The fields identifier + * Arg 3 - The fields new content + * Returns - 0 success or one of the following errors + * MP_EERROR - General failure: may occure on wrong usage, but should never happen + * MP_EFNF - Field does not exists in tag /invalid identifier + * MP_EVERSION - Function isn't able to handle a tag of this version + */ +extern int mp_set_content __P((id3_tag*, int, id3_content*)); +extern int mp_set_content_at_pos __P((id3_tag*, int, id3_content*, int)); + +/* Sets up a new custom field with the given value + * Arg 1 - The tag to edit + * Arg 2 - The new fields name - A four chars upper case identifier e.g. ENCR + * Arg 3 - The fields new content + * Returns - See mp_set_content + */ +extern int mp_set_custom_content __P((id3_tag*, char*, id3_content*)); +extern int mp_set_custom_content_at_pos __P((id3_tag*, char*, id3_content*, int)); + +/* Writes the tag to the specified file + * Arg 1 - The tag list to be added to file - may be NULL for deleting all tags + * Arg 2 - The files name/file descriptor + * Returns - 0 on success or one of the following errors + * MP_EERROR - General failure: may occure on wrong usage, but should never happen + * MP_EVERSION - Function isn't able to handle a tag of this version + */ +extern int mp_write_to_file __P((const id3_tag_list*, const char*)); +extern int mp_write_to_fd __P((const id3_tag_list*, int)); + +/* Deletes all tags in file + * Arg 1 - The filename of fd + * Return - 0 on success + */ +extern int mp_del_tags_from_file __P((const char*)); +extern int mp_del_tags_from_fd __P((int)); + +/* Deletes all tags in file with the specified version + * Arg 1 - The filename or fd + * Arg 2 - The version + */ +extern int mp_del_tags_by_ver_from_file __P((const char*, int)); +extern int mp_del_tags_by_ver_from_fd __P((int, int)); + +/* Converts a tag to id3v1 or id3v2 tag format + * Arg 1 - The tag to be converted + * Returns - 0 on success or one of the following errors + * MP_EVERSION - Function isn't able to handle a tag of this version + */ +extern int mp_convert_to_v1 __P((id3_tag*)); +extern int mp_convert_to_v2 __P((id3_tag*)); + +/* Checks wether the given value would be a valid v1 field + * Arg 1 - The field + * Arg 2 - The value + * Returns - 0 if test failed + */ +extern int mp_is_valid_v1_value __P((int, char*)); + +/* Parses a content field + * Arg 1 - the content to parse + * Returns - A pointer to a new initialized structure suitable for the content + * or NULL + * On NULL: errno set to the following values + * MP_EERROR - General failure: may occure on wrong usage, but should never happen + * MP_EFENCR - The value for this field has been encrypted and can thus not be retrieved + * MP_EFCOMPR - The value for this field has been compressed and can thus not be retrieved + */ +extern id3_text_content *mp_parse_artist __P((const id3_content*)); +extern id3_text_content *mp_parse_title __P((const id3_content*)); +extern id3_text_content *mp_parse_album __P((const id3_content*)); +extern id3_text_content *mp_parse_year __P((const id3_content*)); +extern id3_text_content *mp_parse_genre __P((const id3_content*)); +extern id3_text_content *mp_parse_track __P((const id3_content*)); +extern id3_text_content *mp_parse_text __P((const id3_content*)); +extern id3_comment_content *mp_parse_comment __P((const id3_content*)); + +/* Assembles content from a comont text content + * Arg 1 - the text + * Arg 2 - the texts encoding (NULL) + * Returns - A pointer to a new initialized content structure + */ +extern id3_content *mp_assemble_text_content __P((const char*, id3_encoding)); + +/* Assembles content from a comment + * Arg 1 - the text + * Arg 2 - a short describtion to the text (NULL) + * Arg 3 - the texts encoding + * Arg 4 - the comments language (NULL) + * Returns - A pointer to a new initialized content structure + */ +extern id3_content *mp_assemble_comment_content __P((const char*, const char*, id3_encoding, const char*)); + +/* Gets a new allocated tag */ +extern id3_tag* mp_alloc_tag __P((void)); +extern id3_tag* mp_alloc_tag_with_version __P((int)); + +/* Frees tag struct */ +extern void mp_free_tag __P((id3_tag *)); + +__END_DECLS + +#endif /* __MPLIB_H */ diff --git a/libmpio/mplib/mplib_paas.c b/libmpio/mplib/mplib_paas.c new file mode 100644 index 0000000..441e474 --- /dev/null +++ b/libmpio/mplib/mplib_paas.c @@ -0,0 +1,256 @@ +/* + * mplib - a library that enables you to edit ID3 tags + * Copyright (C) 2001,2002 Stefan Podkowinski + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if STDC_HEADERS +# include +# include +#elif HAVE_STRINGS_H +# include +#endif /*STDC_HEADERS*/ + +#if HAVE_UNISTD_H +# include +# include +#endif + +#include +#include +#include + +#include "mplib.h" +#include "xmalloc.h" + + + +/******************************************************************************************* + * Parse functions + *******************************************************************************************/ + + id3_text_content* + mp_parse_artist(const id3_content* content) + { + return mp_parse_text(content); + } + + id3_text_content* + mp_parse_title(const id3_content* content) + { + return mp_parse_text(content); + } + + id3_text_content* + mp_parse_album(const id3_content* content) + { + return mp_parse_text(content); + } + + id3_text_content* + mp_parse_year(const id3_content* content) + { + return mp_parse_text(content); + } + + id3_text_content* + mp_parse_genre(const id3_content* content) + { + return mp_parse_text(content); + } + + id3_text_content* + mp_parse_track(const id3_content* content) + { + return mp_parse_text(content); + } + + id3_comment_content* + mp_parse_comment(const id3_content* content) + { + id3_comment_content* cc; + int i, e; + + if(!content || !content->data) + { + errno = MP_EERROR; + return NULL; + } + + if(content->encrypted) + { + errno = MP_EFENCR; + return NULL; + } + if(content->compressed) + { + errno = MP_EFCOMPR; + return NULL; + } + + cc = XMALLOCD0(id3_comment_content, "mp_parse_comment:cc"); + + e = content->data[0]; + if(e >= ISO_8859_1 && e <= UTF8) cc->encoding = e; + else cc->encoding = 0; + + cc->language = xmallocd(4, "mp_parse_comment:cc->language"); + cc->language[0] = content->data[1]; + cc->language[1] = content->data[2]; + cc->language[2] = content->data[3]; + cc->language[3] = 0; + + if(content->data[4]) /* short descr. */ + { + i = strlen(content->data + 4) + 1; + cc->short_descr = xmallocd(i, "mp_parse_comment:cc->short_descr"); + strncpy(cc->short_descr, content->data + 4, i); + } + else + { + cc->short_descr = NULL; + i = 1; + } + + cc->text = xmallocd(content->length - 4 - i + 1, "mp_parse_comment:cc->text"); + memcpy(cc->text, content->data + 4 + i, content->length - 4 - i); + cc->text[content->length - 4 - i] = 0; + + return cc; + } + + id3_text_content* + mp_parse_text(const id3_content* content) + { + id3_text_content* tc; + int e; + + if(!content || !content->data) + { + errno = MP_EERROR; + return NULL; + } + + if(content->encrypted) + { + errno = MP_EFENCR; + return NULL; + } + if(content->compressed) + { + errno = MP_EFCOMPR; + return NULL; + } + + tc = XMALLOCD0(id3_text_content, "mp_parse_text:tc"); + tc->text = xmallocd(content->length, "mp_parse_text:tc->text"); + e = content->data[0]; + if(e >= ISO_8859_1 && e <= UTF8) tc->encoding = e; + else tc->encoding = 0; + + memcpy(tc->text, content->data + 1, content->length - 1); + tc->text[content->length - 1] = 0; + /* XXX multiple entries */ + return tc; + } + + /******************************************************************************************* + * Assemble functions + *******************************************************************************************/ + + id3_content* + mp_assemble_artist_content(const char* text, id3_encoding enc) + { + return mp_assemble_text_content(text, enc); + } + + id3_content* + mp_assemble_title_content(const char* text, id3_encoding enc) + { + return mp_assemble_text_content(text, enc); + } + + id3_content* + mp_assemble_album_content(const char* text, id3_encoding enc) + { + return mp_assemble_text_content(text, enc); + } + + id3_content* + mp_assemble_year_content(const char* text, id3_encoding enc) + { + return mp_assemble_text_content(text, enc); + } + + id3_content* + mp_assemble_genre_content(const char* text, id3_encoding enc) + { + return mp_assemble_text_content(text, enc); + } + + id3_content* + mp_assemble_text_content(const char* text, id3_encoding enc) + { + id3_content *ret; + + if(!text) return NULL; + + ret = XMALLOCD0(id3_content, "mp_assemble_text_content:ret"); + ret->length = strlen(text) + 1; + ret->data = xmallocd(ret->length, "mp_asseble_text_content:ret->data"); + ret->data[0] = enc; + strncpy(ret->data + 1, text, strlen(text)); + + return ret; + } + + id3_content* + mp_assemble_comment_content(const char* text, const char* short_descr, id3_encoding enc, const char* lang) + { + id3_content *ret; + + if(!text) return NULL; + + ret = XMALLOCD0(id3_content, "mp_assemble_comment_content:ret"); + ret->length = strlen(text) + 5; + if(short_descr) ret->length += strlen(short_descr); + + ret->data = xmallocd(ret->length, "mp_assemble_comment_content:ret->data"); + ret->data[0] = enc; + if(lang && strlen(lang) == 3) + { + ret->data[1] = lang[0]; + ret->data[2] = lang[1]; + ret->data[3] = lang[2]; + } + else + { + ret->data[1] = 'X'; + ret->data[2] = 'X'; + ret->data[3] = 'X'; + } + if(short_descr) strcpy(ret->data + 4, short_descr); + else ret->data[4] = 0; + + if(short_descr) strncpy(ret->data + 5 + strlen(short_descr), text, strlen(text)); + else strncpy(ret->data + 5, text, strlen(text)); + + return ret; + + } diff --git a/libmpio/mplib/mplib_s.c b/libmpio/mplib/mplib_s.c new file mode 100644 index 0000000..2c336b4 --- /dev/null +++ b/libmpio/mplib/mplib_s.c @@ -0,0 +1,1177 @@ +/* + * mplib - a library that enables you to edit ID3 tags + * Copyright (C) 2001,2002 Stefan Podkowinski + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if STDC_HEADERS +# include +# include +#elif HAVE_STRINGS_H +# include +#endif /*STDC_HEADERS*/ + +#if HAVE_UNISTD_H +# include +# include +#endif + + +#include +#include +#include +#include +#include + +#include "mplib_s.h" +#include "xmalloc.h" + + + +/******************************/ +/* Static functions */ +/******************************/ + +static id3v1_tag* +id3v1_get_tag(int fd) +{ + id3v1_tag *tag; + char *c; + + tag = XMALLOCD0(id3v1_tag, "id3v1_get_tag:tag"); + + c = (char *)xmallocd(3, "id3v1_get_tag:c"); + + if(lseek(fd, -128L, SEEK_END) == -1) goto exit_on_error; + if(read(fd, c, 3) < 3) goto exit_on_error; + if(strncmp(c, "TAG", 3) != 0) goto exit_on_error; + + tag->title = (char *)xmallocd(31, "id3v1_get_tag:tag->title"); + if(read(fd, tag->title, 30) < 30) goto exit_on_error; + if(tag->title[0] == 0 || id3_is_only_space(tag->title, 30)) { + xfree(tag->title); + tag->title = NULL; + } else tag->title[30] = 0; + + tag->artist = (char*)xmallocd(31, "id3v1_get_tag:tag->artist"); + if(read(fd, tag->artist, 30) < 30) goto exit_on_error; + if(tag->artist[0] == 0 || id3_is_only_space(tag->artist, 30)) { + xfree(tag->artist); + tag->artist = NULL; + } else tag->artist[30] = 0; + + tag->album = (char*)xmallocd(31, "id3v1_get_tag:tag->album"); + if(read(fd, tag->album, 30) < 30) goto exit_on_error; + if(tag->album[0] == 0 || id3_is_only_space(tag->album, 30)) { + xfree(tag->album); + tag->album = NULL; + } else tag->album[30] = 0; + + tag->year = (char*)xmallocd(5, "id3v1_get_tag:tag->year"); + if(read(fd, tag->year, 4) < 4) goto exit_on_error; + if(tag->year[0] == 0 || id3_is_only_space(tag->year, 4)) { + xfree(tag->year); + tag->year = NULL; + } else tag->year[4] = 0; + + tag->comment = (char*)xmallocd(31, "id3v1_get_tag:tag->comment"); + if(read(fd, tag->comment, 30) < 30) goto exit_on_error; + tag->comment[30] = 0; + + if(read(fd, &(tag->genre), 1) < 1) goto exit_on_error; + + /* Looking for v1.1 track info */ + if(tag->comment && tag->comment[28] == 0 && tag->comment[29] != 0) + { + tag->track = tag->comment[29]; + tag->comment[29] = 0; + } + else + { + tag->track = 0; + } + + /* Set comment to NULL if not set - this happens at this point because */ + /* there maybe a track info anyway */ + if(tag->comment[0] == 0 || id3_is_only_space(tag->comment, 28)) { + xfree(tag->comment); + tag->comment = NULL; + } + + xfree(c); + return tag; + + exit_on_error: + + xfree(c); + id3v1_free_tag(tag); + return NULL; +} + +static int +id3v1_add_tag(int fd, id3v1_tag *tag) +{ + int i, j; + void *blank, *set; + char *b_tag, *b_tag_start; + + blank = xmallocd0(30, "id3v1_add_tag:blank"); + set = xmallocd(30, "id3v1_add_tag:set"); + memset(set, 0xFF, 30); + b_tag = b_tag_start = (char *)xmallocd0(128, "id3v1_add_tag:b_tag"); + + strncpy(b_tag, "TAG", 3); b_tag += 3; + + if(tag->title) + { + j = strlen(tag->title); + strncpy(b_tag, tag->title, j); b_tag += j; + i = 30 - j; + if(i > 0) + { + strncpy(b_tag, blank, i); b_tag += i; + } + } + else + { + strncpy(b_tag, blank, 30); b_tag += 30; + } + + if(tag->artist) + { + j = strlen(tag->artist); + strncpy(b_tag, tag->artist, j); b_tag += j; + i = 30 - j; + if(i > 0) + { + strncpy(b_tag, blank, i); b_tag += i; + } + } + else + { + strncpy(b_tag, blank, 30); b_tag += 30; + } + + if(tag->album) + { + j = strlen(tag->album); + strncpy(b_tag, tag->album, j); b_tag += j; + i = 30 - j; + if(i > 0) + { + strncpy(b_tag, blank, i); b_tag += i; + } + } + else + { + strncpy(b_tag, blank, 30); b_tag += 30; + } + + if(tag->year) + { + j = strlen(tag->year); + strncpy(b_tag, tag->year, j); b_tag += j; + i = 4 - j; + if(i > 0) + { + strncpy(b_tag, blank, i); b_tag += i; + } + } + else + { + strncpy(b_tag, blank, 4); b_tag += 4; + } + + if(tag->comment) + { + int hastrack = 0; + j = strlen(tag->comment); + if(tag->track > 0) hastrack = 1; + if(hastrack && j > 28) + { + strncpy(b_tag, tag->comment, 28); b_tag += 28; + } + else + { + strncpy(b_tag, tag->comment, j); b_tag += j; + i = ((tag->track > 0) ? 28 : 30) - j; + } + if(i > 0) + { + strncpy(b_tag, blank, i); b_tag += i; + } + } + else + { + strncpy(b_tag, blank, (tag->track > 0) ? 28 : 30); + b_tag += (tag->track > 0) ? 28 : 30; + } + + if(tag->track > 0) + { + strncpy(b_tag, blank, 1); b_tag += 1; + strncpy(b_tag, &(tag->track), 1); b_tag += 1; + } + if(tag->genre != 0xFF) + { + strncpy(b_tag, &(tag->genre), 1); b_tag += 1; + } + else + { + strncpy(b_tag, set, 1); b_tag += 1; + } + + j = 0; + + if(lseek(fd, 0L, SEEK_END) != -1) + { + if(write(fd, b_tag - 128, 128) < 128) j = 1; + } + else j = 1; + + xfree(b_tag_start); + xfree(blank); + xfree(set); + + return j; +} + +static int +id3v2_add_tag(int fd, id3v2_tag *tag, id3v2_tag *old) +{ + unsigned char *btag, *btag_start; + unsigned char flag = 0; + int i, j; + char *b_tag, *b_tag_start, *d; + id3v2_frame_list *frame_list; + id3v2_frame *frame; + + /* at first we are going to write the tags raw data into + the btag byte array */ + btag = btag_start = xmallocd0(tag->header->total_tag_size, + "id3v2_add_tag:btag"); + strncpy(btag, "ID3", 3); btag += 3; + *btag = (char)tag->header->version_minor; btag += 1; + *btag = (char)tag->header->version_revision; btag += 1; + flag |= ((tag->header->unsyncronization & 1) << 7); + flag |= ((tag->header->has_extended_header & 1) << 6); + flag |= ((tag->header->is_experimental & 1) << 5); + flag |= ((tag->header->has_footer & 1) << 4); + memcpy(btag, &flag, 1); btag += 1; + + if(old) + { + i = old->header->total_tag_size - 10; + if(old->header->has_footer) i -= 10; + } + else + { + i = tag->header->total_tag_size - 10; + if(tag->header->has_footer) i -= 10; + /* add padding to total size we mean to store on disk */ + /* mplib does not use any kind of padding internaly */ +/* i += 1024; */ /* no padding needed for MPIO use */ + } + + d = id3_sync32(i); + btag[0] = d[0]; + btag[1] = d[1]; + btag[2] = d[2]; + btag[3] = d[3]; + xfree(d); + btag += 4; + + if(tag->header->has_extended_header) + { + d = id3_sync32(tag->header->extended_header->size); + btag[0] = d[0]; + btag[1] = d[1]; + btag[2] = d[2]; + btag[3] = d[3]; + xfree(d); + btag += 4; + + *btag = (char)tag->header->extended_header->no_flag_bytes; btag += 1; + flag = ((tag->header->extended_header->is_update & 1) << 6); + flag |= ((tag->header->extended_header->crc_data_present & 1) << 5); + flag |= ((tag->header->extended_header->restrictions & 1) << 4); + memcpy(btag, &flag, 1); btag += 1; + if(tag->header->extended_header->is_update) + { + btag[0] = 0; btag += 1; + } + if(tag->header->extended_header->crc_data_present) + { + int length = tag->header->extended_header->crc_data_length ? tag->header->extended_header->crc_data_length : 5; + *btag = (char)length; btag += 1; + memcpy(btag, tag->header->extended_header->crc_data, length); btag += 1; + } + if(tag->header->extended_header->restrictions) + { + int length = tag->header->extended_header->restrictions_data_length ? tag->header->extended_header->restrictions_data_length : 5; + *btag = (char)length; btag += 1; + memcpy(btag, tag->header->extended_header->restrictions_data, length); btag += 1; + } + } + + frame_list = tag->frame_list; + while(frame_list) { + int j; + frame = frame_list->data; + + strncpy(btag, frame->frame_id, 4); btag += 4; + d = id3_sync32(frame->data_size); + btag[0] = d[0]; + btag[1] = d[1]; + btag[2] = d[2]; + btag[3] = d[3]; + xfree(d); + btag += 4; + memcpy(btag, &frame->status_flag, 1); btag += 1; + memcpy(btag, &frame->format_flag, 1); btag += 1; + + memcpy(btag, frame->data, frame->data_size); btag += frame->data_size; + + frame_list = frame_list->next; + } + + /* XXX footer not supported yet */ + + /* if an old tag was provided it is desired to overwrite it */ + /* else this is a brand new tag */ + if(old) { + FILE *file; + void *ptr = xmallocd0(old->header->total_tag_size - tag->header->total_tag_size, "id3v2_add_tag:ptr"); + if(!(file = fdopen(fd, "r+b"))) + { + xfree(ptr); + goto exit_on_error; + } + + fseek(file, 0, SEEK_SET); + if(fwrite(btag_start, tag->header->total_tag_size, 1, file) < 1) + { + xfree(ptr); + goto exit_on_error; + } + + /* write padding till end of old tag */ + if(fwrite(ptr, old->header->total_tag_size - tag->header->total_tag_size, 1, file) < 1) { + xfree(ptr); + goto exit_on_error; + } + + fflush(file); + xfree(ptr); + + } else { + FILE *file, *tmp; + int read; + void *ptr, *blank; + unsigned char *c; + + ptr = xmallocd(4096, "id3v2_add_tag:ptr"); + blank = xmallocd0(1024, "id3v2_add_tag:blank"); + + file = fdopen(fd, "r+b"); + tmp = tmpfile(); + if(!(file && tmp)) + { + fflush(file); + fclose(tmp); + xfree(ptr); + xfree(blank); + goto exit_on_error; + } + + fseek(file, 0, SEEK_SET); + fseek(tmp, 0, SEEK_SET); + + /* write tag in tmp file */ + fwrite(btag_start, tag->header->total_tag_size, 1, tmp); + + /* Write 1024b padding */ + /* no padding needed for MPIO use */ +/* fwrite(blank, 1024, 1, tmp); */ + + /* write rest of file */ + while(!feof(file)) + { + read = fread(ptr, 1, 4096, file); + if(fwrite(ptr, 1, read, tmp) != read && !feof(file)) + { + fflush(file); + fclose(tmp); + xfree(ptr); + xfree(blank); + goto exit_on_error; + } + } + + fflush(tmp); + + fseek(file, 0, SEEK_SET); + fseek(tmp, 0, SEEK_SET); + while(!feof(tmp)) + { + read = fread(ptr, 1, 4096, tmp); + if(fwrite(ptr, 1, read, file) != read && !feof(tmp)) + { + fflush(file); + fclose(tmp); + xfree(ptr); + xfree(blank); + goto exit_on_error; + } + } + + fflush(file); + fclose(tmp); + + xfree(ptr); + xfree(blank); + } + + xfree(btag_start); + return 0; + + exit_on_error: + xfree(btag_start); + return MP_EERROR; +} + +static int +id3v1_del_tag(int fd) +{ + int nlength; + unsigned char *c; + struct stat fs; + + if(fstat(fd, &fs)) return 1; + + if(fs.st_size < 128) return 1; /* Hardly a valid mpeg file.. */ + + c = (char *)xmallocd(3, "id3v1_del_tag:c"); + if(lseek(fd, -128L, SEEK_END) == -1) goto exit_on_error; + if(read(fd, c, 3) < 3) goto exit_on_error; + if(strncmp(c, "TAG", 3)) goto exit_on_error; + xfree(c); + + nlength = fs.st_size - 128; + + if(ftruncate(fd, nlength)) return 1; + + return 0; + + exit_on_error: + xfree(c); + return 1; +} + + +static int +id3v2_del_tag(int fd, id3v2_tag *t) +{ + unsigned char *c; + long tag_len, file_len; + FILE *file, *tmp; + int read; + void *ptr; + id3v2_tag *tfound = NULL;; + + if(!t) + { + t = id3v2_get_tag(fd); + if(!t) return 0; + else tfound = t; + } + + ptr = xmallocd(4096, "id3v2_del_tag:ptr"); + + tag_len = t->header->total_tag_size; + file_len = lseek(fd, 0, SEEK_END); + if(file_len < 1 || tag_len < 1) goto exit_on_error; + + /* use os system buffering */ + file = fdopen(fd, "r+b"); + tmp = tmpfile(); + if(!(file && tmp)) goto exit_on_error; + + fseek(file, tag_len, SEEK_SET); + fseek(tmp, 0, SEEK_SET); + while(!feof(file)) + { + read = fread(ptr, 1, 4096, file); + if(fwrite(ptr, 1, read, tmp) != read && !feof(file)) + goto exit_on_error; + } + + fflush(tmp); + + fseek(file, 0, SEEK_SET); + fseek(tmp, 0, SEEK_SET); + while(!feof(tmp)) + { + read = fread(ptr, 1, 4096, tmp); + if(fwrite(ptr, 1, read, file) != read && !feof(tmp)) + goto exit_on_error; + } + + fclose(tmp); + xfree(ptr); + if(tfound) id3v2_free_tag(tfound); + return 0; + + exit_on_error: + fclose(tmp); + xfree(ptr); + if(tfound) id3v2_free_tag(tfound); + return 1; +} + + +static int +id3v1_truncate_tag(id3v1_tag *tag) +{ + int notrunc = 0; + int len = 0; + void *ptr; + + if(tag->title && (len = strlen(tag->title)) > 30) + { + realloc(tag->title, 31); + tag->title[30] = 0; + } + + if(tag->artist && (len = strlen(tag->artist)) > 30) + { + realloc(tag->artist, 31); + tag->artist[30] = 0; + } + + if(tag->album && (len = strlen(tag->album)) > 30) + { + realloc(tag->album, 31); + tag->album[30] = 0; + } + + if(tag->year && (len = strlen(tag->year)) > 4) + { + realloc(tag->title, 5); + tag->title[4] = 0; + } + + if(tag->comment) + { + int max = (tag->track > 0) ? 28 : 30; + if((len = strlen(tag->comment)) > max) + { + realloc(tag->comment, max + 1); + tag->comment[max] = 0; + } + } + + return notrunc; +} + +static int +id3_is_only_space(char *str, int strlen) +{ + int i = 0; + + while(i < strlen) + { + if(str[i] != 0x20) return 0; + i++; + } + + return 1; +} + +static id3v2_tag* +id3v2_get_tag(int fd) +{ + unsigned char *c; + id3v2_header *header; + id3v2_frame_list *frame_list; + id3v2_frame *frame; + id3v2_tag *tag = NULL; + int i; + + if(lseek(fd, 0L, SEEK_SET) == -1) return NULL; + + c = (unsigned char*)xmallocd0(1024, "id3v2_get_tag:c"); + + if(read(fd, c, 10) < 10) goto exit_on_error; + + c[10] = 0; + + if(strncmp(c, "ID3", 3)) goto exit_on_error; + + header = XMALLOCD0(id3v2_header, "id3v2_get_tag:header"); + header->version_minor = c[3]; + header->version_revision = c[4]; + header->flags = c[5]; + header->unsyncronization = (c[5] & 128) >> 7; + header->has_extended_header = (c[5] & 64) >> 6; + header->is_experimental = (c[5] & 32) >> 5; + header->has_footer = (c[5] & 16) >> 4; + + header->total_tag_size = id3_unsync32(c, 6) + 10; + if(header->has_footer) header->total_tag_size += 10; + + tag = XMALLOCD0(id3v2_tag, "id3v2_get_tag:tag"); + + /* check if version is supported */ + if(c[3] != 3 && c[3] != 4) + { + xfree(c); + tag->header = header; + tag->frame_list = NULL; + return tag; + } + + frame_list = XMALLOCD0(id3v2_frame_list, "id3v2_get_tag:frame_list"); + frame_list->start = frame_list; + + /* assigning header and frame list to tag */ + tag->header = header; + tag->frame_list = frame_list; + + if(header->has_extended_header) + { + id3v2_extended_header *xt_header = XMALLOCD0(id3v2_extended_header, + "id3v2_get_tag:id3v2_extended_header"); + + header->extended_header = xt_header; + + read(fd, c, 4); /* get length of extended header */ + xt_header->size = id3_unsync32(c, 0); + + read(fd, c, 1); /* get number of flags */ + xt_header->no_flag_bytes = (c[0] > 0) ? c[0] : 1; + + read(fd, c, xt_header->no_flag_bytes); /* get flag bytes */ + xt_header->is_update = (c[0] & 64) >> 6; + xt_header->crc_data_present = (c[0] & 32) >> 5; + xt_header->restrictions = (c[0] & 16) >> 4; + + /* Flag data */ + if(xt_header->is_update) read(fd, c, 1); /* Data length ind. is 0 -skip */ + if(xt_header->crc_data_present) { + read(fd, c, 1); /* data length - shoud be 5 */ + if(*c != 5) goto exit_on_error; /* else things might + break badly */ + xt_header->crc_data_length = *c; + xt_header->crc_data = xmallocd0(*c, "id3v2_get_tag:xt_header->crc_data"); + read(fd, xt_header->crc_data, *c); + } + if(xt_header->restrictions) { + read(fd, c, 1); /* data length - shoud be 1 */ + if(*c != 1) goto exit_on_error; + xt_header->restrictions_data_length = *c; + xt_header->restrictions_data = xmallocd0(*c, + "id3v2_get_tag:xt_header->restrictions_data"); + read(fd, xt_header->restrictions_data, *c); + } + } + + /* Read frames */ + while(lseek(fd, 0L, SEEK_CUR) < header->total_tag_size) + { + int hasEnc = 0, hasLang = 0, d; + + read(fd, c, 10); /* Read header */ + + /* break if padding is reached - this should never happen here.. */ + if(c[0] == 0 && c[1] == 0 && c[2] == 0 && c[3] == 0) break; + + /* Check if possible id is alpha numeric */ + if(!isalnum(c[0]) || !isalnum(c[1]) || !isalnum(c[2]) || !isalnum(c[3])) break; + + frame = XMALLOCD(id3v2_frame, "id3v2_get_tag:frame"); + frame->frame_id = xmallocd(4, "id3v2_get_tag:frame->frame_id"); + strncpy(frame->frame_id, c, 4); + frame->data_size = id3_unsync32(c, 4); + frame->status_flag = c[8]; + frame->format_flag = c[9]; + + /* Getting frame content */ + frame->data = xmallocd(frame->data_size, "id3v2_get_tag:frame->data_size"); + read(fd, frame->data, frame->data_size); + + /* Add frame to list */ + if(frame_list->data) + { + frame_list->next = XMALLOCD(id3v2_frame_list, "id3v2_get_tag:frame_list->next"); + frame_list->next->start = frame_list->start; + frame_list = frame_list->next; + frame_list->next = NULL; + } + frame_list->data = frame; + } + + xfree(c); + return tag; + + exit_on_error: + + xfree(c); + id3v2_free_tag(tag); + return NULL; +} + +static char ** +id3v2_get_names(id3v2_tag *tag) +{ + id3v2_frame *frame; + id3v2_frame_list *frame_list; + char **clist; + int i; + + if(!tag->frame_list) return NULL; + + frame_list = tag->frame_list; + + i = id3_get_no_frames(tag); + clist = xmallocd(sizeof(char*) * i+1, "id3v2_get_names:clist"); + clist[i] = 0; + + for(i = 0; frame_list; i++) + { + if(!frame_list->data) continue; + frame = frame_list->data; + + if(!frame->frame_id) continue; + clist[i] = xmallocd(5, "id3v2_get_names:clist[i]"); + strncpy(clist[i], frame->frame_id, 4); + clist[i][4] = 0; + frame_list = frame_list->next; + } + return clist; +} + + +static id3_content* +id3v1_get_content(id3v1_tag *tag, int field) +{ + int i; + char *c; + id3_content *ret; + + switch(field) + { + case MP_ARTIST: + if(!tag->artist) + { + errno = MP_EFNF; + return NULL; + } + return mp_assemble_text_content(tag->artist, ISO_8859_1); + + case MP_TITLE: + if(!tag->title) + { + errno = MP_EFNF; + return NULL; + } + return mp_assemble_text_content(tag->title, ISO_8859_1); + + case MP_ALBUM: + if(!tag->album) + { + errno = MP_EFNF; + return NULL; + } + return mp_assemble_text_content(tag->album, ISO_8859_1); + + case MP_YEAR: + if(!tag->year) + { + errno = MP_EFNF; + return NULL; + } + return mp_assemble_text_content(tag->year, ISO_8859_1); + + case MP_COMMENT: + if(!tag->comment) + { + errno = MP_EFNF; + return NULL; + } + return mp_assemble_comment_content(tag->comment, NULL, ISO_8859_1, NULL); + + case MP_GENRE: + if(tag->genre < GLL) + { + return mp_assemble_text_content(genre_list[tag->genre], ISO_8859_1); + } + else + { + errno = MP_EFNF; + return NULL; + } + + case MP_TRACK: + if(!tag->track) + { + errno = MP_EFNF; + return NULL; + } + + if(tag->track < 10) i = 2; + else if(tag->track < 100) i = 3; + else i = 4; + c = xmallocd(i, "id3v1_get_content:c"); + snprintf(c, i, "%d", tag->track); + ret = mp_assemble_text_content(c, ISO_8859_1); + xfree(c); + return ret; + + default: + errno = MP_EFNF; + return NULL; + } +} + +static id3_content* +id3v2_get_content_at_pos(id3v2_tag *tag, const char *field, int pos) +{ + id3v2_frame_list *frame_list; + id3v2_frame *frame; + int i, found, j; + + if(!tag->frame_list || !field) + { + errno = MP_EERROR; + return NULL; + } + + frame_list = tag->frame_list; + + for(i = 0, found = 0; frame_list; i++, frame_list = frame_list->next) + { + if(!frame_list->data) continue; + frame = frame_list->data; + + if(!frame->frame_id || !frame->data) continue; + if(strncmp(frame->frame_id, field, 4)) continue; + + if(found == pos) + { + id3_content *ret = XMALLOCD0(id3_content, + "id3v2_get_content_at_pos:ret"); + if(frame_is_compressed(frame)) ret->compressed = 1; + else ret->compressed = 0; + + if(frame_is_encrypted(frame)) ret->encrypted = 1; + else ret->encrypted = 0; + + ret->length = frame->data_size; + ret->data = xmallocd(frame->data_size, "id3v2_get_content_at_pos:ret->data"); + ret->data = memcpy(ret->data, frame->data, frame->data_size); + + return ret; + } + + found++; + } + + errno = MP_EFNF; + return NULL; +} + +static long +id3_sync(unsigned char* data, long length) +{ + int i; + + for(i = 0; i < length - 1; i++) + { + if(((data[i] & 0xFF) == 0xFF && (data[i+1] & 0xE0) == 0xE0) || + (i+2 < length && (data[i] & 0xFF) == 0xFF && data[i+1] == 0 && data[i+2] != 0)) + { + + realloc(data, length + 1); length++; + memmove(data + i+2, data + i+1, length - i - 2); + memset(data + i+1, 0, 1); + } + } + + return length; +} + +static long +id3_unsync(unsigned char* data, long length) +{ + /* TODO */ + /* this function is supposed to make syncsafe values normal again */ + /* we don't need this yet, because there are no fields supported that will */ + /* have the unsynchronization scheme applied */ + + +} + +static unsigned int +id3_unsync32(unsigned char* c, int start) +{ + return c[start+3] + (c[start+2] << 7) + (c[start+1] << 14) + (c[start] << 21); +} + +int +id3_get_no_frames(id3v2_tag *tag) +{ + int i; + id3v2_frame_list *frame_list = tag->frame_list; + + for(i = 0; frame_list; i++) + frame_list = frame_list->next; + + return i; +} + +static unsigned char * +id3_sync32(unsigned int i) +{ + unsigned char *c = (unsigned char *)xmallocd0(4, "id3_sync32:c"); + + c[3] = (i & 0x7f); + c[2] = ((i & 0x80) >> 7) | (((i & 0x7f00) >> 8) << 1); + c[1] = ((i & 0x8000) >> 15) | (((i & 0x7f0000) >> 16) << 1); + c[0] = ((i & 0x800000) >> 23) | (((i & 0x7f000000) >> 24) << 1); + + return c; +} + +id3v2_frame* +id3_lookup_frame(id3v2_frame_list *list, const char *field, const int pos) +{ + int cur = 0; + + if(!list || !field) return NULL; + + do + { + if(!strcmp(list->data->frame_id, field)) + { + if(cur == pos) return list->data; + cur++; + } + } while((list = list->next)); + + return NULL; +} + +int +id3_remove_frame(id3v2_frame_list *list, id3v2_frame *frame) +{ + if(!list || !frame) return MP_EERROR; + + /* Frame is first element in list */ + if(list->data == frame) + { + xfree(list->data); + list->next->start = list->next; + xfree(list); + return 0; + } + + /* Iterate through others */ + do + { + if(list->next->data == frame) + { + list->next = list->next->next; + xfree(frame); + return 0; + } + } while((list = list->next)); + + return 1; +} + + +int +id3_add_frame(id3v2_frame_list *list, char *field, char *new_value, int len) +{ + id3v2_frame *frame; + char *new_valuecp; + long len_sync; + + if(!list || !new_value || !field || strlen(field) != 4) return MP_EERROR; + + // make a copy of the given value to include it in the frame + new_valuecp = xmallocd(len, + "id3_add_frame:new_valuecp"); + memcpy(new_valuecp, new_value, len); + new_value = new_valuecp; + + /* make sync safe */ +/* len_sync = id3_sync(new_value, len); */ + len_sync = len; /* disabled sync for MPIO use */ + + frame = XMALLOCD(id3v2_frame, "id3_add_frame:frame"); + frame->frame_id = xmallocd(4, "id3_add_frame:frame->frame_id"); + strncpy(frame->frame_id, field, 4); + frame->data = new_value; + frame->status_flag = 0; + + if(len != len_sync) frame->format_flag = 64; + else frame->format_flag = 0; + frame->data_size = len_sync; + + /* Empty list */ + if(!list->data) + { + list->data = frame; + return 0; + } + + /* iterate to last element */ + while(list->next) list = list->next; + + list->next = XMALLOCD(id3v2_frame_list, "id3_add_frame:list->next"); + list->next->start = list->start; + list = list->next; + list->next = NULL; + list->data = frame; + + return 0; +} + + +#define BUF_SIZE 4096 + +static int +id3_lseek_syncword(int fd) +{ + unsigned char *data = (unsigned char*) xmallocd(BUF_SIZE, "id3_lseek_syncword:data"); + int ret; + + // Reset the reading offset of the fd + lseek(fd, SEEK_SET, 0); + + if(read(fd, data, BUF_SIZE) < 1) + { + xfree(data); + return 0; /* return false on EOF */ + } + + ret = id3_lseek_syncword_r(fd, data, 0); + xfree(data); + return ret; +} + +static int +id3_lseek_syncword_r(int fd, unsigned char *data, int checked) +{ + unsigned char lastchar; + int i; + + for(i = 0; i + 1 < BUF_SIZE; i++) + { + if(((data[i] & 0xFF)== 0xFF) && ((data[i+1] & 0xE0)== 0xE0)) + { + lseek(fd, checked + i, SEEK_SET); + return 0; + } + } + + lastchar = data[BUF_SIZE - 1]; + + if(read(fd, data, BUF_SIZE) < 1) return 0; /* return false on EOF */ + + if(((lastchar & 0xFF)== 0xFF) && ((data[0] & 0xE0)== 0xE0)) + { + lseek(fd, checked + BUF_SIZE - 1, SEEK_SET); + return 0; + } + + return id3_lseek_syncword_r(fd, data, checked + BUF_SIZE); +} + +static id3_tag* +id3v1_alloc_tag(void) +{ + id3_tag *tag = XMALLOCD(id3_tag, "id3v1_alloc_tag:tag"); + id3v1_tag *v1 = XMALLOCD0(id3v1_tag, "id3v1_alloc_tag:v1"); + + tag->tag = v1; + tag->version = 1; + + v1->genre = 0xFF; + + return tag; +} + +static id3_tag* +id3v2_alloc_tag(void) +{ + id3_tag *tag = XMALLOCD(id3_tag, "id3v2_alloc_tag:tag"); + id3v2_tag *v2 = XMALLOCD0(id3v2_tag, "id3v2_alloc_tag:v2"); + + tag->tag = v2; + tag->version = 2; + + return tag; +} + +static void +id3v1_free_tag(id3v1_tag* v1) +{ + xfree(v1->artist); + xfree(v1->album); + xfree(v1->title); + xfree(v1->year); + xfree(v1->comment); + xfree(v1); +} + +static void +id3v2_free_tag(id3v2_tag* v2) +{ + id3v2_frame_list* doomed; + id3v2_frame *frame; + + if(!v2) return; + + xfree(v2->header->extended_header); + xfree(v2->header); + + if(!v2->frame_list) + { + xfree(v2); + return; + } + + /* Freeing frames */ + do + { + frame = (id3v2_frame*)v2->frame_list->data; + if(frame->frame_id) xfree(frame->frame_id); + if(frame->data) xfree(frame->data); + xfree(v2->frame_list->data); + + doomed = v2->frame_list->next; + xfree(v2->frame_list); + + } while((v2->frame_list = doomed)); + + xfree(v2); +} diff --git a/libmpio/mplib/mplib_s.h b/libmpio/mplib/mplib_s.h new file mode 100644 index 0000000..7803a5e --- /dev/null +++ b/libmpio/mplib/mplib_s.h @@ -0,0 +1,153 @@ +/* + * mplib - a library that enables you to edit ID3 tags + * Copyright (C) 2001,2002 Stefan Podkowinski + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mplib.h" + +#ifndef __MPLIB_S_H +#define __MPLIB_S_H + +#undef __BEGIN_DECLS +#undef __END_DECLS +#ifdef __cplusplus +# define __BEGIN_DECLS extern "C" { +# define __END_DECLS } +#else +# define __BEGIN_DECLS /* empty */ +# define __END_DECLS /* empty */ +#endif + + +__BEGIN_DECLS + + +/************************************/ +/* Members */ +/************************************/ + +/* Bitrates br_[version]_[layer] ) */ +const static int br_1_1[16] = { -1, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 }; +const static int br_1_2[16] = { -1, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 }; +const static int br_1_3[16] = { -1, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 }; +const static int br_2_1[16] = { -1, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 }; +const static int br_2_2[16] = { -1, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 }; +const static int br_2_3[16] = { -1, 8, 16, 24, 32, 64, 80, 56, 64, 128, 160, 112, 128, 256, 320, 0 }; + +#define GLL 148 +const static char *genre_list[GLL] = +{ "Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", "Hip-Hop", "Jazz", + "Metal", "New Age", "Oldies", "Other", "Pop", "R&B", "Rap", "Reggae", "Rock", "Techno", + "Industrial", "Alternative", "Ska", "Death Metal", "Pranks", "Soundtrack", "Euro-Techno", + "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk", "Fusion", "Trance", "Classical", "Instrumental", + "Acid", "House", "Game", "Sound Clip", "Gospel", "Noise", "Alternative Rock", "Bass", "Soul", "Punk", + "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", "Ethnic", "Gothic", "Darkwave", + "Techno-Industrial", "Electronic", "Pop-Folk", "Eurodance", "Dream", "Southern Rock", "Comedy", + "Cult", "Gangsta Rap", "Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native American", "Cabaret", + "New Wave", "Psychedelic", "Rave", "Showtunes", "Trailer", "Lo-Fi", "Tribal", "Acid Punk", + "Acid Jazz", "Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock", "Folk", "Folk/Rock", + "National Folk", "Swing", "Fast-Fusion", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass", + "Avantgarde", "Gothic Rock", "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", + "Big Band", "Chorus", "Easy Listening", "Acoustic", "Humour", "Speech", "Chanson", "Opera", + "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus", "Porn Groove", "Satire", "Slow Jam", + "Club", "Tango", "Samba", "Folklore", "Ballad", "Power Ballad", "Rythmic Soul", "Freestyle", + "Duet", "Punk Rock", "Drum Solo", "A Cappella", "Euro-House", "Dance Hall", "Goa", "Drum & Bass", + "Club-House", "Hardcore", "Terror", "Indie", "BritPop", "Negerpunk", "Polsk Punk", "Beat", + "Christian Gangsta Rap", "Heavy Metal", "Black Metal", "Crossover", "Contemporary Christian", + "Christian Rock", "Merengue", "Salsa", "Trash Metal", "Anime", "JPop", "Synthpop" }; + + +/************************************/ +/* Macros */ +/************************************/ + +#define frame_is_read_only(id3v2_frame__) ((id3v2_frame__->status_flag >> 4) & 1) +#define frame_preserve_on_tag_altered(id3v2_frame__) ((id3v2_frame__->status_flag >> 6) & 1) +#define frame_preserve_on_file_altered(id3v2_frame__) ((id3v2_frame__->status_flag >> 5) & 1) + +#define frame_has_group_information(id3v2_frame__) ((id3v2_frame__->format_flag >> 6) & 1) +#define frame_is_compressed(id3v2_frame__) ((id3v2_frame__->format_flag >> 3) & 1) +#define frame_is_encrypted(id3v2_frame__) ((id3v2_frame__->format_flag >> 2) & 1) +#define frame_is_unsynchronised(id3v2_frame__) ((id3v2_frame__->format_flag >> 1) & 1) +#define frame_has_data_length_indicator(id3v2_frame__) (id3v2_frame__->format_flag & 1) + + +/************************************/ +/* Static functions */ +/************************************/ + + +/* Gets the v1/v2 tag from a file */ +static id3v1_tag *id3v1_get_tag(int); +static id3v2_tag *id3v2_get_tag(int); + +/* Adds v1/v2 Tag to file */ +static int id3v1_add_tag(int, id3v1_tag*); +static int id3v2_add_tag(int, id3v2_tag*, id3v2_tag*); + +/* Removes v1/v2 Tag from file */ +static int id3v1_del_tag(int); +static int id3v2_del_tag(int, id3v2_tag*); + +/* Truncates the fields of the tag to the proper lengths */ +static int id3v1_truncate_tag(id3v1_tag*); + +/* Returns 1 or 0 whether arg 1 is just filled up with space (0x20) or not */ +static int id3_is_only_space(char*, int); + +/* Gets all frame names available in the tag */ +static char **id3v2_get_names(id3v2_tag*); + +/* Gets the content of the given field in the tag on the specified position. */ +static id3_content* id3v2_get_content_at_pos(id3v2_tag*, const char*, int); +static id3_content* id3v1_get_content(id3v1_tag*, int); + +/* Gets the number of available frames */ +static int id3_get_no_frames(id3v2_tag*); + +/* Returns string of the frames content */ +/* static char* extract_frame_data(char *, int); */ + +/* Removes a frame from the frame list */ +static int id3_remove_frame(id3v2_frame_list *, id3v2_frame *); + +/* Adds a new frame to the list */ +static int id3_add_frame(id3v2_frame_list *, char *, char *, int); + +/* Lookups a frame by his identifier on the given position */ +static id3v2_frame* id3_lookup_frame(id3v2_frame_list *, const char *, const int); + +/* Sync functions */ +static long id3_unsync(unsigned char*, long); +static long id3_sync(unsigned char*, long); +static unsigned int id3_unsync32(unsigned char*, int); +static unsigned char* id3_sync32(unsigned int); + +static int id3_lseek_syncword(int); +static int id3_lseek_syncword_r(int, unsigned char *, int); + +/* Gets a new allocated v1 or v2 tag */ +static id3_tag* id3v1_alloc_tag(void); +static id3_tag* id3v2_alloc_tag(void); + +/* free functions */ +static void id3v1_free_tag(id3v1_tag*); +static void id3v2_free_tag(id3v2_tag*); + + +__END_DECLS + +#endif /* __MPLIB_S_H */ diff --git a/libmpio/mplib/xmalloc.c b/libmpio/mplib/xmalloc.c new file mode 100644 index 0000000..a66be63 --- /dev/null +++ b/libmpio/mplib/xmalloc.c @@ -0,0 +1,167 @@ +/* + * mplib - a library that enables you to edit ID3 tags + * Copyright (C) 2001,2002 Stefan Podkowinski + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +/* define XMALLOC_CHECK 1 */ +#include "xmalloc.h" +#ifdef USE_GC +# include +# define malloc(str) GC_MALLOC(str) +#endif + +#ifdef XMALLOC_CHECK +typedef struct _xdelem { + void* alloced; + void* freed; + char* descrl; + struct _xdelem* next; +} xdelem; + +xdelem* first = NULL; +#endif + +#define errmsg "mplib: Memory exhausted: Could not allocate %d bytes\n" + +void * +xmalloc(size_t s) +{ + return xmallocd(s, NULL); +} + +void * +xmallocd(size_t s, char* descrl) +{ + void *new = (void*)malloc(s); +#ifdef XMALLOC_CHECK + xdelem* cur = (xdelem*)malloc(sizeof(xdelem)); + cur->next = NULL; + cur->freed = NULL; + cur->descrl = descrl; +#endif + if(!new) fprintf(stderr, errmsg, s); + +#ifdef XMALLOC_CHECK + cur->alloced = new; + exists: + if(!first) first = cur; + else { + xdelem* last = first; + do { + if(last->alloced == cur->alloced) { + last->freed = NULL; + last->descrl = descrl; + free(cur); + goto exists; + } + } while(last->next && (last = last->next)); + last->next = cur; + } +#endif + + return new; +} + +void * +xmallocd0(size_t s, char* descr) +{ +#ifdef XMALLOC_CHECK + void *new = (void*)xmallocd(s, descr); +#else + void *new = (void*)malloc(s); +#endif + if(!new) fprintf(stderr, errmsg, s); + else memset(new, 0, s); + return new; +} + +void * +xmalloc0(size_t s) +{ +#ifdef XMALLOC_CHECK + void *new = (void*)xmalloc(s); +#else + void *new = (void*)malloc(s); +#endif + if(!new) fprintf(stderr, errmsg, s); + else memset(new, 0, s); + return new; +} + +void * +xrealloc(void * ptr, size_t s) +{ + void *new; + + if(!ptr) return xmalloc(s); + + new = (void*)realloc(ptr, s); + if(!new) fprintf(stderr, errmsg, s); + return new; +} + +void +xfree(void* ptr) { + if(!ptr) return; +#ifdef XMALLOC_CHECK + if(first) { + xdelem* el = first; + do { + if(el->freed == ptr) { + if(el->descrl) + printf("XMALLOC: (%s) memory allready freed\n", el->descrl); + else + printf("XMALLOC: memory allready freed at %h\n", ptr); + break; + } + if(el->alloced == ptr) { + el->freed = ptr; + break; + } + } while(el->next && (el = el->next)); + } +#endif + free(ptr); +} + + +#ifdef XMALLOC_CHECK +void +xprint_malloc_stat(void) { + long kb_alloc = 0; + long kb_freed = 0; + long kb_used = 0; + int count_used = 0; + xdelem* el = first; + + if(!first) { + puts("XMALLOC: No statistic available"); + } + puts("xmalloc statistic:"); + do { + if(!el->freed) { + if(el->descrl && !strstr(el->descrl, "ignore")) + printf("%s (not freed)\n", el->descrl); + else if(!el->descrl) printf("%p (not freed)\n", el->alloced); + } else { + //if(el->descrl) printf("%s (freed)\n", el->descrl); + //else printf("%p (freed)\n", el->alloced); + } + } while(el->next && (el = el->next)); +} +#endif diff --git a/libmpio/mplib/xmalloc.h b/libmpio/mplib/xmalloc.h new file mode 100644 index 0000000..ecdf1b6 --- /dev/null +++ b/libmpio/mplib/xmalloc.h @@ -0,0 +1,58 @@ +/* + * mplib - a library that enables you to edit ID3 tags + * Copyright (C) 2001,2002 Stefan Podkowinski + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __XMALLOC_H +#define __XMALLOC_H + +/* __BEGIN_DECLS should be used at the beginning of your declarations, + so that C++ compilers don't mangle their names. Use __END_DECLS at + the end of C declarations. */ +#undef __BEGIN_DECLS +#undef __END_DECLS +#ifdef __cplusplus +# define __BEGIN_DECLS extern "C" { +# define __END_DECLS } +#else +# define __BEGIN_DECLS /* empty */ +# define __END_DECLS /* empty */ +#endif + + +#define XMALLOC(type) ((type *) xmalloc(sizeof(type))) +#define XMALLOCD(type,descr) ((type *) xmallocd(sizeof(type),descr)) +#define XMALLOC0(type) ((type *) xmalloc0(sizeof(type))) +#define XMALLOCD0(type,descr) ((type *) xmallocd0(sizeof(type),descr)) + +__BEGIN_DECLS + +/* define XMALLOC_CHECK 1 */ + +void *xmalloc(size_t); +void *xmallocd(size_t, char*); +void *xmalloc0(size_t); +void *xmallocd0(size_t, char*); +void *xrealloc(void *, size_t); +void *xcalloc(size_t, size_t); +void xfree(void*); +#ifdef XMALLOC_CHECK +void xprint_malloc_stat(void); +#endif + +__END_DECLS + +#endif /* __XMALLOC_H */ diff --git a/libmpio/smartmedia.c b/libmpio/smartmedia.c deleted file mode 100644 index 9a34683..0000000 --- a/libmpio/smartmedia.c +++ /dev/null @@ -1,153 +0,0 @@ -/* -*- linux-c -*- */ - -/* - * - * $Id: smartmedia.c,v 1.3 2003/04/21 09:17:38 germeier Exp $ - * - * Library for USB MPIO-* - * - * Markus Germeier (mager@tzi.de) - * - * - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * */ - -#include -#include - -#include "smartmedia.h" -#include "debug.h" - -mpio_disk_phy_t MPIO_DISK_GEO_001={ 125, 4, 4, 2000 }; -mpio_disk_phy_t MPIO_DISK_GEO_002={ 125, 4, 8, 4000 }; -mpio_disk_phy_t MPIO_DISK_GEO_004={ 250, 4, 8, 8000 }; -mpio_disk_phy_t MPIO_DISK_GEO_008={ 250, 4, 16, 16000 }; -mpio_disk_phy_t MPIO_DISK_GEO_016={ 500, 4, 16, 32000 }; -mpio_disk_phy_t MPIO_DISK_GEO_032={ 500, 8, 16, 64000 }; -mpio_disk_phy_t MPIO_DISK_GEO_064={ 500, 8, 32, 128000 }; -mpio_disk_phy_t MPIO_DISK_GEO_128={ 500,16, 32, 256000 }; - -/* This comes from the Samsung documentation files */ - -/* a small warning: only use this function (mpio_id2mem) in the very - * beginning of MPIO model detection. After that use the values - * of size and chips! -mager - */ - -int -mpio_id2mem(BYTE id) -{ - int i=0; - - switch(id) - { - case 0xea: - i=2; - break; - case 0xe3: /* Samsung */ - case 0xe5: /* Toshiba */ - i=4; - break; - case 0xe6: - i=8; - break; - case 0x73: - i=16; - break; - case 0x75: - i=32; - break; - case 0x76: - i=64; - break; - case 0x79: - i=128; - break; - default: - debug("This should never happen (id2mem)!\n"); - exit (1); - } - return i; -} - -BYTE * -mpio_id2manufacturer(BYTE id) -{ - BYTE *m; - switch(id) - { - case 0xec: - m="Samsung"; - break; - case 0x98: - m="Toshiba"; - break; - default: - m="unknown"; - } - return m; -} - -BYTE -mpio_id_valid(BYTE id) -{ - switch(id) - { - case 0xec: /* Samsung */ - case 0x98: /* Toshiba */ - return 1; - default: - ; - } - - return 0; -} - -void -mpio_id2geo(BYTE id, mpio_disk_phy_t *geo) -{ - switch(id) - { - case 0xea: - *geo = MPIO_DISK_GEO_002; - break; - case 0xe3: /* Samsung */ - case 0xe5: /* Toshiba */ - *geo = MPIO_DISK_GEO_004; - break; - case 0xe6: - *geo = MPIO_DISK_GEO_008; - break; - case 0x73: - *geo = MPIO_DISK_GEO_016; - break; - case 0x75: - *geo = MPIO_DISK_GEO_032; - break; - case 0x76: - *geo = MPIO_DISK_GEO_064; - break; - case 0x79: - *geo = MPIO_DISK_GEO_128; - break; - default: - debug("This should never happen!\n"); - exit (1); - } - - return; -} diff --git a/libmpio/smartmedia.h b/libmpio/smartmedia.h deleted file mode 100644 index a7d6b85..0000000 --- a/libmpio/smartmedia.h +++ /dev/null @@ -1,47 +0,0 @@ -/* -*- linux-c -*- */ - -/* - * - * $Id: smartmedia.h,v 1.2 2002/10/26 13:07:43 germeier Exp $ - * - * Library for USB MPIO-* - * - * Markus Germeier (mager@tzi.de) - * - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * */ - -#ifndef _MPIO_SMARTMEDIA_H_ -#define _MPIO_SMARTMEDIA_H_ - -#include "defs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* get our configuration for SmartMedia cards right */ -int mpio_id2mem (BYTE); -BYTE * mpio_id2manufacturer(BYTE); -void mpio_id2geo(BYTE, mpio_disk_phy_t *); -BYTE mpio_id_valid(BYTE); - -#ifdef __cplusplus -} -#endif - -#endif /* _MPIO_SMARTMEDIA_H_ */ diff --git a/libmpio/src/cis.c b/libmpio/src/cis.c new file mode 100644 index 0000000..776959d --- /dev/null +++ b/libmpio/src/cis.c @@ -0,0 +1,81 @@ +/* + * + * $Id: cis.c,v 1.1 2003/04/23 08:34:14 crunchy Exp $ + * + * Library for USB MPIO-* + * + * Markus Germeier (mager@tzi.de) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * */ + +#include "cis.h" + +/* This data is CIS block (Card Information System) of the SmartMedia + * cards, it can be found here: + * http://www.samsungelectronics.com/semiconductors/flash/technical_data/application_notes/SM_format.pdf (page 8 + 9) + * or on any Smartmedia card + * + * It is not believed to be some kind of trade secret or such, so ... + * ... if we are mistaken, please tell us so. + */ + +char cis_templ[0x80] = { + 0x01, 0x03, 0xd9, 0x01, 0xff, 0x18, 0x02, 0xdf, /* 0x00 */ + 0x01, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, 0x21, + + 0x02, 0x04, 0x01, 0x22, 0x02, 0x01, 0x01, 0x22, /* 0x10 */ + 0x03, 0x02, 0x04, 0x07, 0x1a, 0x05, 0x01, 0x03, + + 0x00, 0x02, 0x0f, 0x1b, 0x08, 0xc0, 0xc0, 0xa1, /* 0x20 */ + 0x01, 0x55, 0x08, 0x00, 0x20, 0x1b, 0x0a, 0xc1, + + 0x41, 0x99, 0x01, 0x55, 0x64, 0xf0, 0xff, 0xff, /* 0x30 */ + 0x20, 0x1b, 0x0c, 0x82, 0x41, 0x18, 0xea, 0x61, + + 0xf0, 0x01, 0x07, 0xf6, 0x03, 0x01, 0xee, 0x1b, /* 0x40 */ + 0x0c, 0x83, 0x41, 0x18, 0xea, 0x61, 0x70, 0x01, + + 0x07, 0x76, 0x03, 0x01, 0xee, 0x15, 0x14, 0x05, /* 0x50 */ + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + + 0x00, 0x20, 0x20, 0x20, 0x20, 0x00, 0x30, 0x2e, /* 0x60 */ + 0x30, 0x00, 0xff, 0x14, 0x00, 0xff, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70 */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + +}; + +BYTE * +mpio_cis_gen() +{ + BYTE *p; + + p = (BYTE *)malloc(SECTOR_SIZE); + + memset(p, 0, SECTOR_SIZE); + memcpy(p, cis_templ, 0x80); + memcpy(p+0x100, cis_templ, 0x80); + + return p; + +} + + + + diff --git a/libmpio/src/cis.h b/libmpio/src/cis.h new file mode 100644 index 0000000..544d2fa --- /dev/null +++ b/libmpio/src/cis.h @@ -0,0 +1,42 @@ +/* + * + * $Id: cis.h,v 1.1 2003/04/23 08:34:14 crunchy Exp $ + * + * Library for USB MPIO-* + * + * Markus Germeier (mager@tzi.de) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * */ + +#ifndef _MPIO_CIS_H_ +#define _MPIO_CIS_H_ + +#include "defs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* generate and return a fresh CIS block */ +BYTE *mpio_cis_gen(); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libmpio/src/debug.c b/libmpio/src/debug.c new file mode 100644 index 0000000..5fd5cbe --- /dev/null +++ b/libmpio/src/debug.c @@ -0,0 +1,313 @@ +/* + * debug.c + * + * Authors: Dirk Meyer + * Andreas Büsching + * + * $Id: debug.c,v 1.1 2003/04/23 08:34:14 crunchy Exp $ + */ + +#include "debug.h" + +#include +#include +#include +#include +#include + +#define DCOLOR "_color" +#define DFILE "_file" +#define DSUFFIX "_debug" +#define LEVEL_HEXDUMP 5 + +#define CHECK_FD if (__debug_fd == NULL) return; + +char *__debug_color = NULL; +int __debug_level = 0; +FILE *__debug_fd = NULL; + +void +debug_init(void) { + char *env_var = malloc(strlen(DPACKAGE) + strlen(DFILE) + 1); + const char *env; + + /* check debug output file */ + strcpy(env_var, DPACKAGE); + strcat(env_var, DFILE); + + if ((env = getenv(env_var))) { + if (__debug_fd && fileno(__debug_fd) != -1) { + fclose(__debug_fd); + } + + __debug_fd = fopen(env, "a"); + if (!__debug_fd) { + __debug_fd = stderr; + } + } else { + __debug_fd = stderr; + } + + free(env_var); + + /* check debug level */ + env_var = malloc(strlen(DPACKAGE) + strlen(DSUFFIX) + 1); + strcpy(env_var, DPACKAGE); + strcat(env_var, DSUFFIX); + + if ((env = getenv(env_var))) + if (isdigit(env[0])) + __debug_level = strtol(env, NULL, 10); + else + __debug_level = 1; + else + __debug_level = -1; + + free(env_var); + + /* check debug color */ + env_var = malloc(strlen(DPACKAGE) + strlen(DCOLOR) + 1); + + strcpy(env_var, DPACKAGE); + strcat(env_var, DCOLOR); + + if (__debug_color) free(__debug_color); + __debug_color = NULL; + + if ((env = getenv(env_var))) { + if (env[0] != '\0') { + __debug_color = malloc(4 + strlen(env)); + sprintf(__debug_color, "\033[%sm", env); + } else + __debug_color = malloc(6); + strcpy(__debug_color, "\033[32m"); + } else { + __debug_color = NULL; + } + + free(env_var); +} + +int +debug_file(char *filename) +{ + if (__debug_fd && fileno(__debug_fd) != -1) { + fclose(__debug_fd); + } + + __debug_fd = fopen(filename, "a"); + if (!__debug_fd) { + perror("fopen:"); + __debug_fd = stderr; + return 0; + } + + return 1; +} + +int +debug_level(int level) +{ + int tmp = __debug_level; + + __debug_level = level; + + return tmp; +} + +int +debug_level_get(void) +{ + return __debug_level; +} + + +void +_hexdump (const char *package, const char* file, int line, + const char* function, const char* data, int len) +{ + char buf[17]; + int i; + + CHECK_FD; + + if (_use_debug(LEVEL_HEXDUMP)) { + fprintf (__debug_fd, "%s%s:\033[m %s(%d): %s: data=%p len=%d\n", + __debug_color, package, file, line, function, data, len); + for (i = 0; data != NULL && i < len; i++) { + if (i % 16 == 0) + fprintf(__debug_fd, "\033[30m%s:\033[m %04x: ", package, i); + fprintf(__debug_fd, "%02x ", (unsigned int)(unsigned char)data[i]); + buf[i % 16] = (data[i] >= 32 && data[i] <= 126) ? data[i] : '.'; + buf[i % 16 + 1] = '\0'; + if (i % 4 == 3) fprintf(__debug_fd, " "); + if (i % 16 == 15) fprintf(__debug_fd, "%s\n", buf); + } + if (i % 16 != 0) { + for (; i % 16 != 0; i++) + fprintf (__debug_fd, (i % 4 == 3) ? " " : " "); + fprintf(__debug_fd, "%s\n", buf); + } + } +} + +void +_hexdump_n (const char *package, const int n, const char* file, int line, + const char* function, const char* data, int len) +{ + char buf[17]; + int i; + + CHECK_FD; + + if (_use_debug(n)) { + fprintf (__debug_fd, "%s%s:\033[m %s(%d): %s: data=%p len=%d\n", + __debug_color, package, file, line, function, data, len); + for (i = 0; data != NULL && i < len; i++) { + if (i % 16 == 0) + fprintf(__debug_fd, "\033[30m%s:\033[m %04x: ", package, i); + fprintf(__debug_fd, "%02x ", (unsigned int)(unsigned char)data[i]); + buf[i % 16] = (data[i] >= 32 && data[i] <= 126) ? data[i] : '.'; + buf[i % 16 + 1] = '\0'; + if (i % 4 == 3) fprintf(__debug_fd, " "); + if (i % 16 == 15) fprintf(__debug_fd, "%s\n", buf); + } + if (i % 16 != 0) { + for (; i % 16 != 0; i++) + fprintf (__debug_fd, (i % 4 == 3) ? " " : " "); + fprintf(__debug_fd, "%s\n", buf); + } + } +} + + +void +_hexdump_text (const char *text, + const char *package, const char *file, int line, + const char *function, const char *data, int len) +{ + CHECK_FD; + + if (_use_debug(LEVEL_HEXDUMP)) { + fprintf(__debug_fd, "%s%s: %s(%d): %s: %s\033[m", __debug_color, + package, file, line, function, text); + _hexdump(package, file, line, function, data, len); + } +} + + + +void +_error(const char *package, const char *file, int line, + const char *function, int fatal, const char *format, ...) +{ + char foo[2048]; + va_list ap; + + CHECK_FD; + + va_start(ap, format); + + + vsnprintf(foo, sizeof(foo) - strlen(format) - 1, format, ap); + if (_use_debug(0)) + fprintf(__debug_fd, "\033[31m%s: %s(%d): %s: %s\033[m", + package, file, line, function, foo); + else + fprintf(__debug_fd, "%s: %s(%d): %s: %s", + package, file, line, function, foo); + fflush(__debug_fd); + + if (fatal) { + fprintf(__debug_fd, "\033[31mfatal error -- exit programm\033[m\n"); + exit(1); + } + + va_end(ap); +} + +void +_debug(const char *package, const char *file, int line, + const char *function, const char *format, ...) +{ + char foo[2048]; + va_list ap; + va_start(ap, format); + + CHECK_FD; + + vsnprintf(foo, sizeof(foo) - strlen(format) - 1, format, ap); + + if (_use_debug(0)) { + fprintf(__debug_fd, "%s%s: %s(%d): %s: %s\033[m", + ( __debug_color ? __debug_color : ""), + package, file, line, function, foo); + fflush(__debug_fd); + } + + va_end(ap); +} + +void +_debug_n(const char *package, const int n, const char *file, + int line, const char *function, const char *format, ...) +{ + char foo[2048]; + va_list ap; + va_start(ap, format); + + CHECK_FD; + + vsnprintf(foo, sizeof(foo) - strlen(format) - 1, format, ap); + + if (_use_debug(n)) { + fprintf(__debug_fd, "%s%s: %s(%d): %s: %s\033[m", + ( __debug_color ? __debug_color : ""), + package, file, line, function, foo); + fflush(__debug_fd); + } + + va_end(ap); +} + +void +_octetstr(const char *package, const char *file, int line, + const char *function, const uint8_t *str, + const unsigned int len, const char *what) +{ + CHECK_FD; + + if (_use_debug(LEVEL_HEXDUMP)) { + unsigned int i; + + fprintf(__debug_fd, "%s%s: %s(%d): %s: ", + package, file, function, line, (what?what:"")); + for (i = 0; i < len; i++) { + if (i < (len - 1)) + fprintf(__debug_fd, "%03d.", str [i]); + else + fprintf(__debug_fd, "%03d", str [i]); + } + } +} + +int +_use_debug(int level) +{ + if (__debug_level == -1) return 0; + + CHECK_FD; + + if (level <= __debug_level) { + return 1; + } + + return 0; +} + +/* end of debug.c */ + + + + + diff --git a/libmpio/src/debug.h b/libmpio/src/debug.h new file mode 100644 index 0000000..8f5ff7e --- /dev/null +++ b/libmpio/src/debug.h @@ -0,0 +1,110 @@ +/* + * debug.h + * + * Author: Dirk Meyer + * Andreas Büsching + * + * $Id: debug.h,v 1.1 2003/04/23 08:34:14 crunchy Exp $ + */ + +#ifndef _MPIO_DEBUG_H_ +#define _MPIO_DEBUG_H_ + +// if DPACKAGE is not definied use PACKAGE or "unknown" + +#ifndef DPACKAGE + +#ifdef PACKAGE +#define DPACKAGE PACKAGE +#else +#define DPACKAGE unknown +#endif + +#endif + +#include + +#ifdef sun +#include +#else +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef PBOOL +#define PBOOL(x) (x)?"True":"False" +#endif + +#define UNUSED(x) (x = x) + +#define debugn(n,args...) \ + _debug_n(DPACKAGE, n, __FILE__, __LINE__, __FUNCTION__, args) + +#define debug(args...) \ + _debug(DPACKAGE, __FILE__, __LINE__, __FUNCTION__, args) + +#define debug_error(fatal,args...) \ + _error(DPACKAGE, __FILE__, __LINE__, __FUNCTION__, fatal, args) + +#define hexdump(data,len) \ + _hexdump(DPACKAGE, __FILE__, __LINE__, __FUNCTION__, data, len) + +#define hexdumpn(n,data,len) \ + _hexdump_n(DPACKAGE, n, __FILE__, __LINE__, __FUNCTION__, data, len) + +#define hexdump_text(text,data,len) \ + _hexdump_text(text, DPACKAGE, __FILE__, __LINE__, __FUNCTION__, data, len) + +#define octetstrdump(data,len) \ + _octetstr(DPACKAGE, __FILE__, __LINE__, __FUNCTION__, data, len) + +#define ipadr_dump(data,len,text) \ + _octetstr(DPACKAGE, __FILE__, __LINE__, __FUNCTION__, data, len, text) + +#define use_debug() \ + use_debug(DPACKAGE) + + +#define with_special_debug(what) \ + _use_debug(DPACKAGE, what) + +void debug_init(void); +int debug_file(char *filename); +int debug_level(int level); +int debug_level_get(void); + +void _debug(const char *package, const char* file, int line, + const char* function, const char *format, ...); + +void _debug_n(const char *package, const int n, const char* file, + int line, const char* function, const char *format, ...); + +void _hexdump (const char *package, const char* file, int line, + const char* function, const char* data, int len); + +void _hexdump_n (const char *package, const int n, const char* file, int line, + const char* function, const char* data, int len); + +void _hexdump_text (const char *text, + const char *package, const char* file, int line, + const char* function, const char* data, int len); + +void _error(const char *package, const char* file, int line, + const char* function, int fatal, const char *format, ...); + +void _octetstr(const char *package, const char* file, int line, + const char* function, const uint8_t *str, + const unsigned int len, const char *what); + +int _use_debug(int level); + +#ifdef __cplusplus +} +#endif + +#endif /* _MPIO_DEBUG_H_ */ + +/* end of debug.h */ diff --git a/libmpio/src/defs.h b/libmpio/src/defs.h new file mode 100644 index 0000000..f676e23 --- /dev/null +++ b/libmpio/src/defs.h @@ -0,0 +1,334 @@ +/* -*- linux-c -*- */ + +/* + * $Id: defs.h,v 1.1 2003/04/23 08:34:14 crunchy Exp $ + * + * Library for USB MPIO-* + * + * Markus Germeier (mager@tzi.de) + * + * uses code from mpio_stat.c by + * Yuji Touya (salmoon@users.sourceforge.net) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * */ + +#ifndef _MPIO_DEFS_H_ +#define _MPIO_DEFS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned char BYTE; +typedef unsigned short WORD; +typedef unsigned int DWORD; + +/* Memory selection */ +typedef enum { MPIO_INTERNAL_MEM = 0x01, + MPIO_EXTERNAL_MEM = 0x10 } mpio_mem_t; + +/* model type */ +typedef enum { MPIO_MODEL_DME = 0x00, + MPIO_MODEL_DMG = 0x01, + MPIO_MODEL_DMG_PLUS = 0x02, + MPIO_MODEL_DMB = 0x03, + MPIO_MODEL_DMB_PLUS = 0x04, + MPIO_MODEL_DMK = 0x05, + MPIO_MODEL_FD100 = 0x06, + MPIO_MODEL_FL100 = 0x07, + MPIO_MODEL_FY100 = 0x08, + MPIO_MODEL_UNKNOWN = 0x09 } mpio_model_t; + +/* USB commands */ +typedef enum { GET_VERSION = 0x01, + GET_BLOCK = 0x02, + PUT_SECTOR = 0x03, + DEL_BLOCK = 0x04, + GET_SECTOR = 0x06, + GET_SPARE_AREA = 0x07, + PUT_BLOCK = 0x08, + MODIFY_FIRMWARE = 0xa0 } mpio_cmd_t; + +/* file types on internal memory */ +/* found in the code of salmoon, are these needed? -mager */ +typedef enum { FTYPE_CHAN = 0x00, + FTYPE_MUSIC = 0x01, + FTYPE_CONF = 'C', + FTYPE_FONT = 'F', + FTYPE_OTHER = 'H', + FTYPE_MEMO = 'M', + FTYPE_WAV = 'V', + FTYPE_ENTRY = 'R', + FTYPE_DIR = 'D', + FTYPE_PLAIN = '-'} mpio_filetype_t; + +/* fixed filenames */ +#define MPIO_CONFIG_FILE "CONFIG.DAT" +#define MPIO_CHANNEL_FILE "FMCONFIG.DAT" +#define MPIO_MPIO_RECORD "MPIO RECORD" + +/* type of callback functions */ +typedef BYTE (*mpio_callback_t)(int, int) ; +typedef BYTE (*mpio_callback_init_t)(mpio_mem_t, int, int) ; + +/* zone lookup table */ +#define MPIO_ZONE_MAX 8 /* 8* 16MB = 128MB */ +#define MPIO_ZONE_PBLOCKS 1024 /* physical blocks per zone */ +#define MPIO_ZONE_LBLOCKS 1000 /* logical blocks per zone */ +typedef DWORD mpio_zonetable_t[MPIO_ZONE_MAX][MPIO_ZONE_PBLOCKS]; + +#define MPIO_BLOCK_FREE 0xffff +#define MPIO_BLOCK_DEFECT 0xffee +#define MPIO_BLOCK_CIS 0xaaaa +#define MPIO_BLOCK_NOT_FOUND 0xcccccccc + +/* filenames */ +#define MPIO_FILENAME_LEN 129 +typedef BYTE mpio_filename_t[MPIO_FILENAME_LEN]; + +#ifndef NULL +#define NULL 0 +#endif + +#define MPIO_DEVICE "/dev/usb/mpio" +#define MPIO_CHARSET "ISO-8859-15" + +#define MPIO_ID3_FORMAT "%p - %t" + +#define SECTOR_SIZE 0x200 +#define SECTOR_ECC 0x040 +#define SECTOR_TRANS (SECTOR_SIZE + SECTOR_ECC) + +#define BLOCK_SECTORS 0x20 /* 0x10 8MB Smartmedia :salmoon */ +#define BLOCK_SIZE (SECTOR_SIZE * BLOCK_SECTORS) +#define BLOCK_TRANS (BLOCK_SIZE + (SECTOR_ECC * BLOCK_SECTORS)) + +#define DIR_NUM 0x10 +#define DIR_SIZE (SECTOR_SIZE*DIR_NUM) +#define DIR_ENTRY_SIZE 0x20 + +#define SMALL_MEM 0x02 + +#define CMD_SIZE 0x40 + +#define INFO_LINE 129 + +/* error codes */ +typedef struct { + int id; + char *msg; +} mpio_error_t; + +#define MPIO_OK 0 +#define MPIO_ERR_FILE_NOT_FOUND -1 +#define MPIO_ERR_NOT_ENOUGH_SPACE -2 +#define MPIO_ERR_FILE_EXISTS -3 +#define MPIO_ERR_FAT_ERROR -4 +#define MPIO_ERR_READING_FILE -5 +#define MPIO_ERR_PERMISSION_DENIED -6 +#define MPIO_ERR_WRITING_FILE -7 +#define MPIO_ERR_DIR_TOO_LONG -8 +#define MPIO_ERR_DIR_NOT_FOUND -9 +#define MPIO_ERR_DIR_NOT_A_DIR -10 +#define MPIO_ERR_DIR_NAME_ERROR -11 +#define MPIO_ERR_DIR_NOT_EMPTY -12 +#define MPIO_ERR_DEVICE_NOT_READY -13 +#define MPIO_ERR_OUT_OF_MEMORY -14 +#define MPIO_ERR_INTERNAL -15 +/* internal errors, occur when UI has errors! */ +#define MPIO_ERR_INT_STRING_INVALID -101 + +/* get formatted information, about the MPIO player */ + +typedef struct { + BYTE firmware_id[INFO_LINE]; + BYTE firmware_version[INFO_LINE]; + BYTE firmware_date[INFO_LINE]; + + BYTE model[INFO_LINE]; + + BYTE mem_internal[INFO_LINE]; + BYTE mem_external[INFO_LINE]; + +} mpio_info_t; + +/* view of the MPIO firmware */ +typedef struct { + /* everything we get from GET_VERSION */ + BYTE id[12]; + BYTE major[3]; + BYTE minor[3]; + BYTE year[5]; + BYTE month[3]; + BYTE day[3]; +} mpio_firmware_t; + +/* */ +typedef struct { + DWORD NumCylinder; + DWORD NumHead; + DWORD NumSector; + DWORD SumSector; +} mpio_disk_phy_t; + +/* */ + +struct mpio_directory_tx { + BYTE name[INFO_LINE]; + BYTE dir[BLOCK_SIZE]; + + BYTE *dentry; + + struct mpio_directory_tx *prev; + struct mpio_directory_tx *next; + +}; +typedef struct mpio_directory_tx mpio_directory_t; + + +/* view of a SmartMedia(tm) card */ +typedef struct { + BYTE id; + BYTE manufacturer; + WORD size; /* MB */ + BYTE chips; /* this is the hack for + MPIO internal representation, because + there might be up to four chips involved */ + + /* only needed for external SmartMedia cards */ + mpio_disk_phy_t geo; + + BYTE cis[SECTOR_SIZE]; + BYTE mbr[SECTOR_SIZE]; /* Master Boot Record */ + BYTE pbr[SECTOR_SIZE]; /* Partition Boot Record */ + + int pbr_offset; /* sector offset for the PBR */ + int fat_offset; /* sector offset for the FAT */ + int dir_offset; + + /* these are needed for internal and external cards */ + int max_cluster; /* # of clusters actually available */ + int fat_size; /* # sectors for FAT */ + int fat_nums; /* # of FATs */ + BYTE * fat; /* *real FAT (like in block allocation :-) */ + + /* needed for directory support */ + mpio_directory_t *root; /* root directory */ + mpio_directory_t *cdir; /* current directory */ + + /* how many physical blocks are available + * for internal memory is this value equal to max_cluster + */ + int max_blocks; + BYTE * spare; + + /* lookup table for phys.<->log. block mapping */ + mpio_zonetable_t zonetable; + +} mpio_smartmedia_t; + +/* health status of a memory "card" */ +typedef struct { + WORD total; /* total blocks on "card" */ + WORD spare; /* (available spare blocks */ + WORD broken; /* broken blocks */ +} mpio_health_single_t; + +typedef struct { + BYTE num; /* number of chips or zones */ + /* internal: max 4 chips + * external: max 8 zones (128MB) -> max 8 */ + mpio_health_single_t data[8]; +} mpio_health_t; + +/* view of the MPIO-* */ +typedef struct { + BYTE version[CMD_SIZE]; + + int fd; + BYTE *charset; /* charset used for filename conversion */ + + BYTE id3; /* enable/disable ID3 rewriting support */ + BYTE id3_format[INFO_LINE]; + BYTE id3_temp[INFO_LINE]; + + mpio_firmware_t firmware; + + mpio_model_t model; + + mpio_smartmedia_t internal; + mpio_smartmedia_t external; +} mpio_t; + +typedef struct { + mpio_t *m; + BYTE mem; /* internal/external memory */ + + DWORD entry; /* number of FAT entry */ + + /* internal */ + BYTE i_index; /* file index of file to store */ + BYTE i_fat[16]; /* internal FAT entry */ + + /* external */ + DWORD e_sector; /* logical startsector of cluster */ + + /* mapping to HW (== block address) */ + DWORD hw_address; /* 3 bytes block addressing + 1 byte chip */ + +} mpio_fatentry_t; + + +/* these are copied from: + * http://www.linuxhq.com/kernel/v2.4/doc/filesystems/vfat.txt.html + * + */ + +typedef struct { // Short 8.3 names + unsigned char name[8]; // file name + unsigned char ext[3]; // file extension + unsigned char attr; // attribute byte + unsigned char lcase; // Case for base and extension + unsigned char ctime_ms; // Creation time, milliseconds + unsigned char ctime[2]; // Creation time + unsigned char cdate[2]; // Creation date + unsigned char adate[2]; // Last access date + unsigned char reserved[2]; // reserved values (ignored) + unsigned char time[2]; // time stamp + unsigned char date[2]; // date stamp + unsigned char start[2]; // starting cluster number + unsigned char size[4]; // size of the file +} mpio_dir_entry_t; + +typedef struct { // Up to 13 characters of a long name + unsigned char id; // sequence number for slot + unsigned char name0_4[10]; // first 5 characters in name + unsigned char attr; // attribute byte + unsigned char reserved; // always 0 + unsigned char alias_checksum; // checksum for 8.3 alias + unsigned char name5_10[12]; // 6 more characters in name + unsigned char start[2]; // starting cluster number + unsigned char name11_12[4]; // last 2 characters in name +} mpio_dir_slot_t; + +#ifdef __cplusplus +} +#endif + +#endif /* _MPIO_DEFS_H_ */ + diff --git a/libmpio/src/directory.c b/libmpio/src/directory.c new file mode 100644 index 0000000..fe8464c --- /dev/null +++ b/libmpio/src/directory.c @@ -0,0 +1,1318 @@ +/* + * + * $Id: directory.c,v 1.1 2003/04/23 08:34:14 crunchy Exp $ + * + * Library for USB MPIO-* + * + * Markus Germeier (mager@tzi.de) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * */ + +#include +#include + +#include "debug.h" +#include "io.h" +#include "mpio.h" +#include "directory.h" +#include + +#define UNICODE "UNICODELITTLE" + +/* the following function is copied from the linux kernel v2.4.18 + * file:/usr/src/linux/fs/fat/misc.c + * it was written by Werner Almesberger and Igor Zhbanov + * and is believed to be GPL + */ + +/* Linear day numbers of the respective 1sts in non-leap years. */ + +static int day_n[] = { 0,31,59,90,120,151,181,212,243,273,304,334,0,0,0,0 }; + /* JanFebMarApr May Jun Jul Aug Sep Oct Nov Dec */ + +/* Convert a MS-DOS time/date pair to a UNIX date (seconds since 1 1 70). */ + +int date_dos2unix(unsigned short time,unsigned short date) +{ + int month,year,secs; + struct timezone sys_tz; + struct timeval tv; + + gettimeofday(&tv, &sys_tz); + + /* first subtract and mask after that... Otherwise, if + date == 0, bad things happen */ + month = ((date >> 5) - 1) & 15; + year = date >> 9; + secs = (time & 31)*2+60*((time >> 5) & 63)+(time >> 11)*3600+86400* + ((date & 31)-1+day_n[month]+(year/4)+year*365-((year & 3) == 0 && + month < 2 ? 1 : 0)+3653); + /* days since 1.1.70 plus 80's leap day */ + secs += sys_tz.tz_minuteswest*60; + return secs; +} + +/* + * charset for filename encoding/converting + */ +BYTE * +mpio_charset_get(mpio_t *m) +{ + return strdup(m->charset); +} + +BYTE +mpio_charset_set(mpio_t *m, BYTE *charset) +{ + iconv_t ic; + int r = 1; + + ic = iconv_open(UNICODE, charset); + if (ic < 0) + r=0; + iconv_close(ic); + + ic = iconv_open(charset, UNICODE); + if (ic < 0) + r=0; + iconv_close(ic); + + if (r) + { + debugn(2, "setting new charset to: \"%s\"\n", charset); + free(m->charset); + m->charset=strdup(charset); + } else { + debugn(2, "could not set charset to: \"%s\"\n", charset); + } + + return r; +} + +int +mpio_directory_init(mpio_t *m, mpio_mem_t mem, mpio_directory_t *dir, + WORD self, WORD parent) +{ + mpio_dir_entry_t *dentry; + + memset(dir->dir, 0, BLOCK_SIZE); + memset(dir->dir, 0x20, 11); + memset(dir->dir+0x20, 0x20, 11); + + dentry = (mpio_dir_entry_t *)dir->dir; + + strncpy(dentry->name, ". ", 8); + strncpy(dentry->ext, " ", 3); + dentry->start[0] = self & 0xff; + dentry->start[1] = self / 0x100; + dentry->attr = 0x10; + + dentry++; + strncpy(dentry->name, ".. ", 8); + strncpy(dentry->ext, " ", 3); + dentry->start[0] = parent & 0xff; + dentry->start[1] = parent / 0x100; + dentry->attr = 0x10; + + hexdumpn(2, dir->dir, 64); + + return 0; +} + + +int +mpio_directory_read(mpio_t *m, mpio_mem_t mem, mpio_directory_t *dir) +{ + mpio_fatentry_t *f = 0; + + f = mpio_dentry_get_startcluster(m, mem, dir->dentry); + + if (!f) + { + debug("something bad has happened here!"); + exit (-1); + } + + mpio_io_block_read(m, mem, f, dir->dir); + + hexdumpn(5, dir->dir, DIR_SIZE); + + return 0; +} + +BYTE +mpio_directory_is_empty(mpio_t *m, mpio_mem_t mem, mpio_directory_t *dir) +{ + mpio_dir_entry_t *dentry; + BYTE r; + + dentry = (mpio_dir_entry_t *)dir->dir; + dentry += 2; + + r = MPIO_OK; + if (dentry->name[0] != 0x00) + r = !r; + + return r; +} + + +int +mpio_directory_write(mpio_t *m, mpio_mem_t mem, mpio_directory_t *dir) +{ + mpio_fatentry_t *f = 0; + + f = mpio_dentry_get_startcluster(m, mem, dir->dentry); + if (!f) + { + debug("something bad has happened here!"); + exit (-1); + } + + if (mem==MPIO_INTERNAL_MEM) + { + f->i_fat[0x01]= f->i_index; + if (m->model >= MPIO_MODEL_FD100) + f->i_fat[0x0e] = f->i_index; + + /* only one block needed for directory */ + f->i_fat[0x02]=0; + f->i_fat[0x03]=1; + + /* set type to directory */ + f->i_fat[0x06] = FTYPE_ENTRY; + + hexdumpn(2, f->i_fat, 16); + } + + mpio_io_block_delete(m, mem, f); + mpio_io_block_write(m, mem, f, dir->dir); + + return 0; +} + +/* directory operations */ +BYTE * +mpio_directory_open(mpio_t *m, mpio_mem_t mem) +{ + BYTE *out; + if (mem == MPIO_EXTERNAL_MEM) { + if (m->external.id) { + out = m->external.cdir->dir; + } else { + return NULL; + } + } else { + out = m->internal.cdir->dir; + } + + if (out[0] == 0x00) + { + debugn(3, "directory is empty\n"); + return NULL; + } + + debugn(3, "first dentry: %08x\n", out); + + return out; +} + +int +mpio_directory_make(mpio_t *m, mpio_mem_t mem, BYTE *dir) +{ + mpio_smartmedia_t *sm; + mpio_directory_t *new; + mpio_fatentry_t *f, *current; + WORD self, parent; + struct tm tt; + time_t curr; + + if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + + if ((strcmp(dir, "..") == 0) || + (strcmp(dir, ".") == 0)) + { + debugn(2, "directory name not allowed: %s\n", dir); + return MPIO_ERR_DIR_NAME_ERROR; + } + + /* find free sector */ + f = mpio_fatentry_find_free(m, mem, FTYPE_ENTRY); + if (!f) + { + debug("could not free cluster for file!\n"); + return (MPIO_ERR_FAT_ERROR); + } else { + self=f->entry; + } + + /* find file-id for internal memory */ + if (mem==MPIO_INTERNAL_MEM) + { + f->i_index=mpio_fat_internal_find_fileindex(m); + debugn(2, "fileindex: %02x\n", f->i_index); + f->i_fat[0x01]= f->i_index; + if (m->model >= MPIO_MODEL_FD100) + f->i_fat[0x0e] = f->i_index; + self = f->i_index; + + /* only one block needed for directory */ + f->i_fat[0x02]=0; + f->i_fat[0x03]=1; + hexdumpn(2, f->i_fat, 16); + } + + if (sm->cdir == sm->root) + { + parent=0; + } else { + current = mpio_dentry_get_startcluster(m, mem, sm->cdir->dentry); + if (mem==MPIO_INTERNAL_MEM) + { + parent = current->i_index; + } else { + parent = current->entry; + } + } + + + new = malloc(sizeof(mpio_directory_t)); + mpio_directory_init(m, mem, new, self, parent); + + mpio_fatentry_set_eof(m ,mem, f); + mpio_io_block_write(m, mem, f, new->dir); + time(&curr); + tt = * localtime(&curr); + mpio_dentry_put(m, mem, + dir, strlen(dir), + mktime(&tt), + 0, self, 0x10); + + free(new); + + return MPIO_OK; +} + +int +mpio_directory_cd(mpio_t *m, mpio_mem_t mem, BYTE *dir) +{ + mpio_smartmedia_t *sm; + BYTE *p; + BYTE month, day, hour, minute, type; + BYTE fname[100]; + WORD year; + DWORD fsize; + int i, size; + BYTE pwd[INFO_LINE]; + mpio_directory_t *old, *new; + + if (strcmp(dir, ".")==0) + return MPIO_OK; + + if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + + if (strcmp(dir, "..") == 0) + { + if (sm->cdir->prev) + { + old = sm->cdir; + sm->cdir = sm->cdir->prev; + sm->cdir->next = NULL; + free(old); + } + + return MPIO_OK; + } + + mpio_directory_pwd(m, mem, pwd); + + if ((strlen(pwd) + strlen(dir) + 2) > INFO_LINE) + { + debugn(2, "directory name gets to long!\n"); + return MPIO_ERR_DIR_TOO_LONG; + } + + + p = mpio_dentry_find_name(m, mem, dir); + + /* second try */ + if (!p) + p = mpio_dentry_find_name_8_3(m, mem, dir); + + if (!p) + { + debugn(2, "could not find directory: %s\n", dir); + return MPIO_ERR_DIR_NOT_FOUND; + } + + mpio_dentry_get(m, mem, p, + fname, 100, + &year, &month, &day, + &hour, &minute, &fsize, + &type); + + if (type != FTYPE_DIR) + { + debugn(2, "this is not a directory: %s\n", dir); + return MPIO_ERR_DIR_NOT_A_DIR; + } + + new = malloc(sizeof(mpio_directory_t)); + strcpy(new->name, dir); + new->next = NULL; + new->prev = sm->cdir; + new->dentry = p; + sm->cdir->next = new; + sm->cdir = new; + + mpio_directory_pwd(m, mem, pwd); + + if (strcmp(dir, "/") != 0) + { + /* read new directory */ + size=mpio_directory_read(m, mem, sm->cdir); + } + + return MPIO_OK; + +} + + +void +mpio_directory_pwd(mpio_t *m, mpio_mem_t mem, BYTE pwd[INFO_LINE]) +{ + mpio_smartmedia_t *sm; + mpio_directory_t *d; + + if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + + d = sm->root->next; + pwd[0] = 0; + + if (!d) + strcat(pwd, "/"); + + while (d) + { + strcat(pwd, "/"); + debugn(2, "name: %s\n", d->name); + strcat(pwd, d->name); + d = d->next; + } + + return; +} + +mpio_dir_entry_t * +mpio_dentry_filename_write(mpio_t *m, mpio_mem_t mem, BYTE *p, + BYTE *filename, int filename_size) +{ + BYTE *unicode = 0; + BYTE *back, *fback; + BYTE *fname = 0; + iconv_t ic; + int in = 0, out = 0; + int fin = 0, fout = 0; + int count = 0; + BYTE index; + BYTE f_8_3[13]; + mpio_dir_slot_t *slot; + mpio_dir_entry_t *dentry; + int i, j, points; + + /* generate vfat filename in UNICODE */ + ic = iconv_open(UNICODE, m->charset); + fin = in = filename_size + 1; + fout = out = filename_size * 2 + 2 + 26; + fname = malloc(in); + fback = fname; + unicode = malloc(out); + back = unicode; + + memset(fname, 0, in); + snprintf(fname, in, "%s", filename); + memset(unicode, 0xff, out); + iconv(ic, (char **)&fback, &fin, (char **)&back, &fout); + iconv_close(ic); + hexdump(fname, in); + hexdump(unicode, out); + + back = unicode; + + count = filename_size / 13; + if (filename_size % 13) + count++; + + slot = (mpio_dir_slot_t *)p; + + index = 0x40 + count; + while (count > 0) { + mpio_dentry_copy_to_slot(back + ((count - 1) * 26), slot); + hexdump((char *)back + ((count - 1) * 26), 0x20); + slot->id = index; + slot->attr = 0x0f; + slot->reserved = 0x00; + slot->start[0] = 0x00; + slot->start[1] = 0x00; + /* FIXME: */ + slot->alias_checksum = 0x00; // checksum for 8.3 alias + + hexdump((char *)slot, 0x20); + + slot++; + count--; + index = count; + } + +/* memcpy(p, m->internal.dir+0x220, 0x20); */ + +/* p+=0x20; */ + dentry = (mpio_dir_entry_t *)slot; + + /* find uniq 8.3 filename */ + memset(f_8_3, 0x20, 12); + f_8_3[8]='.'; + f_8_3[12]=0x00; + + i=0; + points=0; + /* count points to later find the correct file extension */ + while (i<(strlen(filename))) + { + if (filename[i] == '.') + points++; + i++; + } + + /* if we do not find any points we set the value ridiculously high, + then everything falls into place */ + if (!points) + points=1024*1024; + + i=j=0; + while ((j<8) && (points) && (i<(strlen(filename)))) + { + if (filename[i] == '.') + { + points--; + } else { + if (filename[i]!=' ') { + f_8_3[j] = toupper(filename[i]); + j++; + } + } + i++; + } + + j=i; + while((points) && (j<(strlen(filename)))) + { + if (filename[j] == '.') + points--; + j++; + } + + i=9; + while ((i<12) && (j<(strlen(filename)))) + { + f_8_3[i] = toupper(filename[j]); + i++; + j++; + } + + /* This seems like a special case to me! */ + if (strcmp(MPIO_MPIO_RECORD, filename)==0) + { + f_8_3[6]='~'; + f_8_3[7]='0'; + } + + if (mpio_dentry_find_name_8_3(m, mem, f_8_3)) + { + f_8_3[6]='~'; + f_8_3[7]='1'; + } + + while(mpio_dentry_find_name_8_3(m, mem, f_8_3)) + f_8_3[7]++; + + +/* memcpy(dentry->name,"AAAAAAAA",8); */ +/* memcpy(dentry->ext,"MP3",3); */ + +/* hexdumpn(0, f_8_3, 13); */ + + memcpy(dentry->name, f_8_3, 8); + memcpy(dentry->ext, f_8_3+9, 3); + + free(unicode); + free(fname); + + return dentry; +} + + +int +mpio_dentry_get_size(mpio_t *m, mpio_mem_t mem, BYTE *buffer) +{ + mpio_dir_entry_t *dentry; + + if (!buffer) + return -1; + + UNUSED(m); + + dentry = (mpio_dir_entry_t *)buffer; + + if ((dentry->name[0] & 0x40) && + (dentry->attr == 0x0f) && + (dentry->start[0] == 0x00) && + (dentry->start[1] == 0x00)) { + dentry++; + while ((dentry->attr == 0x0f) && + (dentry->start[0] == 0x00) && + (dentry->start[1] == 0x00)) { + /* this/these are vfat slots */ + dentry++; + } + } + dentry++; + + return(((BYTE *)dentry) - buffer); +} + +BYTE* +mpio_dentry_next(mpio_t *m, mpio_mem_t mem, BYTE *buffer) +{ + int size; + BYTE *out; + + size = mpio_dentry_get_size(m, mem, buffer); + + if (size<=0) + return NULL; + + out = buffer + size; + + if (*out == 0x00) + { + debugn(3, "no more entries\n"); + return NULL; + } + + debugn(3, "next dentry: %08x\n", out); + + return out; +} + +int +mpio_dentry_get_raw(mpio_t *m, mpio_mem_t mem, BYTE *dentry, + BYTE *buffer, int bufsize) +{ + int size; + + size = mpio_dentry_get_size(m, mem, buffer); + debugn(3, "dentry size is: 0x%02x\n", size); + + if (size < 0) + return size; + + if (size > bufsize) + return -2; + + memcpy(buffer, dentry, size); + + return size; +} + +void +mpio_dentry_copy_from_slot(BYTE *buffer, mpio_dir_slot_t *slot) +{ + memcpy(buffer, slot->name0_4, 10); + memcpy(buffer + 10, slot->name5_10, 12); + memcpy(buffer + 22, slot->name11_12, 4); +} + +void +mpio_dentry_copy_to_slot(BYTE *buffer, mpio_dir_slot_t *slot) +{ + memcpy(slot->name0_4, buffer, 10); + memcpy(slot->name5_10, buffer + 10, 12); + memcpy(slot->name11_12, buffer + 22, 4); +} + +int +mpio_dentry_get(mpio_t *m, mpio_mem_t mem, BYTE *buffer, + BYTE *filename, int filename_size, + WORD *year, BYTE *month, BYTE *day, + BYTE *hour, BYTE *minute, DWORD *fsize, BYTE *type) +{ + BYTE filename_8_3[13]; + + return mpio_dentry_get_real(m, mem, buffer, filename, filename_size, + filename_8_3, + year, month, day, hour, minute, fsize, type); +} + +/* TODO: please clean me up !!! */ +int +mpio_dentry_get_real(mpio_t *m, mpio_mem_t mem, BYTE *buffer, + BYTE *filename, int filename_size, + BYTE *filename_8_3, + WORD *year, BYTE *month, BYTE *day, + BYTE *hour, BYTE *minute, DWORD *fsize, + BYTE *type) +{ + int date, time; + int vfat = 0; + int num_slots = 0; + int slots = 0; + int in = 0, out = 0, iconv_return; + mpio_dir_entry_t *dentry; + mpio_dir_slot_t *slot; + BYTE *unicode = 0; + BYTE *uc; + BYTE *fname = 0; + iconv_t ic; + int dsize, i; + + if (buffer == NULL) + return -1; + + dentry = (mpio_dir_entry_t *)buffer; + + if ((dentry->name[0] & 0x40) && + (dentry->attr == 0x0f) && + (dentry->start[0] == 0x00) && + (dentry->start[1] == 0x00)) + { + dsize = mpio_dentry_get_size(m, mem, buffer); + debugn(3, "dentry size is: 0x%02x\n", dsize); + hexdump(buffer, dsize); + num_slots = (dsize / 0x20) - 1; + slots = num_slots - 1; + dentry++; + vfat++; + in = num_slots * 26; + out = num_slots * 13; + unicode = malloc(in + 2); + memset(unicode, 0x00, (in+2)); + uc = unicode; + fname = filename; + slot = (mpio_dir_slot_t *)buffer; + mpio_dentry_copy_from_slot(unicode + (26 * slots), slot); + slots--; + + while ((dentry->attr == 0x0f) && + (dentry->start[0] == 0x00) && + (dentry->start[1] == 0x00)) + { + /* this/these are vfat slots */ + slot = (mpio_dir_slot_t *)dentry; + mpio_dentry_copy_from_slot((unicode + (26 * slots)), slot); + dentry++; + slots--; + } + } + + if (vfat) + { + ic = iconv_open(m->charset, UNICODE); + memset(fname, 0, filename_size); + hexdumpn(4, unicode, in+2); + debugn(4, "before iconv: in: %2d - out: %2d\n", in, out); + iconv_return = iconv(ic, (char **)&uc, &in, (char **)&fname, &out); + debugn(4, "after iconv: in: %2d - out: %2d (return: %d)\n", in, out, + iconv_return); + hexdumpn(4, filename, (num_slots*13)-out); + iconv_close(ic); + } + free(unicode); + + memcpy(filename_8_3, dentry->name, 8); + i=8; + while(filename_8_3[i-1]==' ') + i--; + filename_8_3[i++] = '.'; + memcpy(filename_8_3 + i, dentry->ext, 3); + i+=3; + while(filename_8_3[i-1]==' ') + i--; + filename_8_3[i] = 0; + hexdumpn(4, filename_8_3, 13); + + if (!vfat) + { + if (filename_size >= 12) + { + snprintf(filename, 13, "%s", filename_8_3); + /* UGLY !! */ + if (((strncmp(dentry->name, ". ", 8)==0) && + (strncmp(dentry->ext, " ", 3) == 0))) + filename[1]=0; + if (((strncmp(dentry->name, ".. ", 8)==0) && + (strncmp(dentry->ext, " ", 3) == 0))) + filename[2]=0; + } else { + snprintf(filename, filename_size, "%s", "ERROR"); + } + } + + date = (dentry->date[1] * 0x100) + dentry->date[0]; + *year = date / 512 + 1980; + *month = (date / 32) & 0xf; + *day = date & 0x1f; + + time = (dentry->time[1] * 0x100) + dentry->time[0]; + *hour = time / 2048; + *minute= (time / 32) & 0x3f; + + *fsize = dentry->size[3]; + *fsize *= 0x100; + *fsize += dentry->size[2]; + *fsize *= 0x100; + *fsize += dentry->size[1]; + *fsize *= 0x100; + *fsize += dentry->size[0]; + + if (dentry->attr & 0x10) { + /* is this a directory? */ + *type = FTYPE_DIR; + } else { + *type = FTYPE_PLAIN; + } + + return(((BYTE *)dentry) - buffer); +} + +/* read "size" sectors of fat into the provided buffer */ +int +mpio_rootdir_read (mpio_t *m, mpio_mem_t mem) +{ + mpio_smartmedia_t *sm; + BYTE recvbuff[SECTOR_SIZE]; + int i; + + if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + + for (i = 0; i < DIR_NUM; i++) { + if (mpio_io_sector_read(m, mem, (sm->dir_offset + i), recvbuff)) + return 1; + + memcpy(sm->root->dir + (i * SECTOR_SIZE), recvbuff, SECTOR_SIZE); + } + + return (0); +} + +int +mpio_rootdir_clear (mpio_t *m, mpio_mem_t mem) +{ + mpio_smartmedia_t *sm; + + if (mem == MPIO_INTERNAL_MEM) sm=&m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm=&m->external; + + memset(sm->root->dir, 0x00, DIR_SIZE); + + return 0; +} + +BYTE +mpio_dentry_is_dir(mpio_t *m, mpio_mem_t mem, BYTE *p) +{ + int s; + mpio_dir_entry_t *dentry; + BYTE r; + + s = mpio_dentry_get_size(m, mem, p); + s -= DIR_ENTRY_SIZE ; + + dentry = (mpio_dir_entry_t *)p; + + while (s != 0) { + dentry++; + s -= DIR_ENTRY_SIZE ; + } + + if (dentry->attr & 0x10) { + r = MPIO_OK; + } else { + r= !MPIO_OK; + } + + return r; +} + +int +mpio_dentry_get_filesize(mpio_t *m, mpio_mem_t mem, BYTE *p) +{ + int s; + int fsize; + mpio_dir_entry_t *dentry; + + s = mpio_dentry_get_size(m, mem, p); + s -= DIR_ENTRY_SIZE ; + + dentry = (mpio_dir_entry_t *)p; + + while (s != 0) { + dentry++; + s -= DIR_ENTRY_SIZE ; + } + + if (dentry->attr & 0x10) { + fsize = BLOCK_SIZE; + } else { + fsize = dentry->size[3]; + fsize *= 0x100; + fsize += dentry->size[2]; + fsize *= 0x100; + fsize += dentry->size[1]; + fsize *= 0x100; + fsize += dentry->size[0]; + } + + return fsize; +} + +long +mpio_dentry_get_time(mpio_t *m, mpio_mem_t mem, BYTE *p) +{ + int s; + mpio_dir_entry_t *dentry; + + s = mpio_dentry_get_size(m, mem, p); + s -= DIR_ENTRY_SIZE ; + + dentry = (mpio_dir_entry_t *)p; + + while (s != 0) { + dentry++; + s -= DIR_ENTRY_SIZE ; + } + + + return date_dos2unix((dentry->time[0]+dentry->time[1]*0x100), + (dentry->date[0]+dentry->date[1]*0x100)); +} + + + +mpio_fatentry_t * +mpio_dentry_get_startcluster(mpio_t *m, mpio_mem_t mem, BYTE *p) +{ + int s; + DWORD cluster; + BYTE i_index; + mpio_dir_slot_t *dentry; + mpio_fatentry_t *new; + + s = mpio_dentry_get_size(m, mem, p); + s -= DIR_ENTRY_SIZE ; + + dentry = (mpio_dir_slot_t *)p; + + while (s != 0) { + dentry++; + s -= DIR_ENTRY_SIZE ; + } + + cluster = dentry->start[1] * 0x100 + dentry->start[0]; + + if (mem == MPIO_INTERNAL_MEM) + { + i_index=dentry->start[0]; + cluster = mpio_fat_internal_find_startsector(m, cluster); + } + if (cluster < 0) + return NULL; + + new = mpio_fatentry_new(m, mem, cluster, FTYPE_MUSIC); + + if (mem == MPIO_INTERNAL_MEM) + { + new->entry=cluster; + new->i_index=i_index; + mpio_fatentry_entry2hw(m, new); + } + + debugn(2,"i_index=0x%02x\n", new->i_index); + + return new; +} + +int +mpio_dentry_put(mpio_t *m, mpio_mem_t mem, + BYTE *filename, int filename_size, + time_t date, DWORD fsize, WORD ssector, BYTE attr) +{ + BYTE *p; + mpio_dir_entry_t *dentry; + + /* read and copied code from mtools-3.9.8/directory.c + * to make this one right + */ + struct tm *now; + time_t date2 = date; + unsigned char hour, min_hi, min_low, sec; + unsigned char year, month_hi, month_low, day; + + + p = mpio_directory_open(m, mem); + if (p) { + while (*p != 0x00) + p += 0x20; + } else { + if (mem == MPIO_EXTERNAL_MEM) + p = m->external.cdir->dir; + if (mem == MPIO_INTERNAL_MEM) + p = m->internal.cdir->dir; + } + + dentry = mpio_dentry_filename_write(m, mem, p, filename, filename_size); + + dentry->attr = attr; + dentry->lcase = 0x00; + + /* read and copied code from mtools-3.9.8/directory.c + * to make this one right + */ + now = localtime(&date2); + dentry->ctime_ms = 0; + hour = now->tm_hour << 3; + min_hi = now->tm_min >> 3; + min_low = now->tm_min << 5; + sec = now->tm_sec / 2; + dentry->ctime[1] = dentry->time[1] = hour + min_hi; + dentry->ctime[0] = dentry->time[0] = min_low + sec; + year = (now->tm_year - 80) << 1; + month_hi = (now->tm_mon + 1) >> 3; + month_low = (now->tm_mon + 1) << 5; + day = now->tm_mday; + dentry -> adate[1] = dentry->cdate[1] = dentry->date[1] = year + month_hi; + dentry -> adate[0] = dentry->cdate[0] = dentry->date[0] = month_low + day; + + dentry->size[0] = fsize & 0xff; + dentry->size[1] = (fsize / 0x100) & 0xff; + dentry->size[2] = (fsize / 0x10000) & 0xff; + dentry->size[3] = (fsize / 0x1000000) & 0xff; + dentry->start[0] = ssector & 0xff; + dentry->start[1] = ssector / 0x100; + + /* what do we want to return? */ + return 0; +} + +BYTE * +mpio_dentry_find_name_8_3(mpio_t *m, BYTE mem, BYTE *filename) +{ + BYTE *p; + BYTE bdummy; + WORD wdummy; + BYTE fname[129]; + BYTE fname_8_3[13]; + DWORD ddummy; + BYTE *found = 0; + int i, j, len; + + p = mpio_directory_open(m, mem); + while ((p) && (!found)) { + mpio_dentry_get_real (m, mem, p, + fname, 128, + fname_8_3, + &wdummy, &bdummy, &bdummy, + &bdummy, &bdummy, &ddummy, &bdummy); + if ((strcmp(fname_8_3, filename) == 0) && + (strcmp(filename,fname_8_3) == 0)) { + found = p; + p = NULL; + } + + p = mpio_dentry_next(m, mem, p); + } + + return found; +} + +BYTE * +mpio_dentry_find_name(mpio_t *m, BYTE mem, BYTE *filename) +{ + BYTE *p; + BYTE bdummy; + WORD wdummy; + BYTE fname[129]; + DWORD ddummy; + BYTE *found = 0; + + p = mpio_directory_open(m, mem); + while ((p) && (!found)) { + mpio_dentry_get (m, mem, p, + fname, 128, + &wdummy, &bdummy, &bdummy, + &bdummy, &bdummy, &ddummy, &bdummy); + if ((strcmp(fname,filename) == 0) && (strcmp(filename,fname) == 0)) { + found = p; + p = NULL; + } + + p = mpio_dentry_next(m, mem, p); + } + + return found; +} + + +int +mpio_dentry_delete(mpio_t *m, BYTE mem, BYTE *filename) +{ + mpio_smartmedia_t *sm; + BYTE *start; + int size; + BYTE tmp[DIR_SIZE]; + + if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + + start = mpio_dentry_find_name(m, mem, filename); + + /* second try */ + if (!start) + start = mpio_dentry_find_name_8_3(m, mem, filename); + + if (!start) { + debugn(2, "could not find file: %s\n", filename); + return 0; + } + + size = mpio_dentry_get_size(m, mem, start); + + if (size <= 0) { + debug("fatal error in mpio_dentry_delete\n"); + return 0; + } + + debugn(5, "size: %2x\n", size); + + /* clear new buffer */ + memset(tmp, 0, DIR_SIZE); + /* copy before delete */ + if (start != sm->cdir->dir) + memcpy(tmp, sm->cdir->dir, (start - (sm->cdir->dir))); + /* copy after delete */ + memcpy(tmp + (start - (sm->cdir->dir)), (start + size), + (sm->cdir->dir + DIR_SIZE - (start + size))); + + memcpy(sm->cdir->dir, tmp, DIR_SIZE); + + return 0; +} + +void +mpio_dentry_move(mpio_t *m,mpio_mem_t mem,BYTE *m_file,BYTE *a_file) { + mpio_smartmedia_t *sm; + + BYTE *t0,*t1,*t2,*t3; + + int s0,s1,s2,s3; + int m_file_s,a_file_s; + BYTE tmp[DIR_SIZE]; + BYTE *b_file; + + if (mem == MPIO_INTERNAL_MEM) + sm = &m->internal; + + if (mem == MPIO_EXTERNAL_MEM) + sm = &m->external; + + if (m_file == a_file) + return; + + m_file_s = mpio_dentry_get_size(m, mem, m_file); + a_file_s = mpio_dentry_get_size(m, mem, a_file); + + // -- we determine the 'befor' file. The start of the region which needs to be moved down + // -- if a_file == NULL this is the start of the directory. + + if(a_file==NULL) { + b_file = sm->cdir->dir; + } else { + b_file = a_file + a_file_s; + } + + if(b_file == m_file) { + return; + } + + /** We disect the whole directory in four pieces. + in different ways according to the direction + the directoy entry is moved (up or down). + */ + + if(m_file > b_file) { + fprintf(stderr,"U "); + t0 = sm->cdir->dir; + s0 = b_file - sm->cdir->dir; + + t1 = m_file; + s1 = m_file_s; + + t2 = b_file; + s2 = m_file - b_file; + + t3 = m_file + m_file_s; + s3 = DIR_SIZE - (m_file-sm->cdir->dir) - m_file_s; + } else { + fprintf(stderr,"D "); + t0 = sm->cdir->dir; + s0 = m_file - sm->cdir->dir; + + t1 = m_file + m_file_s; + s1 = a_file + a_file_s - (m_file + m_file_s); + + t2 = m_file; + s2 = m_file_s; + + t3 = b_file; + s3 = DIR_SIZE - (b_file - sm->cdir->dir); + } + + if(s0) { + memcpy(tmp,t0,s0); + } + + if(s1) { + memcpy(tmp + s0 , t1 , s1 ); + } + + if(s2) { + memcpy(tmp + s0 + s1, t2, s2); + } + + if(s3) { + memcpy(tmp + s0 + s1 + s2, t3, s3); + } + + fprintf(stderr," -- t0=%ld, s0=%d, t1=%ld, s1=%d, t2=%ld, s2=%d, t3=%ld, s3=%d; sum=%d, DIRSIZE=%d\n", + (long)t0,s0,(long)t1,s1,(long)t2,s2,(long)t3,s3,s0+s1+s2+s3,DIR_SIZE); + + memcpy(sm->cdir->dir, tmp, DIR_SIZE); +} + +void +mpio_dentry_switch(mpio_t *m, mpio_mem_t mem, BYTE *file1, BYTE *file2) +{ + mpio_smartmedia_t *sm; + BYTE *p1, *p2; + BYTE *current; + int size1 , size2; + BYTE tmp[DIR_SIZE]; + + if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + + if (file1 == file2) + return; + + if (file1cdir->dir) + { + memcpy(current, sm->cdir->dir, p1 - sm->cdir->dir); + current += (p1 - sm->cdir->dir); + } + /* the second file*/ + memcpy(current, p2, size2); + current += size2; + /* between the files */ + memcpy(current, p1+size1, (p2-p1-size1)); + current += (p2-p1-size1); + /* the first file */ + memcpy(current, p1, size1); + current += size1; + /* and the rest */ + memcpy(current, p2+size2, (sm->cdir->dir+DIR_SIZE-p2-size2)); + + /* really update the directory */ + memcpy(sm->cdir->dir, tmp, DIR_SIZE); + + return; +} + +void +mpio_dentry_rename(mpio_t *m, mpio_mem_t mem, BYTE *p, BYTE *newfilename) +{ + mpio_smartmedia_t *sm; + BYTE *current; + int size1 , size2, offset, offset_d1, offset_d2; + BYTE tmp[DIR_SIZE]; + + if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + + current = sm->cdir->dir; + + size1 = mpio_dentry_get_size(m, mem, p) / 0x20; + size2 = (strlen(newfilename) / 13) + 1; + if ((strlen(newfilename) % 13)) + size2++; + + debugn(2, "size1: %d size2: %d\n", size1, size2); + + /* we want to copy the last dentry to the right location + * so we avoid reading and writing the same information + */ + size1--; /* kludge so we can do compares without worry */ + size2--; + + memcpy(tmp, current, DIR_SIZE); + offset = p - current; + offset_d1 = offset + (size1 * 0x20); + offset_d2 = offset + (size2 * 0x20); + + if (size2>size1) { + /* new filename needs at least one slot more than the old one */ + memcpy(current+offset_d2, tmp+offset_d1, (DIR_SIZE-offset_d1)); + } + + if (size2> offset) & 0x01 ); +} + +int +mpio_ecc_256_gen(BYTE *data, BYTE *ecc) +{ + BYTE p1, p1_; + BYTE p2, p2_; + BYTE p4, p4_; + + BYTE p08, p08_; + BYTE p16, p16_; + BYTE p32, p32_; + BYTE p64, p64_; + + BYTE p0128, p0128_; + BYTE p0256, p0256_; + BYTE p0512, p0512_; + BYTE p1024, p1024_; + + int i, j; + + /* init */ + p1=p1_=0; + p2=p2_=0; + p4=p4_=0; + + p08=p08_=0; + p16=p16_=0; + p32=p32_=0; + p64=p64_=0; + + p0128=p0128_=0; + p0256=p0256_=0; + p0512=p0512_=0; + p1024=p1024_=0; + + /* vertical */ + for (i=0; i<256; i++) { + + /* p1, p1_ */ + p1 ^= (get_bit(data[i], 7) ^ + get_bit(data[i], 5) ^ + get_bit(data[i], 3) ^ + get_bit(data[i], 1)); + p1_^= (get_bit(data[i], 6) ^ + get_bit(data[i], 4) ^ + get_bit(data[i], 2) ^ + get_bit(data[i], 0)); + + /* p2, p2_ */ + p2 ^= (get_bit(data[i], 7) ^ + get_bit(data[i], 6) ^ + get_bit(data[i], 3) ^ + get_bit(data[i], 2)); + p2_^= (get_bit(data[i], 5) ^ + get_bit(data[i], 4) ^ + get_bit(data[i], 1) ^ + get_bit(data[i], 0)); + + /* p4, p4_ */ + p4 ^= (get_bit(data[i], 7) ^ + get_bit(data[i], 6) ^ + get_bit(data[i], 5) ^ + get_bit(data[i], 4)); + p4_^= (get_bit(data[i], 3) ^ + get_bit(data[i], 2) ^ + get_bit(data[i], 1) ^ + get_bit(data[i], 0)); + } + + /* horizontal */ + for (i=0; i<8; i++) { + + for (j=0; j<256; j++) { + + /* p08, p08_ */ + if ((j & 0x01) == 0) + p08_^= get_bit(data[j], i); + if ((j & 0x01) == 1) + p08 ^= get_bit(data[j], i); + + /* p16, p16_ */ + if (((j/2) & 0x01) == 0) + p16_^= get_bit(data[j], i); + if (((j/2) & 0x01) == 1) + p16^= get_bit(data[j], i); + + /* p32, p32_ */ + if (((j/4) & 0x01) == 0) + p32_^= get_bit(data[j], i); + if (((j/4) & 0x01) == 1) + p32^= get_bit(data[j], i); + + /* p64, p64_ */ + if (((j/8) & 0x01) == 0) + p64_^= get_bit(data[j], i); + if (((j/8) & 0x01) == 1) + p64^= get_bit(data[j], i); + + + /* p0128, p0128_ */ + if (((j/16) & 0x01) == 0) + p0128_^= get_bit(data[j], i); + if (((j/16) & 0x01) == 1) + p0128 ^= get_bit(data[j], i); + + /* p0256, p0256_ */ + if (((j/32) & 0x01) == 0) + p0256_^= get_bit(data[j], i); + if (((j/32) & 0x01) == 1) + p0256^= get_bit(data[j], i); + + /* p0512, p0512_ */ + if (((j/64) & 0x01) == 0) + p0512_^= get_bit(data[j], i); + if (((j/64) & 0x01) == 1) + p0512^= get_bit(data[j], i); + + /* p1024, p1024_ */ + if (((j/128) & 0x01) == 0) + p1024_^= get_bit(data[j], i); + if (((j/128) & 0x01) == 1) + p1024^= get_bit(data[j], i); + + } + } + + ecc[0]=~((p64 << 7) | (p64_ << 6) | + (p32 << 5) | (p32_ << 4) | + (p16 << 3) | (p16_ << 2) | + (p08 << 1) | (p08_ << 0)); + + ecc[1]=~((p1024 << 7) | (p1024_ << 6) | + (p0512 << 5) | (p0512_ << 4) | + (p0256 << 3) | (p0256_ << 2) | + (p0128 << 1) | (p0128_ << 0)); + + ecc[2]=~((p4 << 7) | (p4_ << 6) | + (p2 << 5) | (p2_ << 4) | + (p1 << 3) | (p1_ << 2)); + + return 0; +} + + +int +mpio_ecc_256_check(BYTE *data, BYTE *ecc) +{ + BYTE own_ecc[3]; + BYTE check[3]; + BYTE c; + BYTE line, col; + + int v, i; + + mpio_ecc_256_gen(data, own_ecc); + if ((own_ecc[0]^ecc[0])| + (own_ecc[1]^ecc[1])| + (own_ecc[2]^ecc[2])) { + debugn(2, "ECC %2x %2x %2x vs. %2x %2x %2x\n", + ecc[0], ecc[1], ecc[2], own_ecc[0], own_ecc[1], own_ecc[2]); + check[0] = (ecc[0] ^ own_ecc[0]); + check[1] = (ecc[1] ^ own_ecc[1]); + check[2] = (ecc[2] ^ own_ecc[2]); + + v=1; + for(i=0; i<4; i++) + { + if (!((get_bit(check[1], i*2) ^ + (get_bit(check[1], i*2+1))))) + v=0; + if (!((get_bit(check[0], i*2) ^ + (get_bit(check[0], i*2+1))))) + v=0; + } + for(i=1; i<4; i++) + { + if (!((get_bit(check[2], i*2) ^ + (get_bit(check[2], i*2+1))))) + v=0; + } + + if (v) { + debug("correctable error detected ... fixing the bit\n"); + line = get_bit(check[1], 7) * 128 + + get_bit(check[1], 5) * 64 + + get_bit(check[1], 3) * 32 + + get_bit(check[1], 1) * 16 + + get_bit(check[0], 7) * 8 + + get_bit(check[0], 5) * 4 + + get_bit(check[0], 3) * 2 + + get_bit(check[0], 1); + col = get_bit(check[2], 7) * 4 + + get_bit(check[2], 5) * 2 + + get_bit(check[2], 3); + debug ("error in line: %d , col %d\n", line, col); + debug ("defect byte is: %02x\n", data[line]); + data[line] ^= ( 1 << col); + debug ("fixed byte is: %02x\n", data[line]); + } else { + debug("uncorrectable error detected. Sorry you lose!\n"); + return 1; + } + } + + return 0; +} + + + + diff --git a/libmpio/src/ecc.h b/libmpio/src/ecc.h new file mode 100644 index 0000000..55ca297 --- /dev/null +++ b/libmpio/src/ecc.h @@ -0,0 +1,44 @@ +/* + * + * $Id: ecc.h,v 1.1 2003/04/23 08:34:15 crunchy Exp $ + * + * Library for USB MPIO-* + * + * Markus Germeier (mager@tzi.de) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * */ + +#ifndef _MPIO_ECC_H_ +#define _MPIO_ECC_H_ + +#include "defs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* 256 Bytes Data, 3 Byte ECC to generate */ +int mpio_ecc_256_gen(BYTE *, BYTE *); +/* 256 Bytes Data, 3 Bytes ECC to check and possibly correct */ +int mpio_ecc_256_check(BYTE *, BYTE*); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libmpio/src/fat.c b/libmpio/src/fat.c new file mode 100644 index 0000000..27974cd --- /dev/null +++ b/libmpio/src/fat.c @@ -0,0 +1,1039 @@ +/* + * + * $Id: fat.c,v 1.1 2003/04/23 08:34:15 crunchy Exp $ + * + * Library for USB MPIO-* + * + * Markus Germeier (mager@tzi.de) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * */ + +#include "fat.h" +#include "io.h" +#include "debug.h" + +#include +#include + +/* I'm lazy so I hard code all the values */ + +BYTE mpio_part_016[0x10] = { + 0x80, 0x02, 0x0a, 0x00, 0x01, 0x03, 0x50, 0xf3, + 0x29, 0x00, 0x00, 0x00, 0xd7, 0x7c, 0x00, 0x00 +}; +BYTE mpio_part_032[0x10] = { + 0x80, 0x02, 0x04, 0x00, 0x01, 0x07, 0x50, 0xf3, + 0x23, 0x00, 0x00, 0x00, 0xdd, 0xf9, 0x00, 0x00 +}; +BYTE mpio_part_064[0x10] = { + 0x80, 0x01, 0x18, 0x00, 0x01, 0x07, 0x60, 0xf3, + 0x37, 0x00, 0x00, 0x00, 0xc9, 0xf3, 0x01, 0x00 +}; +BYTE mpio_part_128[0x10] = { + 0x80, 0x01, 0x10, 0x00, 0x06, 0x0f, 0x60, 0xf3, + 0x2f, 0x00, 0x00, 0x00, 0xd1, 0xe7, 0x03, 0x00 +}; + +/* ------------------------- */ + +BYTE mpio_pbr_head[0x10] = { + 0xe9, 0x00, 0x00, 0x4d, 0x53, 0x44, 0x4f, 0x53, + 0x35, 0x2e, 0x30, 0x00, 0x02, 0x20, 0x01, 0x00 +}; +BYTE mpio_pbr_016[0x13] = { + 0x02, 0x00, 0x01, 0xd7, 0x7c, 0xf8, 0x03, 0x00, + 0x10, 0x00, 0x04, 0x00, 0x29, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00 +}; +BYTE mpio_pbr_032[0x13] = { + 0x02, 0x00, 0x01, 0xdd, 0xf9, 0xf8, 0x06, 0x00, + 0x10, 0x00, 0x08, 0x00, 0x23, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00 +}; +BYTE mpio_pbr_064[0x13] = { + 0x02, 0x00, 0x01, 0x00, 0x00, 0xf8, 0x0c, 0x00, + 0x20, 0x00, 0x08, 0x00, 0x37, 0x00, 0x00, 0x00, + 0xc9, 0xf3, 0x01 +}; +BYTE mpio_pbr_128[0x13] = { + 0x02, 0x00, 0x01, 0x00, 0x00, 0xf8, 0x20, 0x00, + 0x20, 0x00, 0x10, 0x00, 0x2f, 0x00, 0x00, 0x00, + 0xd1, 0xe7, 0x03 +}; + +BYTE * +mpio_mbr_gen(BYTE size) +{ + BYTE *p; + + p = (BYTE *)malloc(SECTOR_SIZE); + memset(p, 0, SECTOR_SIZE); + + /* MBR signature */ + p[0x1fe] = 0x55; + p[0x1ff] = 0xaa; + + /* frist boot partition */ + switch(size) + { + case 16: + memcpy(p+0x1be, mpio_part_016, 0x10); + break; + case 32: + memcpy(p+0x1be, mpio_part_032, 0x10); + break; + case 64: + memcpy(p+0x1be, mpio_part_064, 0x10); + break; + case 128: + memcpy(p+0x1be, mpio_part_128, 0x10); + break; + default: + debug("This should never happen! (%d)\n", size); + exit(-1); + } + + /* all other partitions are set to zero */ + + return p; +} + +BYTE * +mpio_pbr_gen(BYTE size) +{ + BYTE *p; + + p = (BYTE *)malloc(SECTOR_SIZE); + memset(p, 0, SECTOR_SIZE); + + /* MBR signature */ + p[0x1fe] = 0x55; + p[0x1ff] = 0xaa; + + memcpy(p, mpio_pbr_head, 0x10); + /* BIOS parameter etc. */ + switch(size) + { + case 16: + memcpy(p+0x10, mpio_pbr_016, 0x13); + break; + case 32: + memcpy(p+0x10, mpio_pbr_032, 0x13); + break; + case 64: + memcpy(p+0x10, mpio_pbr_064, 0x13); + break; + case 128: + memcpy(p+0x10, mpio_pbr_128, 0x13); + break; + default: + debug("This should never happen! (%d)\n", size); + exit(-1); + } + + /* FAT id */ + if (size >=128) { + strcpy(p+0x36, "FAT16"); + } else { + strcpy(p+0x36, "FAT12"); + } + + return p; +} + +int +mpio_mbr_eval(mpio_smartmedia_t *sm) +{ + BYTE *pe; /* partition entry */ + int sector, head, cylinder; + + if ((sm->mbr[0x1fe] != 0x55) || (sm->mbr[0x1ff] != 0xaa)) + { + debug("This is not the MBR!\n"); + return 1; + } + + /* always use the first partition */ + /* we probably don't need to support others */ + pe = sm->mbr + 0x1be; + + head = (int)(*(pe+0x01) & 0xff); + sector = (int)(*(pe+0x02) & 0x3f); + cylinder = (int)((*(pe+0x02) >> 6) * 0x100 + *(pe + 0x03)); + + sm->pbr_offset=(cylinder * sm->geo.NumHead + head ) * + sm->geo.NumSector + sector - 1; + + return 0; + +} + + +int +mpio_pbr_eval(mpio_smartmedia_t *sm) +{ + BYTE *bpb; /* BIOS Parameter Block */ + int total_sector; + long temp; + + if ((sm->pbr[0x1fe] != 0x55) || (sm->pbr[0x1ff] != 0xaa)) + { + debug("This is not the PBR!\n"); + return 1; + } + + if (strncmp((sm->pbr+0x36),"FAT", 3) != 0) + { + debug("Did not find an FAT signature, *not* good!\n"); + return 2; + } + + bpb = sm->pbr + 0x0b; + + total_sector = (*(sm->pbr+0x14) * 0x100 + *(sm->pbr + 0x13)); + if (!total_sector) + total_sector = (*(sm->pbr+0x23) * 0x1000000 + + *(sm->pbr+0x22) * 0x10000 + + *(sm->pbr+0x21) * 0x100 + + *(sm->pbr+0x20)); + + /* 128 MB need 2 Bytes instead of 1.5 */ + if (sm->size != 128) + { + temp = ((total_sector / 0x20 * 0x03 / 0x02 / 0x200) + 0x01); + } else { + temp = ((total_sector / 0x20 * 0x02 / 0x200) + 0x01); + } + + sm->fat_offset = sm->pbr_offset + 0x01; + sm->fat_size = temp; + sm->fat_nums = *(sm->pbr + 0x10); + sm->dir_offset = sm->pbr_offset + 0x01 + temp * 2; + sm->max_cluster = (total_sector / BLOCK_SECTORS); + /* fix max clusters */ + temp*=2; + while (temp>=0x10) + { + sm->max_cluster--; + temp-=BLOCK_SECTORS; + } + + return 0; +} + + +void +mpio_fatentry_hw2entry(mpio_t *m, mpio_fatentry_t *f) +{ + mpio_smartmedia_t *sm; + BYTE chip, t; + DWORD value; + + if (f->mem == MPIO_INTERNAL_MEM) + { + sm = &m->internal; + + if (f->hw_address == 0xffffffff) + return ; + + value = f->hw_address; + t = value >> 24; + chip = 0; + + while(t/=2) + chip++; + + value &= 0xffffff; + value /= 0x20; + value += chip * (sm->max_cluster / sm->chips); + + f->entry = value; + + return; + } + + debug("This should never happen!\n"); + exit(-1); + + return; +} + + +void +mpio_fatentry_entry2hw(mpio_t *m, mpio_fatentry_t *f) +{ + mpio_smartmedia_t *sm; + DWORD cluster; + BYTE chip; + + if (f->mem == MPIO_INTERNAL_MEM) + { + sm = &m->internal; + + chip = f->entry / (sm->max_cluster / sm->chips); + cluster = f->entry - ((sm->max_cluster / sm->chips) * chip); + cluster *= 0x20; + cluster += 0x01000000 * (1 << chip); + + f->hw_address=cluster; + + return; + } + + debug("This should never happen!\n"); + exit(-1); + + return; +} + + + +int +mpio_bootblocks_read (mpio_t *m, mpio_mem_t mem) +{ + mpio_smartmedia_t *sm=0; + + int error; + + /* this should not be needed for internal memory, but ... */ + if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + if (!sm) + return 1; + + /* in case the external mem is defective we need this here! */ + sm->fat=0; + sm->fat_size=0; + sm->fat_nums=0; + + /* TODO: check a few things more, just to be sure */ + + /* read CIS (just in case it might me usefull) */ + if (mpio_io_sector_read(m, mem, MPIO_BLOCK_CIS, sm->cis)) + { + debug("error reading CIS\n"); + return 1; + } + + /* read MBR */ + /* the MBR is always located @ logical block 0, sector 0! */ + if (mpio_io_sector_read(m, mem, 0, sm->mbr)) + { + debug("error reading MBR\n"); + return 1; + } + + if (error=mpio_mbr_eval(sm)) + { + debug("problem with the MBR (#%d), so I won't try to access the card any" + "further.\n", error); + return 1; + } + + /* read PBR */ + if (mpio_io_sector_read(m, mem, sm->pbr_offset, sm->pbr)) + { + debug("error reading PBR\n"); + return 1; + } + + if (error=mpio_pbr_eval(sm)) + { + debug("problem with the PBR (#%d), so I won't try to access the card any" + "further.\n", error); + return 1; + } + + return 0; +} + +mpio_fatentry_t * +mpio_fatentry_new(mpio_t *m, mpio_mem_t mem, DWORD sector, BYTE ftype) +{ + mpio_smartmedia_t *sm; + mpio_fatentry_t *new; + + new = malloc (sizeof(mpio_fatentry_t)); + + if (new) + { + new->m = m; + new->mem = mem; + new->entry = sector; + + /* init FAT entry */ + memset(new->i_fat, 0xff, 0x10); + new->i_fat[0x00] = 0xaa; /* start of file */ + new->i_fat[0x06] = ftype; + new->i_fat[0x0b] = 0x00; + new->i_fat[0x0c] = 0x00; + new->i_fat[0x0d] = 0x00; + if (m->model >= MPIO_MODEL_FD100) { + /* 0x0e is a copy of the file index number */ + new->i_fat[0x0f] = 0x00; + } else { + new->i_fat[0x0e] = 'P'; + new->i_fat[0x0f] = 'C'; + } + } + + if (mem == MPIO_INTERNAL_MEM) + mpio_fatentry_entry2hw(m, new); + + return new; +} + +int +mpio_fatentry_plus_plus(mpio_fatentry_t *f) +{ + f->entry++; + + if (f->mem == MPIO_INTERNAL_MEM) { + if (f->entry >= f->m->internal.max_cluster) + { + f->entry--; + mpio_fatentry_entry2hw(f->m, f); + return 0; + } + mpio_fatentry_entry2hw(f->m, f); + } + + if (f->mem == MPIO_EXTERNAL_MEM) { + if (f->entry > f->m->external.max_cluster) + { + f->entry--; + return 0; + } + } + + return 1; +} + + +/* read "fat_size" sectors of fat into the provided buffer */ +int +mpio_fat_read (mpio_t *m, mpio_mem_t mem, + mpio_callback_init_t progress_callback) +{ + mpio_smartmedia_t *sm; + BYTE recvbuff[SECTOR_SIZE]; + int i; + + if (mem == MPIO_INTERNAL_MEM) + { + sm = &m->internal; + if (mpio_io_spare_read(m, mem, 0, sm->size, 0, sm->fat, + (sm->fat_size * SECTOR_SIZE), progress_callback)) + return 1; + return 0; + } + + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + + if (!sm) + return 1; + + for (i = 0; i < sm->fat_size; i++) { + if (mpio_io_sector_read(m, mem, (sm->fat_offset + i), recvbuff)) + return 1; + + memcpy(sm->fat + (i * SECTOR_SIZE), recvbuff, SECTOR_SIZE); + } + + return (0); +} + +int +mpio_fatentry_free(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f ) +{ + int e,i ; + mpio_smartmedia_t *sm; + + if (mem == MPIO_INTERNAL_MEM) { + sm = &m->internal; + e = f->entry * 0x10; + + /* be more strict to avoid writing + * to defective blocks! + */ + i=0; + while (i<0x10) + { + if (sm->fat[e+i] != 0xff) + return 0; + i++; + } + return 1; + } + + if (mem == MPIO_EXTERNAL_MEM) { + sm = &m->internal; + if (mpio_fatentry_read(m, mem, f) == 0) + return 1; + } + + return 0; +} + +DWORD +mpio_fatentry_read(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f ) +{ + mpio_smartmedia_t *sm; + int e; + int v; + + if (mem == MPIO_INTERNAL_MEM) { + sm = &m->internal; + e = f->entry * 0x10; + if (mpio_fatentry_is_defect(m, mem, f)) + return 0xffffffff; + + /* this is a special system file! */ + if((sm->fat[e+6] != FTYPE_MUSIC) && + (sm->fat[e+7] == 0xff) && + (sm->fat[e+8] == 0x00) && + (sm->fat[e+9] == 0xff) && + (sm->fat[e+10] == 0xff)) + return 0xffffffff; + /* this is a special system file! */ +/* this is not correct!! */ +/* if (sm->fat[e+6] == FTYPE_CONF) */ +/* return 0xffffffff; */ + /* this is a special system file! */ + if((sm->fat[e+6] != FTYPE_MUSIC) && + (sm->fat[e+0x0b] == 0xff) && + (sm->fat[e+0x0c] == 0xff) && + (sm->fat[e+0x0d] == 0xff)) + return 0xffffffff; + + if((sm->fat[e+7] == 0xff) && + (sm->fat[e+8] == 0xff) && + (sm->fat[e+9] == 0xff) && + (sm->fat[e+10] == 0xff)) + return 0xffffffff; + + v = sm->fat[e+7] * 0x1000000 + + sm->fat[e+8] * 0x10000 + + sm->fat[e+9] * 0x100 + + sm->fat[e+10]; + + return v; + } + + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + + if (!sm->fat) + { + debug ("error, no space for FAT allocated!\n"); + return 0; + } + + + if (sm->size == 128) { + /* 2 Byte per entry */ + e = f->entry * 2; + v = sm->fat[e + 1] * 0x100 + sm->fat[e]; + } else { + /* 1.5 Byte per entry */ + /* Nibble order: x321 */ + e = (f->entry * 3 / 2); +/* printf("mager: byte (%d/%d)\n", e, e+1); */ + if ((f->entry & 0x01) == 0) { + /* LLxH */ + /* 21x3 */ + v = (sm->fat[e + 1] & 0x0f) * 0x100 + sm->fat[e]; + } else { + /* 1x32 */ + v = (sm->fat[e + 1] * 0x10) + (sm->fat[e] >> 4); + } + } + + return v; +} + +int +mpio_fatentry_write(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f, WORD value) +{ + mpio_smartmedia_t *sm; + int e; + BYTE backup; + + if (mem == MPIO_INTERNAL_MEM) + { + debug("This should not be used for internal memory!\n"); + exit(-1); + } + + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + + if (sm->size == 128) + { + /* 2 Byte per entry */ + e = f->entry * 2; + sm->fat[e] = value & 0xff; + sm->fat[e + 1] = (value >> 8 ) & 0xff; + } else { + /* 1.5 Byte per entry */ + e = (f->entry * 3 / 2); + if ((f->entry & 0x01) == 0) { + /* 21x3 */ + sm->fat[e] = value & 0xff; + backup = sm->fat[e + 1] & 0xf0; + sm->fat[e + 1] = backup | (( value / 0x100 ) & 0x0f); + } else { + /* 1x32 */ + sm->fat[e + 1] = (value / 0x10) & 0xff; + backup = sm->fat[e] & 0x0f; + sm->fat[e] = backup | ( (value * 0x10) & 0xf0 ); + } + } + + return 0; +} + +int +mpio_fat_internal_find_startsector(mpio_t *m, BYTE start) +{ + mpio_fatentry_t *f; + mpio_smartmedia_t *sm = &m->internal; + int found=-1; + + f = mpio_fatentry_new(m, MPIO_INTERNAL_MEM, 0, FTYPE_MUSIC); + + while(mpio_fatentry_plus_plus(f)) + { + if ((sm->fat[f->entry * 0x10] == 0xaa) && + (sm->fat[f->entry * 0x10 + 1] == start)) + found=f->entry; + } + + free(f); + + return found; +} + +BYTE +mpio_fat_internal_find_fileindex(mpio_t *m) +{ + mpio_fatentry_t *f; + mpio_smartmedia_t *sm = &m->internal; + BYTE index[256]; + BYTE found; /* hmm, ... */ + + memset(index, 1, 256); + + f = mpio_fatentry_new(m, MPIO_INTERNAL_MEM, 0, FTYPE_MUSIC); + while(mpio_fatentry_plus_plus(f)) + { + if (sm->fat[f->entry * 0x10 + 1] != 0xff) + index[sm->fat[f->entry * 0x10 + 1]] = 0; + } + free(f); + + found=6; + while((found<256) && (!index[found])) + found++; + + if (found==256) + { + debug("Oops, did not find a new fileindex!\n" + "This should never happen, aborting now!, Sorry!\n"); + exit(-1); + } + + return found; +} + + +int +mpio_fat_free_clusters(mpio_t *m, mpio_mem_t mem) +{ + mpio_smartmedia_t *sm; + mpio_fatentry_t *f; + int i; + int e = 0; + int fsize; + + if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + + if (sm->fat) + { + f = mpio_fatentry_new(m, mem, 0, FTYPE_MUSIC); + do + { + if (mpio_fatentry_free(m, mem, f)) + e++; + } while (mpio_fatentry_plus_plus(f)); + free(f); + } else { + f = 0; + } + + + return (e * 16); +} + +mpio_fatentry_t * +mpio_fatentry_find_free(mpio_t *m, mpio_mem_t mem, BYTE ftype) +{ + mpio_fatentry_t *f; + + f = mpio_fatentry_new(m, mem, 1, ftype); + + while(mpio_fatentry_plus_plus(f)) + { + if (mpio_fatentry_free(m, mem, f)) + return f; + } + + free(f); + + return NULL; +} + +int +mpio_fatentry_next_free(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f) +{ + mpio_fatentry_t backup; + + memcpy(&backup, f, sizeof(mpio_fatentry_t)); + + while(mpio_fatentry_plus_plus(f)) + { + if (mpio_fatentry_free(m, mem, f)) + { + if (mem == MPIO_INTERNAL_MEM) + f->i_fat[0x00] = 0xee; + return 1; + } + } + + /* no free entry found, restore entry */ + memcpy(f, &backup, sizeof(mpio_fatentry_t)); + + return 0; +} + +int +mpio_fatentry_next_entry(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f) +{ + mpio_smartmedia_t *sm; + DWORD value; + DWORD endvalue; + + value = mpio_fatentry_read(m, mem, f); + + if (value == 0xaaaaaaaa) + return -1; + + if (mem == MPIO_INTERNAL_MEM) + { + sm = &m->internal; + f->hw_address = value; + + mpio_fatentry_hw2entry(m, f); + + endvalue = 0xffffffff; + } + + + if (mem == MPIO_EXTERNAL_MEM) + { + sm = &m->external; + f->entry = value; + + if (sm->size==128) + { + endvalue = 0xfff8; + } else { + endvalue = 0xff8; + } + } + + if (value >= endvalue) + return 0; + + return 1; +} + + +int +mpio_fat_clear(mpio_t *m, mpio_mem_t mem) +{ + mpio_smartmedia_t *sm; + mpio_fatentry_t *f; + + if (mem == MPIO_INTERNAL_MEM) { + sm = &m->internal; + + f = mpio_fatentry_new(m, mem, 1, FTYPE_MUSIC); + do { + mpio_fatentry_set_free(m, mem, f) ; + } while(mpio_fatentry_plus_plus(f)); + free(f); + } + + if (mem == MPIO_EXTERNAL_MEM) { + sm = &m->external; + memset(sm->fat, 0x00, (sm->fat_size * SECTOR_SIZE)); + sm->fat[0] = 0xf8; + sm->fat[1] = 0xff; + sm->fat[2] = 0xff; + /* for FAT 16 */ + if (sm->size == 128) + sm->fat[3] = 0xff; + } + + return 0; +} + +/* + * This function acutally writes both, + * the FAT _and_ the root directory + * + */ + +int +mpio_fat_write(mpio_t *m, mpio_mem_t mem) +{ + mpio_smartmedia_t *sm; + mpio_fatentry_t *f; + BYTE dummy[BLOCK_SIZE]; + WORD i; + DWORD block; + + if (mem == MPIO_INTERNAL_MEM) { + sm = &m->internal; + + if (sm->cdir == sm->root) + { + f=mpio_fatentry_new(m, mem, 0, FTYPE_MUSIC); + mpio_io_block_delete(m, mem, f); + free(f); + + memset(dummy, 0x00, BLOCK_SIZE); + + /* only write the root dir */ + for (i= 0; i< 0x20; i++) + { + + if (iroot->dir + SECTOR_SIZE * i)); + } else { + /* fill the rest of the block with zeros */ + mpio_io_sector_write(m, mem, i, dummy); + } + } + } else { + mpio_directory_write(m, mem, sm->cdir); + } + + } + + if (mem == MPIO_EXTERNAL_MEM) + { + sm=&m->external; + + memset(dummy, 0xff, BLOCK_SIZE); + + for (i = 0; i < (sm->dir_offset + DIR_NUM) ; i++) { + /* before writing to a new block delete it! */ + if (((i / 0x20) * 0x20) == i) { + block = mpio_zone_block_find_seq(m, mem, (i/0x20)); + if (block == MPIO_BLOCK_NOT_FOUND) + { + block = mpio_zone_block_find_free_seq(m, mem, (i/0x20)); + } + if (block == MPIO_BLOCK_NOT_FOUND) + { + debug("This should never happen!"); + exit(-1); + } + + mpio_io_block_delete_phys(m, mem, block); + } + + /* remeber: logical sector 0 is the MBR! */ + if (i == 0) + mpio_io_sector_write(m, mem, 0, sm->mbr); + if ((i > 0) && (i < sm->pbr_offset)) + mpio_io_sector_write(m, mem, i, dummy); + + if (i == sm->pbr_offset) + mpio_io_sector_write(m, mem, sm->pbr_offset, sm->pbr); + + if ((i >= sm->fat_offset) && (i < (sm->fat_offset + (2*sm->fat_size)))) + mpio_io_sector_write(m, mem, i, + (sm->fat + SECTOR_SIZE * + ((i - sm->fat_offset) % sm->fat_size))); + + if (i>=sm->dir_offset) + mpio_io_sector_write(m, mem, i, + (sm->root->dir + + (i - sm->dir_offset) * SECTOR_SIZE)); + } + + if (sm->cdir != sm->root) + mpio_directory_write(m, mem, sm->cdir); + + } + + + return 0; +} + +int +mpio_fatentry_set_free (mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f) +{ + int e; + mpio_smartmedia_t *sm; + + if (mem == MPIO_INTERNAL_MEM) + { + sm = &m->internal; + e = f->entry * 0x10; + memset((sm->fat+e), 0xff, 0x10); + } + + if (mem == MPIO_EXTERNAL_MEM) + { + sm = &m->internal; + mpio_fatentry_write(m, mem, f, 0); + } + + return 0; +} + +int +mpio_fatentry_set_defect(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f) +{ + int e; + mpio_smartmedia_t *sm; + + if (mem == MPIO_INTERNAL_MEM) + { + sm = &m->internal; + e = f->entry * 0x10; + memset((sm->fat+e), 0xaa, 0x10); + } + + if (mem == MPIO_EXTERNAL_MEM) + { + sm = &m->internal; + mpio_fatentry_write(m, mem, f, 0xfff7); + } + + return 0; +} + +int +mpio_fatentry_is_defect(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f) +{ + int e; + mpio_smartmedia_t *sm; + + if (mem == MPIO_INTERNAL_MEM) + { + sm = &m->internal; + e = f->entry * 0x10; + if (mpio_fatentry_free(m, mem, f)) + return 0; + /* check if this block became defective */ + if (m->model >= MPIO_MODEL_FD100) { + /* newer models */ + if ((sm->fat[e+0x0f] != 0) || + (sm->fat[e+0x01] != sm->fat[e+0x0e])) + { + debug("defective block encountered, abort reading! (newer models check)\n"); + return 1; + } + } else + if ((sm->fat[e+0x0e] != 'P') || + (sm->fat[e+0x0f] != 'C') || + ((sm->fat[e+0x00] != 0xaa) && + (sm->fat[e+0x00] != 0xee))) + { + debug("defective block encountered, abort reading! (older models check)\n"); + return 1; + } + } + + if (mem == MPIO_EXTERNAL_MEM) + { + if (mpio_fatentry_read(m, mem, f)==0xfff7) + return 1; + } + + return 0; +} + +int +mpio_fatentry_set_eof(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f) +{ + int e; + mpio_smartmedia_t *sm; + + if (mem == MPIO_INTERNAL_MEM) + { + sm = &m->internal; + e = f->entry * 0x10; + memset((f->i_fat+0x07), 0xff, 4); + memcpy((sm->fat+e), f->i_fat, 0x10); + } + + if (mem == MPIO_EXTERNAL_MEM) + { + sm = &m->internal; + mpio_fatentry_write(m, mem, f, 0xffff); + } + + return 0; +} + +int +mpio_fatentry_set_next(mpio_t *m, mpio_mem_t mem, + mpio_fatentry_t *f, mpio_fatentry_t *value) +{ + int e; + mpio_smartmedia_t *sm; + + if (mem == MPIO_INTERNAL_MEM) + { + sm = &m->internal; + e = f->entry * 0x10; + + f->i_fat[0x07]= value->hw_address / 0x1000000; + f->i_fat[0x08]=(value->hw_address / 0x10000 ) & 0xff; + f->i_fat[0x09]=(value->hw_address / 0x100 ) & 0xff; + f->i_fat[0x0a]= value->hw_address & 0xff; + + memcpy((sm->fat+e), f->i_fat, 0x10); + } + + if (mem == MPIO_EXTERNAL_MEM) + { + sm = &m->internal; + mpio_fatentry_write(m, mem, f, value->entry); + } + + return 0; +} + diff --git a/libmpio/src/fat.h b/libmpio/src/fat.h new file mode 100644 index 0000000..adb359b --- /dev/null +++ b/libmpio/src/fat.h @@ -0,0 +1,87 @@ +/* + * + * $Id: fat.h,v 1.1 2003/04/23 08:34:15 crunchy Exp $ + * + * Library for USB MPIO-* + * + * Markus Germeier (mager@tzi.de) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * */ + +#ifndef _MPIO_FAT_H_ +#define _MPIO_FAT_H_ + +#include "defs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* generate fresh boot sectors for formatting of external mem */ +BYTE *mpio_mbr_gen(BYTE); +BYTE *mpio_pbr_gen(BYTE); + +/* only needed for external memory */ +int mpio_bootblocks_read(mpio_t *, mpio_mem_t); +int mpio_mbr_eval(mpio_smartmedia_t *); +int mpio_pbr_eval(mpio_smartmedia_t *); + +/* functions on the FAT for internal *and* external */ +int mpio_fat_read(mpio_t *, mpio_mem_t, mpio_callback_init_t); +int mpio_fat_write(mpio_t *, mpio_mem_t); +int mpio_fat_clear(mpio_t *, mpio_mem_t); +int mpio_fat_free_clusters(mpio_t *, mpio_mem_t); +int mpio_fat_free(mpio_t *, mpio_mem_t); + +/* functions to iterate through the FAT linked list(s) */ +mpio_fatentry_t *mpio_fatentry_new(mpio_t *, mpio_mem_t, DWORD, BYTE); +int mpio_fatentry_plus_plus(mpio_fatentry_t *); + +mpio_fatentry_t *mpio_fatentry_find_free(mpio_t *, mpio_mem_t, BYTE); +int mpio_fatentry_next_free(mpio_t *, mpio_mem_t, + mpio_fatentry_t *); +int mpio_fatentry_next_entry(mpio_t *, mpio_mem_t, + mpio_fatentry_t *); +DWORD mpio_fatentry_read(mpio_t *, mpio_mem_t, mpio_fatentry_t *); +int mpio_fatentry_write(mpio_t *, mpio_mem_t, mpio_fatentry_t *, + WORD); + +int mpio_fatentry_set_free (mpio_t *, mpio_mem_t, + mpio_fatentry_t *); +int mpio_fatentry_set_defect(mpio_t *, mpio_mem_t, + mpio_fatentry_t *); +int mpio_fatentry_set_eof(mpio_t *, mpio_mem_t, + mpio_fatentry_t *); +int mpio_fatentry_set_next(mpio_t *, mpio_mem_t, + mpio_fatentry_t *, mpio_fatentry_t *); +int mpio_fatentry_is_defect(mpio_t *, mpio_mem_t, + mpio_fatentry_t *); + +/* finding a file is fundamental different for internal mem */ +int mpio_fat_internal_find_startsector(mpio_t *, BYTE); +BYTE mpio_fat_internal_find_fileindex(mpio_t *); + +/* mapping logical <-> physical for internal memory only */ +void mpio_fatentry_hw2entry(mpio_t *, mpio_fatentry_t *); +void mpio_fatentry_entry2hw(mpio_t *, mpio_fatentry_t *); + +#ifdef __cplusplus +} +#endif + +#endif /* _MPIO_FAT_H_ */ diff --git a/libmpio/src/id3.c b/libmpio/src/id3.c new file mode 100644 index 0000000..e5aba36 --- /dev/null +++ b/libmpio/src/id3.c @@ -0,0 +1,292 @@ +/* + * $Id: id3.c,v 1.1 2003/04/23 08:34:15 crunchy Exp $ + * + * Library for accessing Digit@lways MPIO players + * Copyright (C) 2003 Markus Germeier + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc.,g 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include + +#include "id3.h" +#include "debug.h" +#include "mplib.h" + +#ifdef MPLIB +void +mpio_id3_get_content(id3_tag *tag, id3_tag *tag2, int field, + BYTE out[INFO_LINE]) +{ + id3_content *content; + id3_text_content *text_content; + + content = mp_get_content(tag, field); + if (!content) + content = mp_get_content(tag2, field); + if (content) + { + text_content = mp_parse_artist(content); + debugn(2, "Found (%d): %s\n", field, text_content->text); + strncpy(out, text_content->text, INFO_LINE); + } else { + strcpy(out,""); + } + +} + +void +mpio_id3_copy_tag(BYTE *src, BYTE *dest, int *offset) +{ + int i=0; + int last=0; + + /* find last non-space character, so we can strip */ + /* trailing spaces */ + while(src[i]) + if (src[i++]!=0x20) + last=i; + + i=0; + while((*offset<(INFO_LINE-1)) && (src[i]) && (iid3 = value; + return m->id3; +#else + return 0; +#endif /* MPLIB */ +} + +/* query ID3 rewriting support */ +BYTE +mpio_id3_get(mpio_t *m) +{ +#ifdef MPLIB + return m->id3; +#else + return 0; +#endif /* MPLIB */ +} + +/* ID3 rewriting: do the work */ +/* context, src filename, uniq filename template */ +int +mpio_id3_do(mpio_t *m, BYTE *src, BYTE *tmp) +{ +#ifdef MPLIB + int fd, in; + BYTE buf[BLOCK_SIZE]; + int r, w; + int i, j, t; + id3_tag *tag, *tag2, *new_tag; + id3_tag_list *tag_list; + id3_tag_list new_tag_list; + id3_content *content; + id3_content new_content; + id3_text_content *text_content; + id3v2_tag *v2_tag; + BYTE data_artist[INFO_LINE]; + BYTE data_title[INFO_LINE]; + BYTE data_album[INFO_LINE]; + BYTE data_year[INFO_LINE]; + BYTE data_genre[INFO_LINE]; + BYTE data_comment[INFO_LINE]; + BYTE data_track[INFO_LINE]; + + BYTE mpio_tag[INFO_LINE]; + char *mpio_tag_unicode; + + char *uc; + iconv_t ic; + int fin, fout; + char *fback, *back; + + if (!m->id3) + return 0; + + sprintf(tmp, "/tmp/MPIO-XXXXXXXXXXXXXXX", INFO_LINE); + + fd = mkstemp(tmp); + if (fd==-1) return 0; + sprintf(m->id3_temp, tmp, INFO_LINE); + + in = open(src, O_RDONLY); + if (in==-1) return 0; + + do { + r=read(in, buf, BLOCK_SIZE); + if (r>0) + w=write(fd, buf, r); + } while (r>0); + + close (in); + + tag_list = mp_get_tag_list_from_fd(fd); + if (!tag_list) + { + debug("no tag list found!\n"); + return 0; + } + + tag = tag_list->tag; + tag2 = NULL; + if (tag_list->next) + tag2 = tag_list->next->tag; + + /* read tags from file */ + mpio_id3_get_content(tag, tag2, MP_ARTIST, data_artist); + mpio_id3_get_content(tag, tag2, MP_TITLE, data_title); + mpio_id3_get_content(tag, tag2, MP_ALBUM, data_album); + mpio_id3_get_content(tag, tag2, MP_GENRE, data_genre); + mpio_id3_get_content(tag, tag2, MP_COMMENT, data_comment); + mpio_id3_get_content(tag, tag2, MP_YEAR, data_year); + mpio_id3_get_content(tag, tag2, MP_TRACK, data_track); + + /* build new tag */ + mpio_tag[0]=0x00; + i=j=t=0; + + while ((t<(INFO_LINE-1) && m->id3_format[i]!=0)) + { + if (m->id3_format[i] == '%') + { + i++; + switch(m->id3_format[i]) + { + case 'p': + mpio_id3_copy_tag(data_artist, mpio_tag, &t); + break; + case 't': + mpio_id3_copy_tag(data_title, mpio_tag, &t); + break; + case 'a': + mpio_id3_copy_tag(data_album, mpio_tag, &t); + break; + case 'g': + mpio_id3_copy_tag(data_genre, mpio_tag, &t); + break; + case 'c': + mpio_id3_copy_tag(data_comment, mpio_tag, &t); + break; + case 'y': + mpio_id3_copy_tag(data_year, mpio_tag, &t); + break; + case 'n': + mpio_id3_copy_tag(data_track, mpio_tag, &t); + break; + default: + mpio_tag[t] = m->id3_format[i]; + } + } else { + mpio_tag[t] = m->id3_format[i]; + t++; + } + + i++; + } + mpio_tag[t]=0x00; + + debugn(2, "new_tag: %s\n", mpio_tag); + + /* convert tag to UNICODELITTLE */ + fin = strlen(mpio_tag) + 1; + fout = fin*2 + 2; + ic = iconv_open("UNICODELITTLE", "ASCII"); + fback = mpio_tag; + mpio_tag_unicode = (char *)malloc(2*INFO_LINE+3); + back = (char *)mpio_tag_unicode; + *back=0x01; + back++; + *back=0xff; + back++; + *back=0xfe; + back++; + + debugn(2,"iconv before %s %d %d\n", fback, fin, fout); + iconv(ic, (char **)&fback, &fin, (char **)&back, &fout); + debugn(2,"iconv after %s %d %d\n", fback, fin, fout); + iconv_close(ic); + hexdumpn(2, mpio_tag, strlen(mpio_tag)); + hexdumpn(2, (char *)mpio_tag_unicode, (2*strlen(mpio_tag))+3); + + /* build new ID3 v2 tag with only TXXX field */ + new_content.length=(2*strlen(mpio_tag))+3; + new_content.data = (char *)malloc(new_content.length); + new_content.compressed=0; + new_content.encrypted=0; + memcpy(new_content.data, mpio_tag_unicode, new_content.length); + + new_tag = mp_alloc_tag_with_version (2); + mp_set_custom_content(new_tag, "TXXX", &new_content); + + v2_tag = (id3v2_tag *)new_tag->tag; + v2_tag->header->unsyncronization=0; + v2_tag->header->is_experimental=0; + + new_tag_list.tag = new_tag; + new_tag_list.next = NULL; + new_tag_list.first = NULL; + + /* delete ID3 v2 tag from file */ + mp_del_tags_by_ver_from_fd(fd, 2); + close (fd); + + /* write new ID3 v2 tag to file */ + mp_write_to_file(&new_tag_list, tmp); + + free(mpio_tag_unicode); + + return 1; +#else + return 0; +#endif /* MPLIB */ +} + +int +mpio_id3_end(mpio_t *m) +{ +#ifdef MPLIB + if (m->id3_temp[0]) + unlink(m->id3_temp); + m->id3_temp[0] = 0x00; + return 1; +#else + return 0; +#endif /* MPLIB */ +} + +void +mpio_id3_format_set(mpio_t *m, BYTE *format) +{ + strncpy(m->id3_format, format, INFO_LINE); +} + +/* get format string for rewriting*/ +void +mpio_id3_format_get(mpio_t *m, BYTE *format) +{ + strncpy(format, m->id3_format, INFO_LINE); +} diff --git a/libmpio/src/id3.h b/libmpio/src/id3.h new file mode 100644 index 0000000..1bb549c --- /dev/null +++ b/libmpio/src/id3.h @@ -0,0 +1,44 @@ +/* + * $Id: id3.h,v 1.1 2003/04/23 08:34:15 crunchy Exp $ + * + * Library for accessing Digit@lways MPIO players + * Copyright (C) 2003 Markus Germeier + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _MPIO_ID3_H_ +#define _MPIO_ID3_H_ + +#include "defs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* ID3 rewriting: do the work */ +/* context, src filename, uniq filename template */ +int mpio_id3_do(mpio_t *, BYTE *, BYTE *); + +/* ID3: clean up temp file */ +int mpio_id3_end(mpio_t *); + +#ifdef __cplusplus +} +#endif + + +#endif /* _MPIO_ID3_H_ */ diff --git a/libmpio/src/io.c b/libmpio/src/io.c new file mode 100644 index 0000000..eaaadd4 --- /dev/null +++ b/libmpio/src/io.c @@ -0,0 +1,1213 @@ +/* -*- linux-c -*- */ + +/* + * + * $Id: io.c,v 1.1 2003/04/23 08:34:15 crunchy Exp $ + * + * Library for USB MPIO-* + * + * Markus Germeier (mager@tzi.de) + * + * uses code from mpio_stat.c by + * Yuji Touya (salmoon@users.sourceforge.net) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * */ + +/* + * + * low level I/O + * + * + */ + +#include +#include +#include +#include + +#include "io.h" +#include "debug.h" +#include "ecc.h" + +BYTE model2externalmem(mpio_model_t); +DWORD blockaddress_encode(DWORD); +DWORD blockaddress_decode(BYTE *); +void fatentry2hw(mpio_fatentry_t *, BYTE *, DWORD *); + +/* small hack to handle external addressing on different MPIO models */ +BYTE +model2externalmem(mpio_model_t model) +{ + BYTE m; + + switch(model) + { + case MPIO_MODEL_DMG: + case MPIO_MODEL_DMG_PLUS: + m = 0x80; + break; + default: + m = 0x10; + } + + return m; +} + +/* encoding and decoding of blockaddresses */ + +DWORD +blockaddress_encode(DWORD ba) +{ + WORD addr; + BYTE p = 0, c = 0; + BYTE high, low; + + high = 0x10 | ((ba / 0x80) & 0x07); + low = (ba * 2) & 0xff; + + c = high; + while (c) + { + if (c & 0x01) + p ^= 1; + c /= 2; + } + + c = low; + while (c) + { + if (c & 0x01) + p ^= 0x01; + c /= 2; + } + + addr = (high * 0x100) + low + p; + + return addr; +} + + +DWORD +blockaddress_decode(BYTE *entry) +{ + WORD ba; + WORD value; + BYTE p=0, high, low; + int i, t; + + /* check for "easy" defect block */ + t=1; + for(i=0; i<0x10; i++) + if (entry[i] != 0) + t=0; + if (t) + return MPIO_BLOCK_DEFECT; + + /* check for "easy" defect block */ + t=1; + for(i=0; i<0x10; i++) + if (entry[i] != 0xff) + t=0; + if (t) + return MPIO_BLOCK_FREE; + + /* check for "strange" errors */ + if ((entry[6] != entry[11]) || + (entry[7] != entry[12])) + { + debug("error: different block addresses found:\n"); + hexdumpn(1, entry, 0x10); + return MPIO_BLOCK_DEFECT; + } + + ba = entry[6] * 0x100 + entry[7]; + + /* special values */ + if (ba == 0xffff) + return MPIO_BLOCK_DEFECT; + if (ba == 0x0000) + return MPIO_BLOCK_CIS; + + /* check parity */ + value = ba; + while (value) + { + if (value & 0x01) + p ^= 0x01; + + value /= 2; + } + if (p) + { + debug("parity error found in block address: %2x\n", ba); + return MPIO_BLOCK_DEFECT; + } + + high = ((ba / 0x100) & 0x07); + low = ((ba & 0x0ff) / 2); + + return (high * 0x80 + low); +} + +/* foobar */ + +void +fatentry2hw(mpio_fatentry_t *f, BYTE *chip, DWORD *address) +{ + mpio_smartmedia_t *sm; + + if (f->mem == MPIO_INTERNAL_MEM) + { + sm = &f->m->internal; + /* hexdump((char *)&f->entry, 4); */ + /* hexdump((char *)&f->hw_address, 4); */ + *chip = f->hw_address / 0x1000000; + *address = f->hw_address & 0x0ffffff; + } + if (f->mem == MPIO_EXTERNAL_MEM) + { + sm = &f->m->external; + *chip = MPIO_EXTERNAL_MEM; + *address = mpio_zone_block_find_log(f->m, f->mem, f->entry); + debugn(3, "mager: %06x (logical: %04x)\n", *address, f->entry); + } + return; +} + +/* + * zone management + */ + +int +mpio_zone_init(mpio_t *m, mpio_cmd_t mem) +{ + mpio_smartmedia_t *sm; + int i; + int zone, block, e; + + if (mem != MPIO_EXTERNAL_MEM) + { + debug("called function with wrong memory selection!\n"); + return -1; + } + sm = &m->external; + + for(i=0; imax_blocks; i++) + { + zone = i / MPIO_ZONE_PBLOCKS; + block= i % MPIO_ZONE_PBLOCKS; + + e = i * 0x10; + + sm->zonetable[zone][block]=blockaddress_decode(sm->spare+e); + + hexdumpn(4, sm->spare+e, 0x10); + debugn(2, "decoded: %04x\n", sm->zonetable[zone][block]); + } + +} + +DWORD +mpio_zone_block_find_log(mpio_t *m, mpio_cmd_t mem, DWORD lblock) +{ + mpio_smartmedia_t *sm; + int v; + + if (mem != MPIO_EXTERNAL_MEM) + { + debug("called function with wrong memory selection!\n"); + return -1; + } + sm = &m->external; + + /* OK, I can't explain this right now, but it does work, + * see Software Driver v3.0, page 31 + */ + v = lblock + (sm->size/64); + + return (mpio_zone_block_find_seq(m, mem, v)); +} + +DWORD +mpio_zone_block_find_seq(mpio_t *m, mpio_cmd_t mem, DWORD lblock) +{ + mpio_smartmedia_t *sm; + int i, f, v; + int zone, block; + + if (mem != MPIO_EXTERNAL_MEM) + { + debug("called function with wrong memory selection!\n"); + return -1; + } + sm = &m->external; + + if ((lblock>=MPIO_BLOCK_CIS) && (lblock<(MPIO_BLOCK_CIS + BLOCK_SECTORS))) + { + zone = 0; + block = MPIO_BLOCK_CIS; + } else { + zone = lblock / MPIO_ZONE_LBLOCKS; + block = lblock % MPIO_ZONE_LBLOCKS; + } + + f=0; + for (i=(MPIO_ZONE_PBLOCKS-1); i >=0; i--) + { + + if (sm->zonetable[zone][i]==block) + { + f++; + v=i; + } + } + + if (f>1) + debug("found more than one block, using first one\n"); + + if (!f) + { + debugn(2, "block not found\n"); + return MPIO_BLOCK_NOT_FOUND; + } + + return ((zone * BLOCK_SECTORS * MPIO_ZONE_PBLOCKS ) + v * BLOCK_SECTORS); +} + +DWORD +mpio_zone_block_set_free(mpio_t *m, mpio_cmd_t mem, DWORD lblock) +{ + DWORD value; + int zone, block; + mpio_smartmedia_t *sm; + + if (mem != MPIO_EXTERNAL_MEM) + { + debug("called function with wrong memory selection!\n"); + return -1; + } + sm = &m->external; + + value = mpio_zone_block_find_log(m, mem, lblock); + + mpio_zone_block_set_free_phys(m, mem, value); + + return value; +} + +void +mpio_zone_block_set_free_phys(mpio_t *m, mpio_cmd_t mem, DWORD value) +{ + int zone, block; + mpio_smartmedia_t *sm; + + if (mem != MPIO_EXTERNAL_MEM) + { + debug("called function with wrong memory selection!\n"); + return; + } + sm = &m->external; + + zone = value / BLOCK_SECTORS; + block = zone % MPIO_ZONE_PBLOCKS; + zone = zone / MPIO_ZONE_PBLOCKS; + + sm->zonetable[zone][block] = MPIO_BLOCK_FREE; + + return; +} + +void +mpio_zone_block_set_defect_phys(mpio_t *m, mpio_cmd_t mem, DWORD value) +{ + int zone, block; + mpio_smartmedia_t *sm; + + if (mem != MPIO_EXTERNAL_MEM) + { + debug("called function with wrong memory selection!\n"); + return; + } + sm = &m->external; + + zone = value / BLOCK_SECTORS; + block = zone % MPIO_ZONE_PBLOCKS; + zone = zone / MPIO_ZONE_PBLOCKS; + + sm->zonetable[zone][block] = MPIO_BLOCK_DEFECT; + + return; +} + +void +mpio_zone_block_set(mpio_t *m, mpio_cmd_t mem, DWORD pblock) +{ + int zone, block, pb; + + pb = pblock / BLOCK_SECTORS; + zone = pb / MPIO_ZONE_PBLOCKS; + block = pb % MPIO_ZONE_PBLOCKS; + + m->external.zonetable[zone][block] = MPIO_BLOCK_FREE ; + +} + +DWORD +mpio_zone_block_find_free_log(mpio_t *m, mpio_cmd_t mem, DWORD lblock) +{ + mpio_smartmedia_t *sm; + int v; + + if (mem != MPIO_EXTERNAL_MEM) + { + debug("called function with wrong memory selection!\n"); + return -1; + } + sm = &m->external; + + /* OK, I can't explain this right now, but it does work, + * see Software Driver v3.0, page 31 + */ + v = lblock + (sm->size/64); + + return (mpio_zone_block_find_free_seq(m, mem, v)); +} + +DWORD +mpio_zone_block_find_free_seq(mpio_t *m, mpio_cmd_t mem, DWORD lblock) +{ + DWORD value; + int zone, block, i; + mpio_smartmedia_t *sm; + + if (mem != MPIO_EXTERNAL_MEM) + { + debug("called function with wrong memory selection!\n"); + return -1; + } + sm = &m->external; + + value = mpio_zone_block_find_seq(m, mem, lblock); + + if (value != MPIO_BLOCK_NOT_FOUND) + { + debug("logical block numbers is already assigned! (%4x)\n", lblock); + exit (-1); + } + + if ((lblock>=MPIO_BLOCK_CIS) && (lblock<(MPIO_BLOCK_CIS + BLOCK_SECTORS))) + { + zone = 0; + block = MPIO_BLOCK_CIS; + } else { + zone = lblock / MPIO_ZONE_LBLOCKS; + block = lblock % MPIO_ZONE_LBLOCKS; + } + + i=0; + while ((sm->zonetable[zone][i]!=MPIO_BLOCK_FREE) && (izonetable[zone][i] = block; + + return ((zone * BLOCK_SECTORS * MPIO_ZONE_PBLOCKS ) + i * BLOCK_SECTORS); +} + + +WORD +mpio_zone_block_get_logical(mpio_t *m, mpio_cmd_t mem, DWORD pblock) +{ + int zone, block, pb; + + pb = pblock / BLOCK_SECTORS; + zone = pb / MPIO_ZONE_PBLOCKS; + block = pb % MPIO_ZONE_PBLOCKS; + + return m->external.zonetable[zone][block]; +} + + + + + +/* + * low-low level functions + */ + +/* + * Set command packet + * + * parameter: + * + * cmd: commando code + * mem: internal/external + * index: sector/block + * size: size of used memory chip + * wsize: write size, only for PUT_BLOCK + * buffer: output buffer of command packet + * + */ + +int +mpio_io_set_cmdpacket(mpio_t *m, mpio_cmd_t cmd, mpio_mem_t mem, DWORD index, + WORD size, BYTE wsize, BYTE *buffer) +{ + BYTE memory; + + /* clear cmdpacket*/ + memset(buffer, 0, 0x40); + + *buffer = cmd; + memory = mem; + if (mem == MPIO_EXTERNAL_MEM) + memory = model2externalmem(m->model); + + *(buffer + 0x01) = memory; + *(buffer + 0x03) = (BYTE) (index & 0x00ff); + *(buffer + 0x04) = (BYTE)((index & 0xff00) >> 8); + /* SM cards with less or equal 32 MB only need 2 Bytes + * to address sectors or blocks. + * The highest byte has to be 0xff in that case! + */ + if (size <= 32) + { + *(buffer + 0x05) = 0xff; + } else { + *(buffer + 0x05) = (BYTE) (index >> 16); + } + /* is this always 0x48 in case of a block write ?? */ + *(buffer + 0x06) = wsize; + + memcpy((buffer + 0x3b), "jykim", 5); + + return (0); +} + +/* + * write chunk of data to MPIO filedescriptor + * + * parameter: + * + * fd: filedescriptor + * block: data buffer (has to be num_bytes) + * num_bytes: size of data buffer + * + */ +int +mpio_io_bulk_write(int fd, BYTE *block, int num_bytes) +{ + BYTE *p; + int count, bytes_left, bytes_written; + + bytes_left = num_bytes; + bytes_written = 0; + p = block; + + do + { + count = write (fd, p, bytes_left); + if (count > 0) + { + p += count; + bytes_written += count; + bytes_left -= count; + } + } while (bytes_left > 0 && count > 0); + + return bytes_written; +} + +/* + * read chunk of data from MPIO filedescriptor + * + * parameter: + * + * fd: filedescriptor + * block: return buffer (has to be num_bytes) + * num_bytes: size of return buffer + * + */ +int +mpio_io_bulk_read (int fd, BYTE *block, int num_bytes) +{ + int total_read, count, bytes_left; + BYTE *p; + + total_read = 0; + bytes_left = num_bytes; + p = block; + + do + { + count = read (fd, p, bytes_left); + + if (count > 0) + { + total_read += count; + bytes_left -= count; + p += count; + } + } while (total_read < num_bytes && count > 0); + + return total_read; +} + +/* + * low level functions + */ + +/* + * read version block from MPIO + * + * parameter: + * + * m: mpio context + * buffer: return buffer (has to be CMD_SIZE) + * + */ +int +mpio_io_version_read(mpio_t *m, BYTE *buffer) +{ + int nwrite, nread; + BYTE cmdpacket[CMD_SIZE], status[CMD_SIZE]; + + /* Send command packet to MPIO */ + mpio_io_set_cmdpacket (m, GET_VERSION, 0, 0, 0xff, 0, cmdpacket); + + debugn (5, ">>> MPIO\n"); + hexdump (cmdpacket, sizeof(cmdpacket)); + + nwrite = mpio_io_bulk_write (m->fd, cmdpacket, 0x40); + + if (nwrite != CMD_SIZE) + { + debug ("Failed to send command.\n\n"); + close (m->fd); + return 0; + } + + /* Receive packet from MPIO */ + nread = mpio_io_bulk_read (m->fd, status, 0x40); + + if (nread == -1 || nread != 0x40) + { + debug ("Failed to read Sector.\n%x\n",nread); + close (m->fd); + return 0; + } + + debugn (5, "<<< MPIO\n"); + hexdump (status, 0x40); + + memcpy(buffer, status, 0x40); + + return CMD_SIZE; +} + +/* + * read sector from SmartMedia + * + * parameter: + * + * m: mpio context + * mem: MPIO_{INTERNAL,EXTERNAL}_MEM + * index: index number of sector to read + * output: return buffer (has to be SECTOR_SIZE) + * + */ + +/* right now we assume we only want to read single sectors from + * the _first_ internal memory chip + */ + +int +mpio_io_sector_read(mpio_t *m, BYTE mem, DWORD index, BYTE *output) +{ + mpio_smartmedia_t *sm=0; + DWORD sector; + int nwrite, nread; + BYTE cmdpacket[CMD_SIZE], recvbuff[SECTOR_TRANS]; + + if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + if (!sm) + { + debug("error in memory selection, aborting\n"); + exit (-1); + } + + if (mem == MPIO_INTERNAL_MEM) + { + sector = index; + } else { + /* find the correct physical block first! */ + if ((index>=MPIO_BLOCK_CIS) && (index<(MPIO_BLOCK_CIS + BLOCK_SECTORS))) + { + sector = mpio_zone_block_find_seq(m, mem, MPIO_BLOCK_CIS); + sector+= (index % MPIO_BLOCK_CIS); + } else { + sector = mpio_zone_block_find_seq(m, mem, (index / 0x20)); + sector+= (index % 0x20); + } + } + + debugn (2, "sector: %8x (%06x)\n", index, sector); + + mpio_io_set_cmdpacket (m, GET_SECTOR, mem, sector, sm->size, 0, cmdpacket); + + debugn (5, "\n>>> MPIO\n"); + hexdump (cmdpacket, sizeof(cmdpacket)); + + nwrite = mpio_io_bulk_write (m->fd, cmdpacket, 0x40); + + if(nwrite != CMD_SIZE) + { + debug ("\nFailed to send command.\n\n"); + close (m->fd); + return 1; + } + + /* Receive packet from MPIO */ + nread = mpio_io_bulk_read (m->fd, recvbuff, SECTOR_TRANS); + + if(nread != SECTOR_TRANS) + { + debug ("\nFailed to read Sector.\n%x\n", nread); + close (m->fd); + return 1; + } + + /* check ECC Area information */ + if (mem==MPIO_EXTERNAL_MEM) + { + if (mpio_ecc_256_check (recvbuff, + (recvbuff + SECTOR_SIZE + 13)) || + mpio_ecc_256_check ((recvbuff + (SECTOR_SIZE / 2)), + (recvbuff + SECTOR_SIZE + 8)) ) + debug ("ECC error @ (%02x : %06x)\n", mem, index); + } + + /* This should not be needed: + * we don't have ECC information for the internal memory + * we only read the directory through this function + */ + /* if (mem==MPIO_INTERNAL_MEM) */ + /* { */ + /* debugn(2, "WARNING, code for internal FAT entry (in ECC area)" */ + /* " not yet in place!!\n"); */ + /* } */ + + debugn (5, "\n<<< MPIO\n"); + hexdump (recvbuff, SECTOR_TRANS); + + memcpy(output, recvbuff, SECTOR_SIZE); + + return 0; +} + +/* + * write sector to SmartMedia + * + * parameter: + * + * m: mpio context + * mem: MPIO_{INTERNAL,EXTERNAL}_MEM + * index: index number of sector to read + * input: data buffer (has to be SECTOR_SIZE) + * + */ + +/* right now we assume we only want to write single sectors from + * the _first_ internal memory chip + */ + +int +mpio_io_sector_write(mpio_t *m, BYTE mem, DWORD index, BYTE *input) +{ + int nwrite; + mpio_smartmedia_t *sm; + DWORD pvalue; + DWORD block_address, ba; + BYTE cmdpacket[CMD_SIZE], sendbuff[SECTOR_TRANS]; + + if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + if (!sm) + { + debug("error in memory selection, aborting\n"); + exit (-1); + } + + /* we have to: + * - find the physical block (or allocate a new one) + * - calculate the logical block for zone management + */ + + if (mem == MPIO_EXTERNAL_MEM) + { + if (index==MPIO_BLOCK_DEFECT) + { + block_address = 0; + pvalue = 0; + } else { + if ((index>=MPIO_BLOCK_CIS) && + (index<(MPIO_BLOCK_CIS + BLOCK_SECTORS))) + { + block_address = 0; + if (index==MPIO_BLOCK_CIS) + { + pvalue=mpio_zone_block_find_free_seq(m, mem, index); + } else { + /* find the block from the block list! */ + pvalue=mpio_zone_block_find_seq(m, mem, MPIO_BLOCK_CIS); + } + if (pvalue != MPIO_BLOCK_NOT_FOUND) + pvalue = pvalue + index - MPIO_BLOCK_CIS; + + } else { + block_address = blockaddress_encode(index / BLOCK_SECTORS); + if ((index % BLOCK_SECTORS) == 0) + { + /* this is the first write to the block: allocate a new one */ + /* ... and mark it with the block_address */ + pvalue=mpio_zone_block_find_free_seq(m, mem, + (index / BLOCK_SECTORS)); + } else { + /* find the block from the block list! */ + pvalue=mpio_zone_block_find_seq(m, mem, (index / BLOCK_SECTORS)); + } + if (pvalue != MPIO_BLOCK_NOT_FOUND) + pvalue = pvalue + (index % BLOCK_SECTORS); + + } + + if (pvalue == MPIO_BLOCK_NOT_FOUND) + { + debug ("Oops, this should never happen! (%6x : %6x)\n", + index, block_address); + exit (-1); + } + } + } else { + pvalue = index; + } + + mpio_io_set_cmdpacket(m, PUT_SECTOR, mem, pvalue, sm->size, 0, cmdpacket); + + debugn (5, "\n>>> MPIO\n"); + hexdump (cmdpacket, sizeof(cmdpacket)); + + nwrite = mpio_io_bulk_write(m->fd, cmdpacket, 0x40); + + if(nwrite != CMD_SIZE) + { + debug ("\nFailed to send command.\n\n"); + close (m->fd); + return 1; + } + + memset(sendbuff, 0, SECTOR_TRANS); + memset(sendbuff + SECTOR_SIZE, 0xff, 0x10); + memcpy(sendbuff, input, SECTOR_SIZE); + + if (mem==MPIO_EXTERNAL_MEM) + { + if (index == MPIO_BLOCK_DEFECT) { + memset(sendbuff + SECTOR_SIZE, 0, 0x10); + mpio_zone_block_set_defect_phys(m, mem, pvalue); + } else { + + /* generate ECC information for spare area ! */ + mpio_ecc_256_gen(sendbuff, + sendbuff + SECTOR_SIZE + 0x0d); + mpio_ecc_256_gen(sendbuff + (SECTOR_SIZE / 2), + sendbuff + SECTOR_SIZE + 0x08); + if (index == MPIO_BLOCK_DEFECT) { + memset(sendbuff + SECTOR_SIZE, 0, 0x10); + } else { + if (index == MPIO_BLOCK_CIS) { + memset(sendbuff + SECTOR_SIZE + 0x06, 0, 2); + memset(sendbuff + SECTOR_SIZE + 0x0b, 0, 2); + } else { + ba = (block_address / 0x100) & 0xff; + sendbuff[SECTOR_SIZE + 0x06] = ba; + sendbuff[SECTOR_SIZE + 0x0b] = ba; + + ba = block_address & 0xff; + sendbuff[SECTOR_SIZE + 0x07] = ba; + sendbuff[SECTOR_SIZE + 0x0c] = ba; + } + } + + } + } + + /* easy but working, we write back the FAT info we read before */ + if (mem==MPIO_INTERNAL_MEM) + memcpy((sendbuff+SECTOR_SIZE), sm->fat, 0x10); + + debugn (5, "\n>>> MPIO\n"); + hexdump(sendbuff, SECTOR_TRANS); + + /* write sector MPIO */ + nwrite = mpio_io_bulk_write(m->fd, sendbuff, SECTOR_TRANS); + + if(nwrite != SECTOR_TRANS) + { + debug ("\nFailed to read Sector.\n%x\n", nwrite); + close (m->fd); + return 1; + } + + return 0; +} + +/* + * read/write of blocks + */ +int +mpio_io_block_read(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f, BYTE *output) +{ + int i=0; + int nwrite, nread; + mpio_smartmedia_t *sm; + BYTE chip; + DWORD address; + BYTE cmdpacket[CMD_SIZE], recvbuff[BLOCK_TRANS]; + + if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + + fatentry2hw(f, &chip, &address); + + mpio_io_set_cmdpacket(m, GET_BLOCK, chip, address, sm->size, 0, cmdpacket); + + debugn(5, "\n>>> MPIO\n"); + hexdump(cmdpacket, sizeof(cmdpacket)); + + nwrite = mpio_io_bulk_write(m->fd, cmdpacket, CMD_SIZE); + + if(nwrite != CMD_SIZE) + { + debug ("\nFailed to send command.\n\n"); + close (m->fd); + return 1; + } + + /* Receive packet from MPIO */ + nread = mpio_io_bulk_read(m->fd, recvbuff, BLOCK_TRANS); + + if(nread != BLOCK_TRANS) + { + debug ("\nFailed to read Block.\n%x\n",nread); + close (m->fd); + return 1; + } + + debugn(5, "\n<<< MPIO\n"); + hexdump(recvbuff, BLOCK_TRANS); + + for (i = 0; i < BLOCK_SECTORS; i++) + { + /* check ECC Area information */ + if (mem==MPIO_EXTERNAL_MEM) { + if (mpio_ecc_256_check ((recvbuff + (i * SECTOR_TRANS)), + ((recvbuff +(i * SECTOR_TRANS) + + SECTOR_SIZE +13))) || + mpio_ecc_256_check ((recvbuff + (i * SECTOR_TRANS) + + (SECTOR_SIZE / 2)), + ((recvbuff +(i * SECTOR_TRANS) + + SECTOR_SIZE + 8)))) + debug ("ECC error @ (%02x : %06x)\n", chip, address); + } + + memcpy(output + (i * SECTOR_SIZE), + recvbuff + (i * SECTOR_TRANS), + SECTOR_SIZE); + } + + return 0; +} + +/* Read spare is only usefull for the internal memory, + * the FAT lies there. It is updated during the + * mpio_io_{sector,block}_{read,write} operations. + * + * For external SmartMedia cards we have a "seperate" FAT + * which is read and updated just like on a regular floppy + * disc or hard drive. + * + */ + +int +mpio_io_spare_read(mpio_t *m, BYTE mem, DWORD index, WORD size, + BYTE wsize, BYTE *output, int toread, + mpio_callback_init_t progress_callback) +{ + mpio_smartmedia_t *sm; + int i; + int nwrite, nread; + int chip = 0; + int chips = 0; + BYTE cmdpacket[CMD_SIZE]; + + if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + + chips = sm->chips; + + for (chip = 1; chip <= chips; chip++) + { + if (mem == MPIO_INTERNAL_MEM) + mpio_io_set_cmdpacket(m, GET_SPARE_AREA, (1 << (chip-1)), + index, (size / sm->chips), + wsize, cmdpacket); + if (mem == MPIO_EXTERNAL_MEM) + mpio_io_set_cmdpacket(m, GET_SPARE_AREA, mem, index, size, + wsize, cmdpacket); + debugn(5, "\n>>> MPIO\n"); + hexdump(cmdpacket, sizeof(cmdpacket)); + + nwrite = mpio_io_bulk_write(m->fd, cmdpacket, CMD_SIZE); + + if(nwrite != CMD_SIZE) { + debug ("\nFailed to send command.\n\n"); + close (m->fd); + return 1; + } + + /* Receive packet from MPIO */ + for (i = 0; i < (toread / chips / CMD_SIZE); i++) + { + nread = mpio_io_bulk_read (m->fd, + output + (i * CMD_SIZE) + + (toread / chips * (chip - 1)), + CMD_SIZE); + + if ((progress_callback) && (i % 256)) + (*progress_callback)(mem, + (i*CMD_SIZE+(toread/chips*(chip-1))), + toread ); + + if(nread != CMD_SIZE) + { + debug ("\nFailed to read Block.\n%x\n",nread); + close (m->fd); + return 1; + } + debugn(5, "\n<<< MPIO\n"); + hexdump(output + (i * CMD_SIZE) + (toread / chips * (chip - 1)), + CMD_SIZE); + } + } + if (progress_callback) + (*progress_callback)(mem, toread, toread); + + return 0; +} + +int +mpio_io_block_delete(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f) +{ + BYTE chip=0; + DWORD address; + mpio_smartmedia_t *sm; + + if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + + fatentry2hw(f, &chip, &address); + + if (address == MPIO_BLOCK_NOT_FOUND) + { + debug("hmm, what happens here? (%4x)\n", f->entry); + return 0; + } + + return (mpio_io_block_delete_phys(m, chip, address)); +} + +int +mpio_io_block_delete_phys(mpio_t *m, BYTE chip, DWORD address) +{ + mpio_smartmedia_t *sm; + int nwrite, nread; + BYTE cmdpacket[CMD_SIZE], status[CMD_SIZE]; + + /* Send command packet to MPIO */ + + if (chip == MPIO_INTERNAL_MEM) sm = &m->internal; + /* hack to support 2+4 internal chips + * who ever allowed me to write code??? -mager + */ + if (chip == (MPIO_INTERNAL_MEM+1)) sm = &m->internal; + if (chip == (MPIO_INTERNAL_MEM+3)) sm = &m->internal; + if (chip == (MPIO_INTERNAL_MEM+7)) sm = &m->internal; + if (chip == MPIO_EXTERNAL_MEM) + { + sm = &m->external; + mpio_zone_block_set_free_phys(m, chip, address); + } + + mpio_io_set_cmdpacket(m, DEL_BLOCK, chip, address, sm->size, 0, cmdpacket); + + debugn (5, ">>> MPIO\n"); + hexdump (cmdpacket, sizeof(cmdpacket)); + + nwrite = mpio_io_bulk_write(m->fd, cmdpacket, 0x40); + + if (nwrite != CMD_SIZE) + { + debug ("Failed to send command.\n\n"); + close (m->fd); + return 0; + } + +/* Receive packet from MPIO */ + nread = mpio_io_bulk_read (m->fd, status, CMD_SIZE); + + if ((nread == -1) || (nread != CMD_SIZE)) + { + debug ("Failed to read Sector.\n%x\n",nread); + close (m->fd); + return 0; + } + + debugn(5, "<<< MPIO\n"); + hexdump(status, CMD_SIZE); + + if (status[0] != 0xc0) + { + debugn (2,"error formatting Block %02x:%06x\n", + chip, address); + if (chip == MPIO_EXTERNAL_MEM) + { + sm = &m->external; + mpio_zone_block_set_defect_phys(m, chip, address); + } + } + + return CMD_SIZE; +} + +int +mpio_io_block_write(mpio_t *m, mpio_mem_t mem, mpio_fatentry_t *f, BYTE *data) +{ + mpio_smartmedia_t *sm; + int nwrite; + int i; + DWORD block_address, ba; + BYTE cmdpacket[CMD_SIZE], sendbuff[BLOCK_TRANS]; + BYTE chip=0; + DWORD address; + + if (mem == MPIO_INTERNAL_MEM) + { + sm = &m->internal; + fatentry2hw(f, &chip, &address); + } + + if (mem == MPIO_EXTERNAL_MEM) + { + sm = &m->external; + /* find free physical block */ + chip = MPIO_EXTERNAL_MEM; + address = mpio_zone_block_find_free_log(m, mem, f->entry); + } + + /* build block for transfer to MPIO */ + for (i = 0; i < BLOCK_SECTORS; i++) + { + memcpy(sendbuff + (i * SECTOR_TRANS), + data + (i * SECTOR_SIZE), + SECTOR_SIZE); + memset(sendbuff + (i * SECTOR_TRANS) + SECTOR_SIZE, + 0xff, CMD_SIZE); + + if (mem == MPIO_INTERNAL_MEM) + { + if (i == 0) + { + memcpy((sendbuff+SECTOR_SIZE+(i * SECTOR_TRANS)), + f->i_fat, 0x10); +/* debug("address %02x:%06x\n", chip, address); */ +/* hexdumpn(0, f->i_fat, 0x10); */ + } + } + + /* fill in block information */ + if (mem == MPIO_EXTERNAL_MEM) + { + block_address = mpio_zone_block_get_logical(m, mem, address); + block_address = blockaddress_encode(block_address); + + ba = (block_address / 0x100) & 0xff; + sendbuff[(i * SECTOR_TRANS) + SECTOR_SIZE + 0x06] = ba; + sendbuff[(i * SECTOR_TRANS) + SECTOR_SIZE + 0x0b] = ba; + + ba = block_address & 0xff; + sendbuff[(i * SECTOR_TRANS) + SECTOR_SIZE + 0x07] = ba; + sendbuff[(i * SECTOR_TRANS) + SECTOR_SIZE + 0x0c] = ba; + + /* generate ECC Area information */ + mpio_ecc_256_gen ((sendbuff + (i * SECTOR_TRANS)), + ((sendbuff + (i * SECTOR_TRANS) + + SECTOR_SIZE + 13))); + mpio_ecc_256_gen ((sendbuff + (i * SECTOR_TRANS) + + (SECTOR_SIZE / 2)), + ((sendbuff + (i * SECTOR_TRANS) + + SECTOR_SIZE + 8))); + } + } + + mpio_io_set_cmdpacket(m, PUT_BLOCK, chip, address, sm->size, 0x48 , cmdpacket); + + debugn(5, "\n>>> MPIO\n"); + hexdump(cmdpacket, sizeof(cmdpacket)); + + nwrite = mpio_io_bulk_write(m->fd, cmdpacket, CMD_SIZE); + + if(nwrite != CMD_SIZE) + { + debug ("\nFailed to send command.\n\n"); + close (m->fd); + return 1; + } + + /* send packet to MPIO */ + debugn(5, "\n<<< MPIO\n"); + hexdump(sendbuff, BLOCK_TRANS); + nwrite = mpio_io_bulk_write (m->fd, sendbuff, BLOCK_TRANS); + + if(nwrite != BLOCK_TRANS) + { + debug ("\nFailed to read Block.\n%x\n",nwrite); + close (m->fd); + return 1; + } + + return 0; +} diff --git a/libmpio/src/io.h b/libmpio/src/io.h new file mode 100644 index 0000000..9b5df11 --- /dev/null +++ b/libmpio/src/io.h @@ -0,0 +1,95 @@ +/* -*- linux-c -*- */ + +/* + * + * $Id: io.h,v 1.1 2003/04/23 08:34:15 crunchy Exp $ + * + * Library for USB MPIO-* + * + * Markus Germeier (mager@tzi.de) + * + * uses code from mpio_stat.c by + * Yuji Touya (salmoon@users.sourceforge.net) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * */ + +#ifndef _MPIO_IO_H_ +#define _MPIO_IO_H_ + +#include "defs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* phys.<->log. block mapping */ +int mpio_zone_init(mpio_t *, mpio_cmd_t); +/* context, memory bank, logical block */ +/* returns address of physical block! */ +DWORD mpio_zone_block_find_log(mpio_t *, mpio_cmd_t, DWORD); + /* context, memory bank, sequential block (for sector addressing) */ +/* returns address of physical block! */ +DWORD mpio_zone_block_find_seq(mpio_t *, mpio_cmd_t, DWORD); +/* context, memory bank, logical block */ +/* find used physical block and mark it as unused! */ +/* returns address of physical block! (to delete the physical block!) */ +DWORD mpio_zone_block_set_free(mpio_t *, mpio_cmd_t, DWORD); +/* context, memory bank, physical block */ +void mpio_zone_block_set_free_phys(mpio_t *, mpio_cmd_t, DWORD); +/* context, memory bank, physical block */ +void mpio_zone_block_set_defect_phys(mpio_t *, mpio_cmd_t, DWORD); +/* context, memory bank, logical block */ +/* looks for a free physical block to be used for given logical block */ +/* mark the found block used for this logical block */ +/* returns address of physical block! */ +DWORD mpio_zone_block_find_free_log(mpio_t *, mpio_cmd_t, DWORD); +DWORD mpio_zone_block_find_free_seq(mpio_t *, mpio_cmd_t, DWORD); +/* return zone-logical block for a given physical block */ +WORD mpio_zone_block_get_logical(mpio_t *, mpio_cmd_t, DWORD); + + +/* real I/O */ +int mpio_io_set_cmdpacket(mpio_t *, mpio_cmd_t, mpio_mem_t, + DWORD, WORD, BYTE, BYTE *); + +int mpio_io_bulk_read (int, BYTE *, int); +int mpio_io_bulk_write(int, BYTE *, int); + +/* read version block into memory */ +int mpio_io_version_read(mpio_t *, BYTE *); + +/* */ +int mpio_io_sector_read (mpio_t *, BYTE, DWORD, BYTE *); +int mpio_io_sector_write(mpio_t *, BYTE, DWORD, BYTE *); + +/* */ +int mpio_io_block_read (mpio_t *, mpio_mem_t, mpio_fatentry_t *, BYTE *); +int mpio_io_block_write (mpio_t *, mpio_mem_t, mpio_fatentry_t *, BYTE *); +int mpio_io_block_delete(mpio_t *, mpio_mem_t, mpio_fatentry_t *); +/* needed for formatting of external memory */ +int mpio_io_block_delete_phys(mpio_t *, BYTE, DWORD); + +/* */ +int mpio_io_spare_read (mpio_t *, BYTE, DWORD, WORD, BYTE, BYTE *, int, + mpio_callback_init_t); + +#ifdef __cplusplus +} +#endif + +#endif /* _MPIO_IO_H_ */ diff --git a/libmpio/src/mpio.c b/libmpio/src/mpio.c new file mode 100644 index 0000000..894b6f8 --- /dev/null +++ b/libmpio/src/mpio.c @@ -0,0 +1,1301 @@ +/* + * + * $Id: mpio.c,v 1.1 2003/04/23 08:34:15 crunchy Exp $ + * + * Library for USB MPIO-* + * + * Markus Germeier (mager@tzi.de) + * + * uses code from mpio_stat.c by + * Yuji Touya (salmoon@users.sourceforge.net) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * */ + +#include +#include +#include +#include +#include +#include + +#include "cis.h" +#include "defs.h" +#include "debug.h" +#include "directory.h" +#include "io.h" +#include "mpio.h" +#include "smartmedia.h" +#include "fat.h" + +void mpio_bail_out(void); +void mpio_init_internal(mpio_t *); +void mpio_init_external(mpio_t *); +int mpio_check_filename(mpio_filename_t); + +int mpio_file_get_real(mpio_t *, mpio_mem_t, mpio_filename_t, mpio_filename_t, + mpio_callback_t, BYTE **); + +int mpio_file_put_real(mpio_t *, mpio_mem_t, mpio_filename_t, mpio_filename_t, + mpio_filetype_t, mpio_callback_t, BYTE *, int); + +static BYTE *mpio_model_name[] = { + "MPIO-DME", + "MPIO-DMG", + "MPIO-DMG+", + "MPIO-DMB", + "MPIO-DMB+", + "MPIO-DMK", + "MPIO-FD100", + "MPIO-FL100", + "MPIO-FY100", + "unknown" +}; + +static mpio_error_t mpio_errors[] = { + { MPIO_ERR_FILE_NOT_FOUND, + "The selected file can not be found." }, + { MPIO_ERR_NOT_ENOUGH_SPACE, + "There is not enough space left on the selected memory card." }, + { MPIO_ERR_FILE_EXISTS, + "The selected file already exists and can not be overwritten. Remove it first." }, + { MPIO_ERR_FAT_ERROR, + "Internal error while reading the FAT." }, + { MPIO_ERR_READING_FILE, + "The selected file can not be read." }, + { MPIO_ERR_PERMISSION_DENIED, + "There are not enough rights to access the file/directory." }, + { MPIO_ERR_WRITING_FILE, + "There are no permisson to write to the selected file." }, + { MPIO_ERR_DIR_TOO_LONG, + "The selected directory name is to long." }, + { MPIO_ERR_DIR_NOT_FOUND, + "The selected directory can not be found." }, + { MPIO_ERR_DIR_NOT_A_DIR, + "The selected directory is not a directory." }, + { MPIO_ERR_DIR_NAME_ERROR, + "The selected directory name is not allowed." }, + { MPIO_ERR_DIR_NOT_EMPTY, + "The selected directory is not empty." }, + { MPIO_ERR_DEVICE_NOT_READY, + "Could not open " MPIO_DEVICE "\n" + "Verify that the mpio module is loaded and " + "your MPIO is\nconnected and powered up.\n" }, + { MPIO_ERR_OUT_OF_MEMORY, + "Out of Memory." }, + { MPIO_ERR_INTERNAL, + "Oops, internal ERROR. :-(" }, + { MPIO_ERR_INT_STRING_INVALID, + "Internal Error: Supported is invalid!" } +}; + +static const int mpio_error_num = sizeof mpio_errors / sizeof(mpio_error_t); + +static int _mpio_errno = 0; + +#define MPIO_ERR_RETURN(err) { mpio_id3_end(m); _mpio_errno = err; return -1 ; } + +#define MPIO_CHECK_FILENAME(filename) \ + if (!mpio_check_filename(filename)) { \ + MPIO_ERR_RETURN(MPIO_ERR_INT_STRING_INVALID); \ + } + +void +mpio_bail_out(void){ + printf("I'm utterly confused and aborting now, sorry!"); + printf("Please report this to: mpio-devel@lists.sourceforge.net\n"); + exit(1); +} + +int +mpio_check_filename(mpio_filename_t filename) +{ + BYTE *p=filename; + + while (p < (filename + MPIO_FILENAME_LEN)) + { + if (*p) + return 1; + p++; + } + + return 0; +} + +void +mpio_init_internal(mpio_t *m) +{ + mpio_smartmedia_t *sm = &m->internal; + BYTE i_offset = 0x18; + + /* init main memory parameters */ + sm->manufacturer = m->version[i_offset]; + sm->id = m->version[i_offset + 1]; + sm->chips = 1; + if (!(mpio_id_valid(m->version[i_offset]))) + { + sm->manufacturer = 0; + sm->id = 0; + sm->size = 0; + debug("WARNING: no internal memory found\n"); + return; + } + + + /* look for further installed memory chips + * models with 1, 2 and 4 chips are known + * (there _really_ shouldn't be any other versions out there ...) + */ + while ((sm->chips < 4) && + (mpio_id_valid(m->version[i_offset + (2 * sm->chips)]))) + { + if(mpio_id2mem(sm->id) != + mpio_id2mem(m->version[i_offset + (2 * sm->chips) + 1])) + { + printf("Found a MPIO with internal chips of different sizes!"); + mpio_bail_out(); + } + sm->chips++; + } + + if ((sm->chips == 3) || (sm->chips > 4)) + { + printf("Found a MPIO with %d internal chips", sm->chips); + mpio_bail_out(); + } + + sm->size = sm->chips * mpio_id2mem(sm->id); + debugn(2, "found %d chip(s) with %d MB => %d MB internal mem\n", + sm->chips, mpio_id2mem(sm->id), sm->size); + + /* used for size calculations (see mpio_memory_free) */ + mpio_id2geo(sm->id, &sm->geo); + + /* read FAT information from spare area */ + sm->max_cluster = (sm->size * 1024) / 16; /* 1 cluster == 16 KB */ + sm->max_blocks = sm->max_cluster; + debugn(2, "max_cluster: %d\n", sm->max_cluster); + /* 16 bytes per cluster */ + sm->fat_size = (sm->max_cluster * 16) / SECTOR_SIZE; + debugn(2, "fat_size: %04x\n", sm->fat_size * SECTOR_SIZE); + sm->fat = malloc(sm->fat_size * SECTOR_SIZE); + /* fat will be read in mpio_init, so we can more easily handle + a callback function */ + + if (!(sm->fat_size)) + { + printf("Some values on the way to the FAT calculations did not compute. :-(\n"); + mpio_bail_out(); + } + + + /* Read directory from internal memory */ + sm->dir_offset=0; + sm->root = malloc (sizeof(mpio_directory_t)); + sm->root->name[0] = 0; + sm->root->next = NULL; + sm->root->prev = NULL; + mpio_rootdir_read(m, MPIO_INTERNAL_MEM); + sm->cdir = sm->root; +} + +void +mpio_init_external(mpio_t *m) +{ + mpio_smartmedia_t *sm = &(m->external); + BYTE e_offset = 0x20; + + /* heuristic to find the right offset for the external memory */ + while((e_offset < 0x3a) && !(mpio_id_valid(m->version[e_offset]))) + e_offset++; + + if ((mpio_id_valid(m->version[e_offset])) && + (m->model != MPIO_MODEL_FL100)) /* ignore external memory ATM until + we know how to support it! */ + { + sm->manufacturer = m->version[e_offset]; + sm->id = m->version[e_offset + 1]; + } else { + sm->manufacturer = 0; + sm->id = 0; + sm->chips = 0; + sm->size = 0; + } + + /* init memory parameters if external memory is found */ + if (sm->id != 0) + { + /* Read things from external memory (if available) */ + sm->size = mpio_id2mem(sm->id); + sm->chips = 1; /* external is always _one_ chip !! */ + + mpio_id2geo(sm->id, &sm->geo); + + if (sm->size < 16) + { + debug("Sorry, I don't believe this software works with " + "SmartMedia Cards less than 16MB\n" + "Proceed with care and send any findings to: " + "mpio-devel@lists.sourceforge.net\n"); + } + + /* for reading the spare area later! */ + sm->max_blocks = sm->size / 16 * 1024; /* 1 cluster == 16 KB */ + sm->spare = malloc(sm->max_blocks * 0x10); + } + + /* setup directory support */ + sm->dir_offset=0; + sm->root = malloc (sizeof(mpio_directory_t)); + sm->root->name[0] = 0; + sm->root->next = NULL; + sm->root->prev = NULL; + sm->cdir = sm->root; +} + +mpio_t * +mpio_init(mpio_callback_init_t progress_callback) +{ + mpio_t *new_mpio; + mpio_smartmedia_t *sm; + int id_offset; + BYTE i; + + new_mpio = malloc(sizeof(mpio_t)); + if (!new_mpio) { + debug ("Error allocating memory for mpio_t"); + return NULL; + } + memset(new_mpio, 0, sizeof(mpio_t)); + + new_mpio->fd = open(MPIO_DEVICE, O_RDWR); + + if (new_mpio->fd < 0) { + _mpio_errno = MPIO_ERR_DEVICE_NOT_READY; + return NULL; + } + + /* Read Version Information */ + mpio_io_version_read(new_mpio, new_mpio->version); + + /* fill in values */ + snprintf(new_mpio->firmware.id, 12, "%s", new_mpio->version); + /* fix for newer versions which have a 0x00 in their version */ + for (i=0x0c ; i<0x10 ; i++) + if (new_mpio->version[i] == 0x00) + new_mpio->version[i]=' '; + snprintf(new_mpio->firmware.major, 3, "%s", new_mpio->version + 0x0c); + snprintf(new_mpio->firmware.minor, 3, "%s", new_mpio->version + 0x0e); + snprintf(new_mpio->firmware.year, 5, "%s", new_mpio->version + 0x10); + snprintf(new_mpio->firmware.month, 3, "%s", new_mpio->version + 0x14); + snprintf(new_mpio->firmware.day, 3, "%s", new_mpio->version + 0x16); + + /* there are different identification strings! */ + if (strncmp(new_mpio->version, "MPIO", 4) == 0) { + /* strings: "MPIOxy " */ + id_offset = 4; + + /* string: "MPIO-xy " */ + if (new_mpio->version[id_offset] == '-') + id_offset++; + + /* identify different versions */ + switch (new_mpio->version[id_offset]) + { + case 'E': + new_mpio->model = MPIO_MODEL_DME; + break ; + case 'K': + new_mpio->model = MPIO_MODEL_DMK; + break ; + case 'G': + new_mpio->model = MPIO_MODEL_DMG; + if (new_mpio->version[id_offset+1] == 'P') + new_mpio->model = MPIO_MODEL_DMG_PLUS; + break ; + case 'B': + new_mpio->model = MPIO_MODEL_DMB; + if (new_mpio->version[id_offset+1] == 'P') + new_mpio->model = MPIO_MODEL_DMB_PLUS; + break; + default: + new_mpio->model = MPIO_MODEL_UNKNOWN; + } + } else if (strncmp(new_mpio->version, "FD100", 5) == 0) { + new_mpio->model = MPIO_MODEL_FD100; + } else if (strncmp(new_mpio->version, "FL100", 5) == 0) { + /* we assume this model is not supported */ + new_mpio->model = MPIO_MODEL_FL100; + debug("FL100 found: External memory is ignored, because we don't know how" + " to support it at the moment (MultiMediaCards instead of SmartMedia)\n"); + } else if (strncmp(new_mpio->version, "FY100", 5) == 0) { + new_mpio->model = MPIO_MODEL_FY100; + /* I assume this is like the FD100/FL100, I didn't had the chance to + look at a FY100 firmware yet. -mager */ + debug("FY100 found: Beware, this model is not tested and we don't know" + " if it does work!\n"); + } else { + new_mpio->model = MPIO_MODEL_UNKNOWN; + } + + if (new_mpio->model == MPIO_MODEL_UNKNOWN) { + debug("Unknown version string found!\n" + "Please report this to: mpio-devel@lists.sourceforge.net\n"); + hexdumpn(1, new_mpio->version, CMD_SIZE); + } + + /* internal init */ + mpio_init_internal(new_mpio); + + /* external init */ + mpio_init_external(new_mpio); + + /* read FAT/spare area */ + if (new_mpio->internal.id) + mpio_fat_read(new_mpio, MPIO_INTERNAL_MEM, progress_callback); + + /* read the spare area (for block mapping) */ + if (new_mpio->external.id) + { + sm = &new_mpio->external; + mpio_io_spare_read(new_mpio, MPIO_EXTERNAL_MEM, 0, + sm->size, 0, sm->spare, + (sm->max_blocks * 0x10), progress_callback); + mpio_zone_init(new_mpio, MPIO_EXTERNAL_MEM); + + /* card might be defect */ + if (mpio_bootblocks_read(new_mpio, MPIO_EXTERNAL_MEM)==0) + { + sm->fat = malloc(SECTOR_SIZE*sm->fat_size); + mpio_fat_read(new_mpio, MPIO_EXTERNAL_MEM, NULL); + mpio_rootdir_read(new_mpio, MPIO_EXTERNAL_MEM); + } + } + + /* set default charset for filename conversion */ + new_mpio->charset=strdup(MPIO_CHARSET); + + /* disable ID3 rewriting support */ + new_mpio->id3=0; + strncpy(new_mpio->id3_format, MPIO_ID3_FORMAT, INFO_LINE); + new_mpio->id3_temp[0]=0x00; + + return new_mpio; +} + +/* + * returns available memory + * + * free: give back free memory size + * + */ +int +mpio_memory_free(mpio_t *m, mpio_mem_t mem, int *free) +{ + if (mem==MPIO_INTERNAL_MEM) { + if (!m->internal.size) { + *free=0; + return 0; + } + *free=mpio_fat_free_clusters(m, mem); + return (m->internal.geo.SumSector + * SECTOR_SIZE / 1000 * m->internal.chips); + } + + if (mem==MPIO_EXTERNAL_MEM) { + if (!m->external.size) { + *free=0; + return 0; + } + *free=mpio_fat_free_clusters(m, mem); + return (m->external.geo.SumSector * SECTOR_SIZE / 1000); + } + + return 0; +} + +void +mpio_close(mpio_t *m) +{ + if (m) { + close(m->fd); + + if(m->internal.fat) + free(m->internal.fat); + if(m->external.fat) + free(m->external.fat); + + free(m); + } +} + +mpio_model_t +mpio_get_model(mpio_t *m) +{ + mpio_model_t r; + + if (m) + { + r = m->model; + } else { + r = MPIO_MODEL_UNKNOWN; + } + + return r; +} + +void +mpio_get_info(mpio_t *m, mpio_info_t *info) +{ + int max=INFO_LINE-1; + snprintf(info->firmware_id, max, "\"%s\"", m->firmware.id); + snprintf(info->firmware_version, max, "%s.%s", + m->firmware.major, m->firmware.minor); + snprintf(info->firmware_date, max, "%s.%s.%s", + m->firmware.day, m->firmware.month, m->firmware.year); + snprintf(info->model, max, "%s", mpio_model_name[m->model]); + + if (!m->internal.id) + { + snprintf(info->mem_internal, max, "not available"); + } else { + if (m->internal.chips == 1) + { + snprintf(info->mem_internal, max, "%3dMB (%s)", + mpio_id2mem(m->internal.id), + mpio_id2manufacturer(m->internal.manufacturer)); + } else { + snprintf(info->mem_internal, max, "%3dMB (%s) - %d chips", + mpio_id2mem(m->internal.id)*m->internal.chips, + mpio_id2manufacturer(m->internal.manufacturer), + m->internal.chips); + } + } + + if (m->external.id) + { + snprintf(info->mem_external, max, "%3dMB (%s)", + mpio_id2mem(m->external.id), + mpio_id2manufacturer(m->external.manufacturer)); + } else { + snprintf(info->mem_external, max, "not available"); + } + +} + + +int +mpio_file_get_as(mpio_t *m, mpio_mem_t mem, mpio_filename_t filename, + mpio_filename_t as, mpio_callback_t progress_callback) +{ + return mpio_file_get_real(m, mem, filename, as, progress_callback, NULL); +} + +int +mpio_file_get(mpio_t *m, mpio_mem_t mem, mpio_filename_t filename, + mpio_callback_t progress_callback) +{ + return mpio_file_get_real(m, mem, filename, NULL, progress_callback, NULL); +} + +int +mpio_file_get_to_memory(mpio_t *m, mpio_mem_t mem, mpio_filename_t filename, + mpio_callback_t progress_callback, BYTE **memory) +{ + return mpio_file_get_real(m, mem, filename, NULL, progress_callback, memory); +} + +int +mpio_file_get_real(mpio_t *m, mpio_mem_t mem, mpio_filename_t filename, + mpio_filename_t as, mpio_callback_t progress_callback, + BYTE **memory) +{ + mpio_smartmedia_t *sm; + BYTE block[BLOCK_SIZE]; + int fd, towrite; + BYTE *p; + mpio_fatentry_t *f = 0; + struct utimbuf utbuf; + long mtime; + DWORD filesize, fsize; + BYTE abort = 0; + int merror; + + MPIO_CHECK_FILENAME(filename); + + if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + + if(as==NULL) { + as = filename; + } + + /* find file */ + p = mpio_dentry_find_name(m, mem, filename); + if (!p) + p = mpio_dentry_find_name_8_3(m, mem, filename); + + if (p) + f = mpio_dentry_get_startcluster(m, mem, p); + + if (f && p) { + filesize=fsize=mpio_dentry_get_filesize(m, mem, p); + + if (memory) + { + *memory = malloc(filesize); + } else { + unlink(filename); + fd = open(as, (O_RDWR | O_CREAT), (S_IRWXU | S_IRGRP | S_IROTH)); + } + + do + { + mpio_io_block_read(m, mem, f, block); + + if (filesize > BLOCK_SIZE) { + towrite = BLOCK_SIZE; + } else { + towrite = filesize; + } + + if (memory) + { + memcpy((*memory)+(fsize-filesize) , block, towrite); + } else { + if (write(fd, block, towrite) != towrite) { + debug("error writing file data\n"); + close(fd); + free (f); + MPIO_ERR_RETURN(MPIO_ERR_WRITING_FILE); + } + } + + filesize -= towrite; + + if (progress_callback) + abort=(*progress_callback)((fsize-filesize), fsize); + if (abort) + debug("aborting operation"); + + } while ((((merror=(mpio_fatentry_next_entry(m, mem, f)))>0) && + (filesize>0)) && (!abort)); + + if (merror<0) + debug("defective block encountered!\n"); + + if(!memory) + { + close (fd); + free (f); + } + + /* read and copied code from mtools-3.9.8/mcopy.c + * to make this one right + */ + mtime=mpio_dentry_get_time(m, mem, p); + utbuf.actime = mtime; + utbuf.modtime = mtime; + utime(filename, &utbuf); + + } else { + debugn(2, "unable to locate the file: %s\n", filename); + _mpio_errno=MPIO_ERR_FILE_NOT_FOUND; + } + + return (fsize-filesize); +} + +int +mpio_file_put_as(mpio_t *m, mpio_mem_t mem, mpio_filename_t filename, + mpio_filename_t as, mpio_filetype_t filetype, + mpio_callback_t progress_callback) +{ + return mpio_file_put_real(m, mem, filename, as, filetype, + progress_callback, NULL,0); +} + +int +mpio_file_put(mpio_t *m, mpio_mem_t mem, mpio_filename_t filename, + mpio_filetype_t filetype, mpio_callback_t progress_callback) +{ + return mpio_file_put_real(m, mem, filename, NULL, filetype, + progress_callback, NULL,0); +} + +int +mpio_file_put_from_memory(mpio_t *m, mpio_mem_t mem, mpio_filename_t filename, + mpio_filetype_t filetype, + mpio_callback_t progress_callback, + BYTE *memory, int memory_size) +{ + return mpio_file_put_real(m, mem, filename, NULL, filetype, + progress_callback, memory, memory_size); +} + +int +mpio_file_put_real(mpio_t *m, mpio_mem_t mem, mpio_filename_t i_filename, + mpio_filename_t o_filename, mpio_filetype_t filetype, + mpio_callback_t progress_callback, + BYTE *memory, int memory_size) +{ + mpio_smartmedia_t *sm; + mpio_fatentry_t *f, current, firstblock, backup; + WORD start; + BYTE block[BLOCK_SIZE]; + BYTE use_filename[INFO_LINE]; + int fd, toread; + struct stat file_stat; + struct tm tt; + time_t curr; + int id3; + + BYTE *p = NULL; + DWORD filesize, fsize, free, blocks; + BYTE abort = 0; + + if(o_filename == NULL) { + o_filename = i_filename; + } + + MPIO_CHECK_FILENAME(o_filename); + + if (mem==MPIO_INTERNAL_MEM) sm=&m->internal; + if (mem==MPIO_EXTERNAL_MEM) sm=&m->external; + + if (memory) + { + fsize=filesize=memory_size; + } else { + id3 = mpio_id3_do(m, i_filename, use_filename); + if (!id3) + strncat(use_filename, i_filename, INFO_LINE); + if (stat((const char *)use_filename, &file_stat)!=0) { + debug("could not find file: %s\n", use_filename); + MPIO_ERR_RETURN(MPIO_ERR_FILE_NOT_FOUND); + } + fsize=filesize=file_stat.st_size; + debugn(2, "filesize: %d\n", fsize); + } + + /* check if there is enough space left */ + mpio_memory_free(m, mem, &free); + if (free*1024entry; + } + + /* find file-id for internal memory */ + if (mem==MPIO_INTERNAL_MEM) + { + f->i_index=mpio_fat_internal_find_fileindex(m); + debugn(2, "fileindex: %02x\n", f->i_index); + f->i_fat[0x01]= f->i_index; + if (m->model >= MPIO_MODEL_FD100) + f->i_fat[0x0e] = f->i_index; + start = f->i_index; + + /* number of blocks needed for file */ + blocks = filesize / 0x4000; + if (filesize % 0x4000) + blocks++; + debugn(2, "blocks: %02x\n", blocks); + f->i_fat[0x02]=(blocks / 0x100) & 0xff; + f->i_fat[0x03]= blocks & 0xff; + } + + if (!memory) + { + /* open file for reading */ + fd = open(use_filename, O_RDONLY); + if (fd==-1) + { + debug("could not open file: %s\n", use_filename); + MPIO_ERR_RETURN(MPIO_ERR_FILE_NOT_FOUND); + } + } + + while ((filesize>BLOCK_SIZE) && (!abort)) { + + if (filesize>=BLOCK_SIZE) { + toread=BLOCK_SIZE; + } else { + toread=filesize; + } + + if (memory) + { + memcpy(block, memory+(fsize-filesize), toread); + } else { + if (read(fd, block, toread)!=toread) { + debug("error reading file data\n"); + close(fd); + MPIO_ERR_RETURN(MPIO_ERR_READING_FILE); + } + } + filesize -= toread; + + /* get new free block from FAT and write current block out */ + memcpy(¤t, f, sizeof(mpio_fatentry_t)); + if (!(mpio_fatentry_next_free(m, mem, f))) + { + debug ("Found no free cluster during mpio_file_put\n" + "This should never happen\n"); + exit(-1); + } + mpio_fatentry_set_next(m ,mem, ¤t, f); + mpio_io_block_write(m, mem, ¤t, block); + + if (progress_callback) + abort=(*progress_callback)((fsize-filesize), fsize); + } + + /* handle the last block to write */ + + if (filesize>=BLOCK_SIZE) { + toread=BLOCK_SIZE; + } else { + toread=filesize; + } + + if (memory) + { + memcpy(block, memory+(fsize-filesize), toread); + } else { + if (read(fd, block, toread)!=toread) { + debug("error reading file data\n"); + close(fd); + MPIO_ERR_RETURN(MPIO_ERR_READING_FILE); + } + } + filesize -= toread; + + /* mark end of FAT chain and write last block */ + mpio_fatentry_set_eof(m ,mem, f); + mpio_io_block_write(m, mem, f, block); + + if (!memory) + close(fd); + + if (progress_callback) + (*progress_callback)((fsize-filesize), fsize); + + if (abort) + { /* delete the just written blocks, because the user + * aborted the operation + */ + debug("aborting operation\n"); + debug("removing already written blocks\n"); + + filesize=fsize; + + memcpy(¤t, &firstblock, sizeof(mpio_fatentry_t)); + memcpy(&backup, &firstblock, sizeof(mpio_fatentry_t)); + + while (mpio_fatentry_next_entry(m, mem, ¤t)) + { + mpio_io_block_delete(m, mem, &backup); + mpio_fatentry_set_free(m, mem, &backup); + memcpy(&backup, ¤t, sizeof(mpio_fatentry_t)); + + if (filesize > BLOCK_SIZE) + { + filesize -= BLOCK_SIZE; + } else { + filesize -= filesize; + } + + if (progress_callback) + (*progress_callback)((fsize-filesize), fsize); + } + mpio_io_block_delete(m, mem, &backup); + mpio_fatentry_set_free(m, mem, &backup); + + if (filesize > BLOCK_SIZE) + { + filesize -= BLOCK_SIZE; + } else { + filesize -= filesize; + } + + if (progress_callback) + (*progress_callback)((fsize-filesize), fsize); + + } else { + if (memory) + { + time(&curr); + tt = * localtime(&curr); + } + mpio_dentry_put(m, mem, + o_filename, strlen(o_filename), + ((memory)?mktime(&tt):file_stat.st_ctime), + fsize, start, 0x20); + } + + mpio_id3_end(m); + + return fsize-filesize; +} + +int +mpio_file_switch(mpio_t *m, mpio_mem_t mem, + mpio_filename_t file1, mpio_filename_t file2) +{ + BYTE *p1, *p2; + + /* find files */ + p1 = mpio_dentry_find_name(m, mem, file1); + if (!p1) + p1 = mpio_dentry_find_name_8_3(m, mem, file1); + + p2 = mpio_dentry_find_name(m, mem, file2); + if (!p2) + p2 = mpio_dentry_find_name_8_3(m, mem, file2); + + if ((!p1) || (!p2)) + MPIO_ERR_RETURN(MPIO_ERR_FILE_NOT_FOUND); + + mpio_dentry_switch(m, mem, p1, p2); + + return 0; +} + +int +mpio_file_rename(mpio_t *m, mpio_mem_t mem, + mpio_filename_t old, mpio_filename_t new) +{ + BYTE *p; + + /* find files */ + p = mpio_dentry_find_name(m, mem, old); + if (!p) + p = mpio_dentry_find_name_8_3(m, mem, old); + + if (!p) + MPIO_ERR_RETURN(MPIO_ERR_FILE_NOT_FOUND); + + mpio_dentry_rename(m, mem, p, new); + + return 0; +} + +int mpio_file_move(mpio_t *m,mpio_mem_t mem, mpio_filename_t file, + mpio_filename_t after) +{ + BYTE *p1,*p2; + + if( ( p1 = mpio_dentry_find_name(m,mem,file)) == NULL ) { + if( (p1 = mpio_dentry_find_name_8_3(m, mem, file)) == NULL ) { + MPIO_ERR_RETURN(MPIO_ERR_FILE_NOT_FOUND); + } + } + + if(after!=NULL) { + if( ( p2 = mpio_dentry_find_name(m,mem,after)) == NULL ) { + if( (p2 = mpio_dentry_find_name_8_3(m, mem, after)) == NULL ) { + MPIO_ERR_RETURN(MPIO_ERR_FILE_NOT_FOUND); + } + } + } + + fprintf(stderr," -- moving '%s' after '%s'\n",file,after); + + mpio_dentry_move(m,mem,p1,p2); + + return 0; +} + +int +mpio_memory_format(mpio_t *m, mpio_mem_t mem, + mpio_callback_t progress_callback) +{ + int data_offset; + mpio_smartmedia_t *sm; + mpio_fatentry_t *f; + DWORD clusters; + BYTE abort = 0; + BYTE *cis, *mbr, *pbr; + BYTE defect[SECTOR_SIZE]; + int i; + + if (mem == MPIO_INTERNAL_MEM) + { + sm=&m->internal; + data_offset = 0x01; + } + + if (mem == MPIO_EXTERNAL_MEM) + { + sm = &m->external; + data_offset = 0x02; + } + + clusters = sm->size*128; + + + /* TODO: read and write "Config.dat" so the player does not become "dumb" */ + if (mem==MPIO_INTERNAL_MEM) + { + /* clear the fat before anything else, so we can mark clusters defective + * if we found a bad block + */ + /* external mem must be handled diffrently, + * see comment(s) below! + */ + mpio_fat_clear(m, mem); + f = mpio_fatentry_new(m, mem, data_offset, FTYPE_MUSIC); + do + { + + if (!mpio_io_block_delete(m, mem, f)) + mpio_fatentry_set_defect(m, mem, f); + + if (progress_callback) + { + if (!abort) + { + abort=(*progress_callback)(f->entry, sm->max_cluster + 1); + if (abort) + debug("received abort signal, but ignoring it!\n"); + } else { + (*progress_callback)(f->entry, sm->max_cluster + 1); + } + } + + } while (mpio_fatentry_plus_plus(f)); + free(f); + } + + if (mem == MPIO_EXTERNAL_MEM) { + /* delete all blocks! */ + + i=0; + while (i < sm->max_blocks) + { + mpio_io_block_delete_phys(m, mem, (i * BLOCK_SECTORS)); + i++; + + if (progress_callback) + { + if (!abort) + { + abort=(*progress_callback)(i, sm->max_blocks); + if (abort) + debug("received abort signal, but ignoring it!\n"); + } else { + (*progress_callback)(i, sm->max_blocks); + } + } + + + } + + /* generate "defect" first block */ + mpio_io_sector_write(m, mem, MPIO_BLOCK_DEFECT, defect); + + /* format CIS area */ + f = mpio_fatentry_new(m, mem, MPIO_BLOCK_CIS, FTYPE_MUSIC); + /* mpio_io_block_delete(m, mem, f); */ + free(f); + cis = (BYTE *)mpio_cis_gen(); /* hmm, why this cast? */ + mpio_io_sector_write(m, mem, MPIO_BLOCK_CIS, cis); + mpio_io_sector_write(m, mem, MPIO_BLOCK_CIS+1, cis); + free(cis); + + /* generate boot blocks ... */ + mbr = (BYTE *)mpio_mbr_gen(m->external.size); + pbr = (BYTE *)mpio_pbr_gen(m->external.size); + /* ... copy the blocks to internal memory structurs ... */ + memcpy(sm->cis, cis, SECTOR_SIZE); + memcpy(sm->mbr, mbr, SECTOR_SIZE); + memcpy(sm->pbr, pbr, SECTOR_SIZE); + /* ... and set internal administration accordingly */ + mpio_mbr_eval(sm); + mpio_pbr_eval(sm); + + if (!sm->fat) /* perhaps we have to build a new FAT */ + sm->fat=malloc(sm->fat_size*SECTOR_SIZE); + mpio_fat_clear(m, mem); + + /* TODO: for external memory we have to work a little "magic" + * to identify and mark "bad blocks" (because we have a set of + * spare ones! + */ + } + + mpio_rootdir_clear(m, mem); + + /* this writes the FAT *and* the root directory */ + mpio_fat_write(m, mem); + + if (progress_callback) + (*progress_callback)(sm->max_cluster+1, sm->max_cluster+1); + + return 0; +} + +int +mpio_file_del(mpio_t *m, mpio_mem_t mem, mpio_filename_t filename, + mpio_callback_t progress_callback) +{ + BYTE *p; + mpio_smartmedia_t *sm; + mpio_fatentry_t *f, backup; + DWORD filesize, fsize; + BYTE abort=0; + + MPIO_CHECK_FILENAME(filename); + + if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + + if ((strcmp(filename, "..") == 0) || + (strcmp(filename, ".") == 0)) + { + debugn(2, "directory name not allowed: %s\n", filename); + MPIO_ERR_RETURN(MPIO_ERR_DIR_NAME_ERROR); + } + + /* find file */ + p = mpio_dentry_find_name(m, mem, filename); + if (!p) + p = mpio_dentry_find_name_8_3(m, mem, filename); + + if (p) + f = mpio_dentry_get_startcluster(m, mem, p); + + if (f && p) { + if (mpio_dentry_is_dir(m, mem, p) == MPIO_OK) + { + /* ugly */ + mpio_directory_cd(m, mem, filename); + if (mpio_directory_is_empty(m, mem, sm->cdir) != MPIO_OK) + { + mpio_directory_cd(m, mem, ".."); + MPIO_ERR_RETURN(MPIO_ERR_DIR_NOT_EMPTY); + } else { + mpio_directory_cd(m, mem, ".."); + } + } + + filesize=fsize=mpio_dentry_get_filesize(m, mem, p); + do + { + debugn(2, "sector: %4x\n", f->entry); + + mpio_io_block_delete(m, mem, f); + + if (filesize != fsize) + mpio_fatentry_set_free(m, mem, &backup); + + memcpy(&backup, f, sizeof(mpio_fatentry_t)); + + if (filesize > BLOCK_SIZE) + { + filesize -= BLOCK_SIZE; + } else { + filesize -= filesize; + } + + if (progress_callback) + { + if (!abort) + { + abort=(*progress_callback)((fsize-filesize), fsize); + if (abort) + debug("received abort signal, but ignoring it!\n"); + } else { + (*progress_callback)((fsize-filesize), fsize); + } + } + + } while (mpio_fatentry_next_entry(m, mem, f)); +/* mpio_io_block_delete(m, mem, &backup); */ + mpio_fatentry_set_free(m, mem, &backup); + free(f); + + } else { + debugn(2, "unable to locate the file: %s\n", filename); + MPIO_ERR_RETURN(MPIO_ERR_FILE_NOT_FOUND); + } + + mpio_dentry_delete(m, mem, filename); + + return MPIO_OK; +} + +int +mpio_sync(mpio_t *m, mpio_mem_t mem) +{ + mpio_smartmedia_t *sm; + + if (mem == MPIO_INTERNAL_MEM) sm = &m->internal; + if (mem == MPIO_EXTERNAL_MEM) sm = &m->external; + + if (!sm->size) + return 0; + + /* this writes the FAT *and* the root directory */ + return mpio_fat_write(m, mem); +} + +int +mpio_health(mpio_t *m, mpio_mem_t mem, mpio_health_t *r) +{ + mpio_smartmedia_t *sm; + int i, j, zones; + mpio_fatentry_t *f; + + if (mem == MPIO_INTERNAL_MEM) + { + sm = &m->internal; + r->num = sm->chips; + + f = mpio_fatentry_new(m, mem, 0x00, FTYPE_MUSIC); + + for (i=0 ; i < sm->chips; i++) + { + r->data[i].spare = 0; + r->data[i].total = (sm->max_cluster / sm->chips); + r->data[i].broken = 0; + /* now count the broken blocks */ + for(j=0; jdata[i].total; j++) + { + if (mpio_fatentry_is_defect(m, mem, f)) + r->data[i].broken++; + mpio_fatentry_plus_plus(f); + } + } + + free(f); + + return MPIO_OK; + } + + + if (mem == MPIO_EXTERNAL_MEM) + { + sm = &m->external; + + zones = sm->max_cluster / MPIO_ZONE_LBLOCKS + 1; + r->num = zones; + + for(i=0; idata[i].spare = (i?24:22); /* first zone has only 23 due to CIS */ + r->data[i].total = MPIO_ZONE_PBLOCKS; + r->data[i].broken = 0; + /* now count the broken blocks */ + for(j=0; jzonetable[i][j] == MPIO_BLOCK_DEFECT) + r->data[i].broken++; + } + if (r->data[i].spare < r->data[i].broken) + debug("(spare blocks expect trouble!\n"); + } + return MPIO_OK; + } + + return MPIO_ERR_INTERNAL; +} + +int +mpio_memory_dump(mpio_t *m, mpio_mem_t mem) +{ + BYTE block[BLOCK_SIZE]; + int i; + + if (mem == MPIO_INTERNAL_MEM) + { + hexdump(m->internal.fat, m->internal.max_blocks*0x10); + hexdump(m->internal.root->dir, DIR_SIZE); + } + + if (mem == MPIO_EXTERNAL_MEM) + { + hexdump(m->external.spare, m->external.max_blocks*0x10); + hexdump(m->external.fat, m->external.fat_size*SECTOR_SIZE); + hexdump(m->external.root->dir, DIR_SIZE); + } + + for (i = 0 ; i<=0x100 ; i++) + mpio_io_sector_read(m, mem, i, block); + + return 0; +} + +int +mpio_errno(void) +{ + int no = _mpio_errno; + _mpio_errno = 0; + + return no; +} + +char * +mpio_strerror(int err) +{ + int i; + + if (err >= 0) return NULL; + + for (i = 0; i < mpio_error_num; i++) { + if (mpio_errors[i].id == err) + return mpio_errors[i].msg; + } + + return NULL; +} + +void +mpio_perror(char *prefix) +{ + char *msg = mpio_strerror(_mpio_errno); + + if (msg == NULL) return; + + if (prefix) + fprintf(stderr, "%s: %s\n", prefix, msg); + else + fprintf(stderr, "%s\n", msg); +} diff --git a/libmpio/src/mpio.h b/libmpio/src/mpio.h new file mode 100644 index 0000000..1d5ba3c --- /dev/null +++ b/libmpio/src/mpio.h @@ -0,0 +1,218 @@ +#/* -*- linux-c -*- */ + +/* + * $Id: mpio.h,v 1.1 2003/04/23 08:34:15 crunchy Exp $ + * + * Library for USB MPIO-* + * + * Markus Germeier (mager@tzi.de) + * + * uses code from mpio_stat.c by + * Yuji Touya (salmoon@users.sourceforge.net) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * */ + +#ifndef _MPIO_H_ +#define _MPIO_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "defs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + *init and shutdown + */ + +mpio_t *mpio_init(mpio_callback_init_t); +void mpio_close(mpio_t *); + +/* + * request information + */ + +/* get version */ +void mpio_get_info(mpio_t *, mpio_info_t *); +/* get model */ +mpio_model_t mpio_get_model(mpio_t *); +/* retrieves free memory in bytes */ +int mpio_memory_free(mpio_t *, mpio_mem_t, int *free); + +/* + * charset for filename encoding/converting + */ +BYTE *mpio_charset_get(mpio_t *); +BYTE mpio_charset_set(mpio_t *, BYTE *); + +/* + * directory operations + */ + +/* context, memory bank */ +BYTE* mpio_directory_open(mpio_t *, mpio_mem_t); +/* context, memory bank, directory name */ +int mpio_directory_make(mpio_t *, mpio_mem_t, BYTE *); +/* context, memory bank, directory name */ +int mpio_directory_cd(mpio_t *, mpio_mem_t, BYTE *); +/* context, memory bank, directory name buffer space */ +void mpio_directory_pwd(mpio_t *, mpio_mem_t, BYTE pwd[INFO_LINE]); +/* context, dir context */ +BYTE* mpio_dentry_next(mpio_t *, mpio_mem_t, BYTE *); +/* context, dir context */ +int mpio_dentry_get(mpio_t *, mpio_mem_t, BYTE *, BYTE *, int,WORD *, + BYTE *, BYTE *, BYTE *, BYTE *, DWORD *, BYTE *); + +/* + * reading/writing/deleting of files + */ + +int mpio_file_get_as(mpio_t *, mpio_mem_t, mpio_filename_t, + mpio_filename_t,mpio_callback_t); + +/* context, memory bank, filename, callback */ +int mpio_file_get(mpio_t *, mpio_mem_t, mpio_filename_t, mpio_callback_t); + +/* context, memory bank, filename, filetype, callback */ +int mpio_file_put(mpio_t *, mpio_mem_t, mpio_filename_t, mpio_filetype_t, + mpio_callback_t); + +/* context, memory bank, filename, as, filetype, callback */ +int mpio_file_put_as(mpio_t *, mpio_mem_t, mpio_filename_t, + mpio_filename_t, mpio_filetype_t, + mpio_callback_t); + +/* context, memory bank, filename, callback */ +int mpio_file_del(mpio_t *, mpio_mem_t, mpio_filename_t, mpio_callback_t); + +/* + * reading/writing files into memory (used for config+font files) + */ + +/* context, memory bank, filename, callback, pointer to memory */ +/* the needed memory is allocated and the memory pointer is return */ +/* via the "BYTE **" */ + +int mpio_file_get_to_memory(mpio_t *, mpio_mem_t, mpio_filename_t, + mpio_callback_t, BYTE **); + +/* context, memory bank, filename, filetype, callback ... */ +/* ... memory pointer, size of file */ +int mpio_file_put_from_memory(mpio_t *, mpio_mem_t, mpio_filename_t, + mpio_filetype_t, mpio_callback_t, + BYTE *, int); + +/* + * rename a file on the MPIO + */ +/* context, memory bank, filename, filename */ +int mpio_file_rename(mpio_t *, mpio_mem_t, + mpio_filename_t, mpio_filename_t); + +/* + * switch position of two files + */ +/* context, memory bank, filename, filename */ +int mpio_file_switch(mpio_t *, mpio_mem_t, + mpio_filename_t, mpio_filename_t); + +/* Move a named file after a given file. If after==NULL move it + to the top of the list, +*/ + +int mpio_file_move(mpio_t *,mpio_mem_t m,mpio_filename_t,mpio_filename_t); + +/* + * formating a memory (internal mem or external SmartMedia card) + */ + +/* context, memory bank, callback */ +int mpio_memory_format(mpio_t *, mpio_mem_t, mpio_callback_t); + +/* mpio_sync has to be called after every set of mpio_file_{del,put} + * operations to write the current state of FAT and (root) directory. + * This is done explicitly to avoid writing these informations to often + * and thereby exhausting the SmartMedia chips + */ +/* context, memory bank */ +int mpio_sync(mpio_t *, mpio_mem_t); + +/* + * ID3 rewriting support + */ + +/* enable disable ID3 rewriting support */ +BYTE mpio_id3_set(mpio_t *, BYTE); +/* query ID3 rewriting support */ +BYTE mpio_id3_get(mpio_t *); + +/* set format string for rewriting*/ +void mpio_id3_format_set(mpio_t *, BYTE *); +/* get format string for rewriting*/ +void mpio_id3_format_get(mpio_t *, BYTE *); + +/* + * "special" functions + */ + +/* returns health status of selected memory */ +int mpio_health(mpio_t *, mpio_mem_t, mpio_health_t *); + +/* + * error handling + */ + +/* returns error code of last error */ +int mpio_errno(void); + +/* returns the description of the error */ +char * mpio_strerror(int err); + +/* prints the error message of the last error*/ +void mpio_perror(char *prefix); + +/* + * debugging + */ + +/* context, memory bank */ +int mpio_memory_dump(mpio_t *, mpio_mem_t); + +/* + * timeline: + * --------- + * 2004: some functions to change the order of files + * 2005: read mp3 tags of the files + */ + +#ifdef __cplusplus +} +#endif + +#endif /* _MPIO_H_ */ + + diff --git a/libmpio/src/smartmedia.c b/libmpio/src/smartmedia.c new file mode 100644 index 0000000..9b70108 --- /dev/null +++ b/libmpio/src/smartmedia.c @@ -0,0 +1,153 @@ +/* -*- linux-c -*- */ + +/* + * + * $Id: smartmedia.c,v 1.1 2003/04/23 08:34:15 crunchy Exp $ + * + * Library for USB MPIO-* + * + * Markus Germeier (mager@tzi.de) + * + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * */ + +#include +#include + +#include "smartmedia.h" +#include "debug.h" + +mpio_disk_phy_t MPIO_DISK_GEO_001={ 125, 4, 4, 2000 }; +mpio_disk_phy_t MPIO_DISK_GEO_002={ 125, 4, 8, 4000 }; +mpio_disk_phy_t MPIO_DISK_GEO_004={ 250, 4, 8, 8000 }; +mpio_disk_phy_t MPIO_DISK_GEO_008={ 250, 4, 16, 16000 }; +mpio_disk_phy_t MPIO_DISK_GEO_016={ 500, 4, 16, 32000 }; +mpio_disk_phy_t MPIO_DISK_GEO_032={ 500, 8, 16, 64000 }; +mpio_disk_phy_t MPIO_DISK_GEO_064={ 500, 8, 32, 128000 }; +mpio_disk_phy_t MPIO_DISK_GEO_128={ 500,16, 32, 256000 }; + +/* This comes from the Samsung documentation files */ + +/* a small warning: only use this function (mpio_id2mem) in the very + * beginning of MPIO model detection. After that use the values + * of size and chips! -mager + */ + +int +mpio_id2mem(BYTE id) +{ + int i=0; + + switch(id) + { + case 0xea: + i=2; + break; + case 0xe3: /* Samsung */ + case 0xe5: /* Toshiba */ + i=4; + break; + case 0xe6: + i=8; + break; + case 0x73: + i=16; + break; + case 0x75: + i=32; + break; + case 0x76: + i=64; + break; + case 0x79: + i=128; + break; + default: + debug("This should never happen (id2mem)!\n"); + exit (1); + } + return i; +} + +BYTE * +mpio_id2manufacturer(BYTE id) +{ + BYTE *m; + switch(id) + { + case 0xec: + m="Samsung"; + break; + case 0x98: + m="Toshiba"; + break; + default: + m="unknown"; + } + return m; +} + +BYTE +mpio_id_valid(BYTE id) +{ + switch(id) + { + case 0xec: /* Samsung */ + case 0x98: /* Toshiba */ + return 1; + default: + ; + } + + return 0; +} + +void +mpio_id2geo(BYTE id, mpio_disk_phy_t *geo) +{ + switch(id) + { + case 0xea: + *geo = MPIO_DISK_GEO_002; + break; + case 0xe3: /* Samsung */ + case 0xe5: /* Toshiba */ + *geo = MPIO_DISK_GEO_004; + break; + case 0xe6: + *geo = MPIO_DISK_GEO_008; + break; + case 0x73: + *geo = MPIO_DISK_GEO_016; + break; + case 0x75: + *geo = MPIO_DISK_GEO_032; + break; + case 0x76: + *geo = MPIO_DISK_GEO_064; + break; + case 0x79: + *geo = MPIO_DISK_GEO_128; + break; + default: + debug("This should never happen!\n"); + exit (1); + } + + return; +} diff --git a/libmpio/src/smartmedia.h b/libmpio/src/smartmedia.h new file mode 100644 index 0000000..57f3e3e --- /dev/null +++ b/libmpio/src/smartmedia.h @@ -0,0 +1,47 @@ +/* -*- linux-c -*- */ + +/* + * + * $Id: smartmedia.h,v 1.1 2003/04/23 08:34:15 crunchy Exp $ + * + * Library for USB MPIO-* + * + * Markus Germeier (mager@tzi.de) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * */ + +#ifndef _MPIO_SMARTMEDIA_H_ +#define _MPIO_SMARTMEDIA_H_ + +#include "defs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* get our configuration for SmartMedia cards right */ +int mpio_id2mem (BYTE); +BYTE * mpio_id2manufacturer(BYTE); +void mpio_id2geo(BYTE, mpio_disk_phy_t *); +BYTE mpio_id_valid(BYTE); + +#ifdef __cplusplus +} +#endif + +#endif /* _MPIO_SMARTMEDIA_H_ */ diff --git a/ltmain.sh b/ltmain.sh index 2393e14..4fd5fa7 100644 --- a/ltmain.sh +++ b/ltmain.sh @@ -55,8 +55,8 @@ modename="$progname" # Constants. PROGRAM=ltmain.sh PACKAGE=libtool -VERSION=1.4 -TIMESTAMP=" (1.920 2001/04/24 23:26:18)" +VERSION=1.4.1 +TIMESTAMP=" (1.922.2.34 2001/09/03 01:22:13)" default_mode= help="Try \`$progname --help' for more information." @@ -174,6 +174,8 @@ do --mode) prevopt="--mode" prev=mode ;; --mode=*) mode="$optarg" ;; + --preserve-dup-deps) duplicate_deps="yes" ;; + --quiet | --silent) show=: ;; @@ -202,6 +204,11 @@ if test -n "$prevopt"; then exit 1 fi +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + if test -z "$show_help"; then # Infer the operation mode. @@ -615,6 +622,10 @@ compiler." # Now arrange that obj and lo_libobj become the same file $show "(cd $xdir && $LN_S $baseobj $libobj)" if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + $run $rm "$lockfile" + fi exit 0 else error=$? @@ -745,6 +756,7 @@ compiler." linker_flags= dllsearchpath= lib_search_path=`pwd` + inst_prefix_dir= avoid_version=no dlfiles= @@ -875,6 +887,11 @@ compiler." prev= continue ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; release) release="-$arg" prev= @@ -976,6 +993,11 @@ compiler." continue ;; + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) @@ -1031,6 +1053,18 @@ compiler." # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; + *-*-openbsd*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + esac + fi + if test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; esac fi deplibs="$deplibs $arg" @@ -1307,11 +1341,32 @@ compiler." # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do - case "$libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac + if test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi libs="$libs $deplib" done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if test "X$duplicate_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + deplibs= newdependency_libs= newlib_search_path= @@ -1532,9 +1587,11 @@ compiler." tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi tmp_libs="$tmp_libs $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then @@ -1657,9 +1714,11 @@ compiler." # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi tmp_libs="$tmp_libs $deplib" done # for deplib continue @@ -1851,7 +1910,16 @@ compiler." if test "$hardcode_direct" = yes; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then - add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + add_dir= + if test -n "$inst_prefix_dir"; then + case "$libdir" in + [\\/]*) + add_dir="-L$inst_prefix_dir$libdir" + ;; + esac + fi + add_dir="$add_dir -L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in @@ -1861,7 +1929,16 @@ compiler." add="-l$name" else # We cannot seem to hardcode it, guess we'll fake it. - add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + add_dir= + if test -n "$inst_prefix_dir"; then + case "$libdir" in + [\\/]*) + add_dir="-L$inst_prefix_dir$libdir" + ;; + esac + fi + add_dir="$add_dir -L$libdir" add="-l$name" fi @@ -1911,17 +1988,17 @@ compiler." echo "*** Therefore, libtool will create a static module, that should work " echo "*** as long as the dlopening application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then - build_libtool_libs=module - build_old_libs=yes + build_libtool_libs=module + build_old_libs=yes else - build_libtool_libs=no + build_libtool_libs=no fi fi else @@ -1958,9 +2035,11 @@ compiler." tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi tmp_libs="$tmp_libs $deplib" done @@ -2191,7 +2270,7 @@ compiler." # Check that each of the things are valid numbers. case $current in - 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; + [0-9]*) ;; *) $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 @@ -2200,7 +2279,7 @@ compiler." esac case $revision in - 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; + [0-9]*) ;; *) $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 @@ -2209,7 +2288,7 @@ compiler." esac case $age in - 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; + [0-9]*) ;; *) $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 @@ -2312,6 +2391,16 @@ compiler." if test -z "$vinfo" && test -n "$release"; then major= verstring="0.0" + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring="" + ;; + *) + verstring="0.0" + ;; + esac if test "$need_version" = no; then versuffix= else @@ -2408,6 +2497,9 @@ compiler." *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; + *-*-openbsd*) + # Do not include libc due to us having libc/libc_r. + ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then @@ -3287,27 +3379,25 @@ extern \"C\" { #undef lt_preloaded_symbols #if defined (__STDC__) && __STDC__ -# define lt_ptr_t void * +# define lt_ptr void * #else -# define lt_ptr_t char * +# define lt_ptr char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; - lt_ptr_t address; + lt_ptr address; } lt_preloaded_symbols[] = {\ " - sed -n -e 's/^: \([^ ]*\) $/ {\"\1\", (lt_ptr_t) 0},/p' \ - -e 's/^. \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr_t) \&\2},/p' \ - < "$nlist" >> "$output_objdir/$dlsyms" + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" $echo >> "$output_objdir/$dlsyms" "\ - {0, (lt_ptr_t) 0} + {0, (lt_ptr) 0} }; /* This works around a problem in FreeBSD linker */ @@ -3618,8 +3708,9 @@ else # relink executable if necessary if test -n \"\$relink_command\"; then - if (eval \$relink_command); then : + if relink_command_output=\`eval \$relink_command 2>&1\`; then : else + $echo \"\$relink_command_output\" >&2 $rm \"\$progdir/\$file\" exit 1 fi @@ -3823,7 +3914,7 @@ fi\ fi done # Quote the link command for shipping. - relink_command="cd `pwd`; $SHELL $0 --mode=relink $libtool_args" + relink_command="cd `pwd`; $SHELL $0 --mode=relink $libtool_args @inst_prefix_dir@" relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` # Only create the output if not a dry run. @@ -3845,9 +3936,46 @@ fi\ $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit 1 fi - newdependency_libs="$newdependency_libs $libdir/$name" + # We do not want portage's install root ($D) present. Check only for + # this if the .la is being installed. + if test "$installed" = yes && test "$D"; then + eval mynewdependency_lib="`echo "$libdir/$name" |sed -e "s:$D::g" -e 's://:/:g'`" + else + mynewdependency_lib="$libdir/$name" + fi + # Do not add duplicates + if test "$mynewdependency_lib"; then + if test -z "`echo $newdependency_libs |grep -e "$mynewdependency_lib"`"; then + newdependency_libs="$newdependency_libs $mynewdependency_lib" + fi + fi + ;; + *) + if test "$installed" = yes; then + # Rather use S=WORKDIR if our version of portage supports it. + # This is because some ebuild (gcc) do not use $S as buildroot. + if test "$PWORKDIR"; then + S="$PWORKDIR" + fi + # We do not want portage's build root ($S) present. + if test -n "`echo $deplib |grep -e "$S"`" && test "$S"; then + mynewdependency_lib="" + # We do not want portage's install root ($D) present. + elif test -n "`echo $deplib |grep -e "$D"`" && test "$D"; then + eval mynewdependency_lib="`echo "$deplib" |sed -e "s:$D::g" -e 's://:/:g'`" + else + mynewdependency_lib="$deplib" + fi + else + mynewdependency_lib="$deplib" + fi + # Do not add duplicates + if test "$mynewdependency_lib"; then + if test -z "`echo $newdependency_libs |grep -e "$mynewdependency_lib"`"; then + newdependency_libs="$newdependency_libs $mynewdependency_lib" + fi + fi ;; - *) newdependency_libs="$newdependency_libs $deplib" ;; esac done dependency_libs="$newdependency_libs" @@ -3880,6 +4008,10 @@ fi\ case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; esac + # Do not add duplicates + if test "$installed" = yes && test "$D"; then + install_libdir="`echo "$install_libdir" |sed -e "s:$D::g" -e 's://:/:g'`" + fi $echo > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP @@ -4124,12 +4256,30 @@ relink_command=\"$relink_command\"" dir="$dir$objdir" if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | sed "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit 1 + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | sed "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$echo "$relink_command" | sed "s%@inst_prefix_dir@%%"` + fi + $echo "$modename: warning: relinking \`$file'" 1>&2 $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 - continue + exit 1 fi fi @@ -4284,7 +4434,11 @@ relink_command=\"$relink_command\"" if test "$finalize" = yes && test -z "$run"; then tmpdir="/tmp" test -n "$TMPDIR" && tmpdir="$TMPDIR" - tmpdir="$tmpdir/libtool-$$" + tmpdir=`mktemp -d $tmpdir/libtool-XXXXXX 2> /dev/null` + if test $? = 0 ; then : + else + tmpdir="$tmpdir/libtool-$$" + fi if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : else $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 @@ -4368,11 +4522,10 @@ relink_command=\"$relink_command\"" if test -n "$current_libdirs"; then # Maybe just do a dry run. test -n "$run" && current_libdirs=" -n$current_libdirs" - exec $SHELL $0 --finish$current_libdirs - exit 1 + exec_cmd='$SHELL $0 --finish$current_libdirs' + else + exit 0 fi - - exit 0 ;; # libtool finish mode @@ -4575,11 +4728,8 @@ relink_command=\"$relink_command\"" LANG="$save_LANG"; export LANG fi - # Now actually exec the command. - eval "exec \$cmd$args" - - $echo "$modename: cannot exec \$cmd$args" - exit 1 + # Now prepare to actually exec the command. + exec_cmd='"$cmd"$args' else # Display what would be done. if test -n "$shlibpath_var"; then @@ -4641,14 +4791,14 @@ relink_command=\"$relink_command\"" # Don't error if the file doesn't exist and rm -f was used. if (test -L "$file") >/dev/null 2>&1 \ - || (test -h "$file") >/dev/null 2>&1 \ + || (test -h "$file") >/dev/null 2>&1 \ || test -f "$file"; then - : + : elif test -d "$file"; then - exit_status=1 + exit_status=1 continue elif test "$rmforce" = yes; then - continue + continue fi rmfiles="$file" @@ -4744,11 +4894,18 @@ relink_command=\"$relink_command\"" ;; esac - $echo "$modename: invalid operation mode \`$mode'" 1>&2 - $echo "$generic_help" 1>&2 - exit 1 + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 + fi fi # test -z "$show_help" +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit 1 +fi + # We need to display help for each of the modes. case $mode in "") $echo \ diff --git a/missing b/missing index 6a37006..d46f79f 100755 --- a/missing +++ b/missing @@ -1,7 +1,7 @@ #! /bin/sh # Common stub for a few missing GNU programs while installing. -# Copyright (C) 1996, 1997, 1999, 2000, 2002 Free Software Foundation, Inc. -# Originally by Fran,cois Pinard , 1996. +# Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc. +# Franc,ois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -18,37 +18,19 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi -run=: - # In the cases where this matters, `missing' is being run in the # srcdir already. -if test -f configure.ac; then +if test -f configure.in; then configure_ac=configure.ac else configure_ac=configure.in fi -case "$1" in ---run) - # Try to run requested program, and just exit if it succeeds. - run= - shift - "$@" && exit 0 - ;; -esac - -# If it does not exist, or fails to run (possibly an outdated version), -# try to emulate it. case "$1" in -h|--h|--he|--hel|--help) @@ -61,7 +43,6 @@ error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit - --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' @@ -70,15 +51,13 @@ Supported PROGRAM values: automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c - help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file - tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing 0.4 - GNU automake" + echo "missing - GNU libit 0.0" ;; -*) @@ -87,46 +66,31 @@ Supported PROGRAM values: exit 1 ;; - aclocal*) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - fi - + aclocal) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if - you modified \`acinclude.m4' or \`${configure_ac}'. You might want + you modified \`acinclude.m4' or \`$configure_ac'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - fi - echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if - you modified \`${configure_ac}'. You might want to install the + you modified \`$configure_ac'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - fi - echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if - you modified \`acconfig.h' or \`${configure_ac}'. You might want + you modified \`acconfig.h' or \`$configure_ac'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." - files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' $configure_ac` test -z "$files" && files="config.h" touch_files= for f in $files; do @@ -139,15 +103,10 @@ WARNING: \`$1' is missing on your system. You should only need it if touch $touch_files ;; - automake*) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - fi - + automake) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if - you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + you modified \`Makefile.am', \`acinclude.m4' or \`$configure_ac'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | @@ -155,34 +114,6 @@ WARNING: \`$1' is missing on your system. You should only need it if while read f; do touch "$f"; done ;; - autom4te) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - fi - - echo 1>&2 "\ -WARNING: \`$1' is needed, and you do not seem to have it handy on your - system. You might have modified some files without having the - proper tools for further handling them. - You can get \`$1Help2man' as part of \`Autoconf' from any GNU - archive site." - - file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` - test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo "#! /bin/sh" - echo "# Created by GNU Automake missing as a replacement of" - echo "# $ $@" - echo "exit 0" - chmod +x $file - exit 1 - fi - ;; - bison|yacc) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if @@ -236,37 +167,7 @@ WARNING: \`$1' is missing on your system. You should only need it if fi ;; - help2man) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - fi - - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a dependency of a manual page. You may need the - \`Help2man' package in order for those modifications to take - effect. You can get \`Help2man' from any GNU archive site." - - file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` - if test -z "$file"; then - file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` - fi - if [ -f "$file" ]; then - touch $file - else - test -z "$file" || exec >$file - echo ".ab help2man is required to generate this page" - exit 1 - fi - ;; - makeinfo) - if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then - # We have makeinfo, but it failed. - exit 1 - fi - echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file @@ -282,45 +183,6 @@ WARNING: \`$1' is missing on your system. You should only need it if touch $file ;; - tar) - shift - if test -n "$run"; then - echo 1>&2 "ERROR: \`tar' requires --run" - exit 1 - fi - - # We have already tried tar in the generic part. - # Look for gnutar/gtar before invocation to avoid ugly error - # messages. - if (gnutar --version > /dev/null 2>&1); then - gnutar "$@" && exit 0 - fi - if (gtar --version > /dev/null 2>&1); then - gtar "$@" && exit 0 - fi - firstarg="$1" - if shift; then - case "$firstarg" in - *o*) - firstarg=`echo "$firstarg" | sed s/o//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - case "$firstarg" in - *h*) - firstarg=`echo "$firstarg" | sed s/h//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - fi - - echo 1>&2 "\ -WARNING: I can't seem to be able to run \`tar' with the given arguments. - You may want to install GNU tar or Free paxutils, or check the - command line arguments." - exit 1 - ;; - *) echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your diff --git a/mkinstalldirs b/mkinstalldirs index 3457144..7ed85d2 100755 --- a/mkinstalldirs +++ b/mkinstalldirs @@ -4,7 +4,7 @@ # Created: 1993-05-16 # Public domain -# $Id: mkinstalldirs,v 1.1 2002/08/28 16:10:50 salmoon Exp $ +# $Id: mkinstalldirs,v 1.2 2003/04/23 08:34:02 crunchy Exp $ errstatus=0 diff --git a/mpiosh/global.c b/mpiosh/global.c index 0047627..e1215f1 100644 --- a/mpiosh/global.c +++ b/mpiosh/global.c @@ -2,7 +2,7 @@ * * Author: Andreas Buesching * - * $Id: global.c,v 1.11 2003/04/19 23:58:02 germeier Exp $ + * $Id: global.c,v 1.12 2003/04/23 08:34:15 crunchy Exp $ * * Copyright (C) 2001 Andreas Büsching * @@ -125,7 +125,7 @@ struct mpiosh_cmd_t commands[] = { mpiosh_cmd_health, NULL }, { "id3", NULL, "[]", " enable/disable ID3 rewriting support", - mpiosh_cmd_id3, NULL }, + mpiosh_cmd_id3, mpiosh_readline_comp_onoff }, { "id3_format", NULL, "[]", " define/show the format line for ID3 rewriting", mpiosh_cmd_id3_format, NULL }, diff --git a/mpiosh/readline.c b/mpiosh/readline.c index d10209b..afc78c0 100644 --- a/mpiosh/readline.c +++ b/mpiosh/readline.c @@ -2,7 +2,7 @@ * * Author: Andreas Büsching * - * $Id: readline.c,v 1.6 2003/04/06 23:09:20 germeier Exp $ + * $Id: readline.c,v 1.7 2003/04/23 08:34:16 crunchy Exp $ * * Copyright (C) 2001 Andreas Büsching * @@ -38,6 +38,29 @@ mpiosh_readline_init(void) rl_event_hook = mpiosh_readline_cancel; } +char * +mpiosh_readline_comp_onoff(const char *text, int state) +{ + static const char * states[] = { "on", "off", NULL }; + static const char ** st = states; + const char * ret = NULL; + + if (state == 0) { + st = states; + } + + while (*st) { + if (!strncmp(text, *st, strlen(text))) { + ret = *st; + st++; + break; + } + st++; + } + + return (ret ? strdup(ret) : NULL); +} + char * mpiosh_readline_comp_cmd(const char *text, int state) { diff --git a/mpiosh/readline.h b/mpiosh/readline.h index f4deb13..a0bb08a 100644 --- a/mpiosh/readline.h +++ b/mpiosh/readline.h @@ -2,7 +2,7 @@ * * Author: Andreas Büsching * - * $Id: readline.h,v 1.2 2002/10/18 08:39:23 crunchy Exp $ + * $Id: readline.h,v 1.3 2003/04/23 08:34:16 crunchy Exp $ * * Copyright (C) 2001 Andreas Büsching * @@ -38,6 +38,7 @@ void mpiosh_readline_pipe(void); int mpiosh_readline_cancel(void); char *mpiosh_readline_comp_cmd(const char *text, int state); +char *mpiosh_readline_comp_onoff(const char *text, int state); char *mpiosh_readline_comp_mpio_file(const char *text, int state); char *mpiosh_readline_comp_config(const char *text, int state); diff --git a/mplib/AUTHORS b/mplib/AUTHORS deleted file mode 100755 index 1941c3e..0000000 --- a/mplib/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -Stefan Podkowinski, lugburg@netscape.net diff --git a/mplib/COPYING b/mplib/COPYING deleted file mode 100755 index b1e3f5a..0000000 --- a/mplib/COPYING +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/mplib/ChangeLog b/mplib/ChangeLog deleted file mode 100755 index 9166062..0000000 --- a/mplib/ChangeLog +++ /dev/null @@ -1,50 +0,0 @@ -v 1.0 - * fixed alot of memory leaks and some memory handling bugs causing segfaults - - * testsuite: Rewritten completly in C, now in sepperate package for - development only - - * mplib_s.c: id3_lseek_syncword did not reset the offset of the - file descriptor for reading to the beginning of the file each time - invoked. Fixed. - - * mplib-config: Added - - * *.sh: Updated autoconf/libtool scripts - -v 0.6 - * testsuite: Added a testsuite. - - * mp_is_valid_v1_value: Added function that checks for valid v1 values - - * mplib_s.h: Fixed typo in genre list - - * all: Further minor changes - -v 0.5 - * mplib_s.c mplib_c: More robust behavior on reading of malformed tags - - * doc: Improved documentation in texinfo format - - * *.c: Some memory leaks fixed by a patch from Thoralf Baum - -v 0.4 - * mplib_s.c: Overwriting existing v2 tags is now working right - - * mplib_s.c: Prepending new v2 tags does now not result in a lost of some - data at the end of the file - -v 0.3 - * mplib_s.c: a serious bug has been fixed that was responsible for - causing a lost of 128 bytes at the end of a file while writing a v1 tag - - * mplib_s.c: the file descriptor is now keept open after editing v2 tags - - * *.c: adding a v1 tag now works properly with comments greater than 28 chars - -v 0.2 - * *.c: fd's are now closed gracefully - - * mplib.c: mp_convert_to_v2 now works properly - - * all: minor fixes diff --git a/mplib/INSTALL b/mplib/INSTALL deleted file mode 100755 index f448317..0000000 --- a/mplib/INSTALL +++ /dev/null @@ -1,118 +0,0 @@ -This is a generic INSTALL file for utilities distributions. -If this package does not come with, e.g., installable documentation or -data files, please ignore the references to them below. - -To compile this package: - -1. Configure the package for your system. In the directory that this -file is in, type `./configure'. If you're using `csh' on an old -version of System V, you might need to type `sh configure' instead to -prevent `csh' from trying to execute `configure' itself. - -The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation, and -creates the Makefile(s) (one in each subdirectory of the source -directory). In some packages it creates a C header file containing -system-dependent definitions. It also creates a file `config.status' -that you can run in the future to recreate the current configuration. - -Running `configure' takes a minute or two. While it is running, it -prints some messages that tell what it is doing. If you don't want to -see the messages, run `configure' with its standard output redirected -to `/dev/null'; for example, `./configure >/dev/null'. - -To compile the package in a different directory from the one -containing the source code, you must use a version of `make' that -supports the VPATH variable, such as GNU `make'. `cd' to the directory -where you want the object files and executables to go and run -`configure'. `configure' automatically checks for the source code in -the directory that `configure' is in and in `..'. If for some reason -`configure' is not in the source code directory that you are -configuring, then it will report that it can't find the source code. -In that case, run `configure' with the option `--srcdir=DIR', where -DIR is the directory that contains the source code. - -By default, `make install' will install the package's files in -/usr/local/bin, /usr/local/lib, /usr/local/man, etc. You can specify an -installation prefix other than /usr/local by giving `configure' the option -`--prefix=PATH'. Alternately, you can do so by consistently giving a value -for the `prefix' variable when you run `make', e.g., - make prefix=/usr/gnu - make prefix=/usr/gnu install - -You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If -you give `configure' the option `--exec-prefix=PATH' or set the -`make' variable `exec_prefix' to PATH, the package will use PATH as -the prefix for installing programs and libraries. Data files and -documentation will still use the regular prefix. Normally, all files -are installed using the regular prefix. - -Another `configure' option is useful mainly in `Makefile' rules for -updating `config.status' and `Makefile'. The `--no-create' option -figures out the configuration for your system and records it in -`config.status', without actually configuring the package (creating -`Makefile's and perhaps a configuration header file). Later, you can -run `./config.status' to actually configure the package. You can also -give `config.status' the `--recheck' option, which makes it re-run -`configure' with the same arguments you used before. This option is -useful if you change `configure'. - -Some packages pay attention to `--with-PACKAGE' options to `configure', -where PACKAGE is something like `gnu-libc' or `x' (for the X Window System). -The README should mention any --with- options that the package recognizes. - -`configure' ignores any other arguments that you give it. - -If your system requires unusual options for compilation or linking -that `configure' doesn't know about, you can give `configure' initial -values for some variables by setting them in the environment. In -Bourne-compatible shells, you can do that on the command line like -this: - CC='gcc -traditional' DEFS=-D_POSIX_SOURCE ./configure - -The `make' variables that you might want to override with environment -variables when running `configure' are: - -(For these variables, any value given in the environment overrides the -value that `configure' would choose:) -CC C compiler program. - Default is `cc', or `gcc' if `gcc' is in your PATH. -INSTALL Program to use to install files. - Default is `install' if you have it, `cp' otherwise. - -(For these variables, any value given in the environment is added to -the value that `configure' chooses:) -DEFS Configuration options, in the form `-Dfoo -Dbar ...' - Do not use this variable in packages that create a - configuration header file. -LIBS Libraries to link with, in the form `-lfoo -lbar ...' - -If you need to do unusual things to compile the package, we encourage -you to figure out how `configure' could check whether to do them, and -mail diffs or instructions to the address given in the README so we -can include them in the next release. - -2. Type `make' to compile the package. If you want, you can override -the `make' variables CFLAGS and LDFLAGS like this: - - make CFLAGS=-O2 LDFLAGS=-s - -3. If the package comes with self-tests and you want to run them, -type `make check'. If you're not sure whether there are any, try it; -if `make' responds with something like - make: *** No way to make target `check'. Stop. -then the package does not come with self-tests. - -4. Type `make install' to install programs, data files, and -documentation. - -5. You can remove the program binaries and object files from the -source directory by typing `make clean'. To also remove the -Makefile(s), the header file containing system-dependent definitions -(if the package uses one), and `config.status' (all the files that -`configure' created), type `make distclean'. - -The file `configure.in' is used as a template to create `configure' by -a program called `autoconf'. You will only need it if you want to -regenerate `configure' using a newer version of `autoconf'. diff --git a/mplib/Makefile.am b/mplib/Makefile.am deleted file mode 100755 index f268924..0000000 --- a/mplib/Makefile.am +++ /dev/null @@ -1,2 +0,0 @@ -SUBDIRS = src - diff --git a/mplib/NEWS b/mplib/NEWS deleted file mode 100755 index d175f54..0000000 --- a/mplib/NEWS +++ /dev/null @@ -1,2 +0,0 @@ -00-01-30 - mplibs first beta release -02-12-08 - mplibs first stable release diff --git a/mplib/README b/mplib/README deleted file mode 100755 index d6c4de9..0000000 --- a/mplib/README +++ /dev/null @@ -1,53 +0,0 @@ - - mplib -=============================================================================== - - A library for handling ID3 tags - - Written by Stefan Podkowinski, lugburg@netscape.net - - Home: http://sourceforge.net/projects/mplib - - - - When I was starting to write this library MP3 and music was the -lattest killerapp on the internet everybody was talking about. Napster -was the most dominating file sharing tool and the first portable mp3 -players came out ready to be bought by the new tech-friendly .COM -people. - - It's been a few years since that and mplib got stable and the MP3 -format is still arround, allthough beeing declared death by many. You -can't stop the revolution. While I was enjoying and discoverying new -bands and sounds I decided to give something in return, not to the big -mayor labels, but the MP3 community. And yes, I'm still buying CDs -though, more than ever. - - Mplib is written to be very easy to use, fast, cross-platform -capable and small size when shipped with other applications. It's currently -only able to handle common tag fields like artist, comment, etc. out of the -box. I'll include support for more special Id3 fields in v2 tags from -contributors if anyone sends me the nessecarry code. I'm just to lazy -to implement all the 70 frame types (type of informations you can include in a -v2 tag) just on chance somebody could use some of them. If you -think you need to store urgently a 'Musician credit list' or 'Event -timing codes' write me and I will hack you the code if I have the time -for it. - - And yeah, theres a allready a library written by the people who are -responsible for the ID3 standard, consider to use id3lib if you don't -like mplib :-P - - You should start with a short introduction on the API and usage of -mplib you'll find in the download section of the sourceforge project -page. As I wrote above, it was important for me that this libarary is -easy to use, because I think the reading a artist name from a mp3 file -should really not be a big deal. - -Enjoy mplib and send me some feedback, -Stefan Podkowinski (spod), lugburg@netscape.net - - -URL's: -Specifications, id3lib and introductions -http://www.id3.org/ diff --git a/mplib/autogen.sh b/mplib/autogen.sh deleted file mode 100755 index bb5011f..0000000 --- a/mplib/autogen.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -# autogen.sh -# -# Andreas Buesching -# $ID$ - -aclocal && autoconf && autoheader && automake -a - - -# end of autogen.sh diff --git a/mplib/config.guess b/mplib/config.guess deleted file mode 100755 index dff9e48..0000000 --- a/mplib/config.guess +++ /dev/null @@ -1,1317 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. - -timestamp='2001-09-04' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Written by Per Bothner . -# Please send patches to . -# -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. -# -# The plan is that this can be called by configure scripts if you -# don't specify an explicit build system type. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit 0 ;; - --version | -v ) - echo "$version" ; exit 0 ;; - --help | --h* | -h ) - echo "$usage"; exit 0 ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - - -dummy=dummy-$$ -trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 - -# CC_FOR_BUILD -- compiler used by this script. -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int dummy(){}" > $dummy.c ; - for c in cc gcc c89 ; do - ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ; - if test $? = 0 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - rm -f $dummy.c $dummy.o $dummy.rel ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac' - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - *:NetBSD:*:*) - # Netbsd (nbsd) targets should (where applicable) match one or - # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # Determine the machine/vendor (is the vendor relevant). - case "${UNAME_MACHINE}" in - amiga) machine=m68k-unknown ;; - arm32) machine=arm-unknown ;; - atari*) machine=m68k-atari ;; - sun3*) machine=m68k-sun ;; - mac68k) machine=m68k-apple ;; - macppc) machine=powerpc-apple ;; - hp3[0-9][05]) machine=m68k-hp ;; - ibmrt|romp-ibm) machine=romp-ibm ;; - *) machine=${UNAME_MACHINE}-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE}" in - i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k) - eval $set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep __ELF__ >/dev/null - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # The OS release - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit 0 ;; - alpha:OSF1:*:*) - if test $UNAME_RELEASE = "V4.0"; then - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - fi - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - cat <$dummy.s - .data -\$Lformat: - .byte 37,100,45,37,120,10,0 # "%d-%x\n" - - .text - .globl main - .align 4 - .ent main -main: - .frame \$30,16,\$26,0 - ldgp \$29,0(\$27) - .prologue 1 - .long 0x47e03d80 # implver \$0 - lda \$2,-1 - .long 0x47e20c21 # amask \$2,\$1 - lda \$16,\$Lformat - mov \$0,\$17 - not \$1,\$18 - jsr \$26,printf - ldgp \$29,0(\$26) - mov 0,\$16 - jsr \$26,exit - .end main -EOF - eval $set_cc_for_build - $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null - if test "$?" = 0 ; then - case `./$dummy` in - 0-0) - UNAME_MACHINE="alpha" - ;; - 1-0) - UNAME_MACHINE="alphaev5" - ;; - 1-1) - UNAME_MACHINE="alphaev56" - ;; - 1-101) - UNAME_MACHINE="alphapca56" - ;; - 2-303) - UNAME_MACHINE="alphaev6" - ;; - 2-307) - UNAME_MACHINE="alphaev67" - ;; - 2-1307) - UNAME_MACHINE="alphaev68" - ;; - esac - fi - rm -f $dummy.s $dummy - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - exit 0 ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit 0 ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit 0 ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit 0;; - amiga:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit 0 ;; - arc64:OpenBSD:*:*) - echo mips64el-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - arc:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - hkmips:OpenBSD:*:*) - echo mips-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - pmax:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - sgi:OpenBSD:*:*) - echo mips-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - wgrisc:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit 0 ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit 0;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit 0;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit 0 ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit 0 ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - i86pc:SunOS:5.*:*) - echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit 0 ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit 0 ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos${UNAME_RELEASE} - ;; - sun4) - echo sparc-sun-sunos${UNAME_RELEASE} - ;; - esac - exit 0 ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit 0 ;; - sparc*:NetBSD:*) - echo `uname -p`-unknown-netbsd${UNAME_RELEASE} - exit 0 ;; - atari*:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit 0 ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit 0 ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit 0 ;; - sun3*:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mac68k:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mvme68k:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mvme88k:OpenBSD:*:*) - echo m88k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit 0 ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit 0 ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit 0 ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit 0 ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit 0 ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD $dummy.c -o $dummy \ - && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ - && rm -f $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - echo mips-mips-riscos${UNAME_RELEASE} - exit 0 ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit 0 ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit 0 ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit 0 ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit 0 ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit 0 ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] - then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] - then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - else - echo i586-dg-dgux${UNAME_RELEASE} - fi - exit 0 ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit 0 ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit 0 ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit 0 ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit 0 ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit 0 ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit 0 ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit 0 ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - echo rs6000-ibm-aix3.2.5 - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit 0 ;; - *:AIX:*:[45]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit 0 ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit 0 ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit 0 ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit 0 ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit 0 ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit 0 ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit 0 ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit 0 ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - case "${HPUX_REV}" in - 11.[0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - esac ;; - esac - fi ;; - esac - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - - #define _HPUX_SOURCE - #include - #include - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` - if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi - rm -f $dummy.c $dummy - fi ;; - esac - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit 0 ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit 0 ;; - 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - echo unknown-hitachi-hiuxwe2 - exit 0 ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit 0 ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit 0 ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit 0 ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit 0 ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit 0 ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit 0 ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit 0 ;; - hppa*:OpenBSD:*:*) - echo hppa-unknown-openbsd - exit 0 ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit 0 ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit 0 ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit 0 ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit 0 ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit 0 ;; - CRAY*X-MP:*:*:*) - echo xmp-cray-unicos - exit 0 ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY*T3D:*:*:*) - echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; - CRAY-2:*:*:*) - echo cray2-cray-unicos - exit 0 ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit 0 ;; - hp300:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit 0 ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit 0 ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit 0 ;; - *:FreeBSD:*:*) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit 0 ;; - *:OpenBSD:*:*) - echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - exit 0 ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit 0 ;; - i*:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit 0 ;; - i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit 0 ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i386-pc-interix - exit 0 ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit 0 ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit 0 ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - *:GNU:*:*) - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit 0 ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit 0 ;; - arm*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux - exit 0 ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; - mips:Linux:*:*) - case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in - big) echo mips-unknown-linux-gnu && exit 0 ;; - little) echo mipsel-unknown-linux-gnu && exit 0 ;; - esac - ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu - exit 0 ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - exit 0 ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit 0 ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; - esac - exit 0 ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu - exit 0 ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit 0 ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; - x86_64:Linux:*:*) - echo x86_64-unknown-linux-gnu - exit 0 ;; - i*86:Linux:*:*) - # The BFD linker knows what the default object file format is, so - # first see if it will tell us. cd to the root directory to prevent - # problems with other programs or directories called `ld' in the path. - ld_supported_targets=`cd /; ld --help 2>&1 \ - | sed -ne '/supported targets:/!d - s/[ ][ ]*/ /g - s/.*supported targets: *// - s/ .*// - p'` - case "$ld_supported_targets" in - elf32-i386) - TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" - ;; - a.out-i386-linux) - echo "${UNAME_MACHINE}-pc-linux-gnuaout" - exit 0 ;; - coff-i386) - echo "${UNAME_MACHINE}-pc-linux-gnucoff" - exit 0 ;; - "") - # Either a pre-BFD a.out linker (linux-gnuoldld) or - # one that does not give us useful --help. - echo "${UNAME_MACHINE}-pc-linux-gnuoldld" - exit 0 ;; - esac - # Determine whether the default compiler is a.out or elf - eval $set_cc_for_build - cat >$dummy.c < -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif -#ifdef __ELF__ -# ifdef __GLIBC__ -# if __GLIBC__ >= 2 - printf ("%s-pc-linux-gnu\n", argv[1]); -# else - printf ("%s-pc-linux-gnulibc1\n", argv[1]); -# endif -# else - printf ("%s-pc-linux-gnulibc1\n", argv[1]); -# endif -#else - printf ("%s-pc-linux-gnuaout\n", argv[1]); -#endif - return 0; -} -EOF - $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 - rm -f $dummy.c $dummy - test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 - ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - echo i386-sequent-sysv4 - exit 0 ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit 0 ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} - fi - exit 0 ;; - i*86:*:5:[78]*) - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit 0 ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` - (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-pc-sysv32 - fi - exit 0 ;; - i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit 0 ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i386. - echo i386-pc-msdosdjgpp - exit 0 ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit 0 ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit 0 ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit 0 ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit 0 ;; - M68*:*:R3V[567]*:*) - test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; - 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && echo i486-ncr-sysv4.3${OS_REL} && exit 0 - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && echo i486-ncr-sysv4 && exit 0 ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit 0 ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit 0 ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit 0 ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit 0 ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit 0 ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit 0 ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes . - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit 0 ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit 0 ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit 0 ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit 0 ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit 0 ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} - else - echo mips-unknown-sysv${UNAME_RELEASE} - fi - exit 0 ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit 0 ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit 0 ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit 0 ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit 0 ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit 0 ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit 0 ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit 0 ;; - *:Darwin:*:*) - echo `uname -p`-apple-darwin${UNAME_RELEASE} - exit 0 ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - if test "${UNAME_MACHINE}" = "x86pc"; then - UNAME_MACHINE=pc - fi - echo `uname -p`-${UNAME_MACHINE}-nto-qnx - exit 0 ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit 0 ;; - NSR-[KW]:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit 0 ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit 0 ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit 0 ;; - DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit 0 ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "$cputype" = "386"; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit 0 ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit 0 ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit 0 ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit 0 ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit 0 ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit 0 ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit 0 ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit 0 ;; - i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit 0 ;; - i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit 0 ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 -rm -f $dummy.c $dummy - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit 0 ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit 0 ;; - c34*) - echo c34-convex-bsd - exit 0 ;; - c38*) - echo c38-convex-bsd - exit 0 ;; - c4*) - echo c4-convex-bsd - exit 0 ;; - esac -fi - -cat >&2 < in order to provide the needed -information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} -EOF - -exit 1 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/mplib/config.sub b/mplib/config.sub deleted file mode 100755 index 393f13d..0000000 --- a/mplib/config.sub +++ /dev/null @@ -1,1411 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. - -timestamp='2001-09-07' - -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Please send patches to . -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS - -Canonicalize a configuration name. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.sub ($timestamp) - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit 0 ;; - --version | -v ) - echo "$version" ; exit 0 ;; - --help | --h* | -h ) - echo "$usage"; exit 0 ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo $1 - exit 0;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis) - os= - basic_machine=$1 - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ - | c4x | clipper \ - | d10v | d30v | dsp16xx \ - | fr30 \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | i370 | i860 | i960 | ia64 \ - | m32r | m68000 | m68k | m88k | mcore \ - | mips16 | mips64 | mips64el | mips64orion | mips64orionel \ - | mips64vr4100 | mips64vr4100el | mips64vr4300 \ - | mips64vr4300el | mips64vr5000 | mips64vr5000el \ - | mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \ - | mipsisa32 \ - | mn10200 | mn10300 \ - | ns16k | ns32k \ - | openrisc \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ - | pyramid \ - | s390 | s390x \ - | sh | sh[34] | sh[34]eb | shbe | shle \ - | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \ - | stormy16 | strongarm \ - | tahoe | thumb | tic80 | tron \ - | v850 \ - | we32k \ - | x86 | xscale \ - | z8k) - basic_machine=$basic_machine-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12) - # Motorola 68HC11/12. - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alphapca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armv*-* \ - | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c54x-* \ - | clipper-* | cray2-* | cydra-* \ - | d10v-* | d30v-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fr30-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | m32r-* \ - | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | mcore-* \ - | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \ - | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \ - | mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ - | pyramid-* \ - | romp-* | rs6000-* \ - | s390-* | s390x-* \ - | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \ - | sparc-* | sparc64-* | sparc86x-* | sparclite-* \ - | sparcv9-* | sparcv9b-* | stormy16-* | strongarm-* | sv1-* \ - | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ - | v850-* | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \ - | ymp-* \ - | z8k-*) - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | ymp) - basic_machine=ymp-cray - os=-unicos - ;; - cray2) - basic_machine=cray2-cray - os=-unicos - ;; - [cjt]90) - basic_machine=${basic_machine}-cray - os=-unicos - ;; - crds | unos) - basic_machine=m68k-crds - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; -# I'm not sure what "Sysv32" means. Should this be sysv3.2? - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mipsel*-linux*) - basic_machine=mipsel-unknown - os=-linux-gnu - ;; - mips*-linux*) - basic_machine=mips-unknown - os=-linux-gnu - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - mmix*) - basic_machine=mmix-knuth - os=-mmixware - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pentium | p5 | k5 | k6 | nexgen) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon) - basic_machine=i686-pc - ;; - pentiumii | pentium2) - basic_machine=i686-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc) basic_machine=powerpc-unknown - ;; - ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sparclite-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=t3e-cray - os=-unicos - ;; - tic54x | c54x*) - basic_machine=tic54x-unknown - os=-coff - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - windows32) - basic_machine=i386-pc - os=-windows32-msvcrt - ;; - xmp) - basic_machine=xmp-cray - os=-unicos - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - mips) - if [ x$os = x-linux-gnu ]; then - basic_machine=mips-unknown - else - basic_machine=mips-mips - fi - ;; - romp) - basic_machine=romp-ibm - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh3 | sh4 | sh3eb | sh4eb) - basic_machine=sh-unknown - ;; - sparc | sparcv9 | sparcv9b) - basic_machine=sparc-sun - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - c4x*) - basic_machine=c4x-none - os=-coff - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -svr4*) - os=-sysv4 - ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # First accept the basic system types. - # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ - | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* \ - | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto*) - os=-nto-qnx - ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` - ;; - -linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` - ;; - -opened*) - os=-openedition - ;; - -wince*) - os=-wince - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -ns2 ) - os=-nextstep2 - ;; - -nsk*) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - pdp10-*) - os=-tops20 - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 - ;; - m68*-cisco) - os=-aout - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-be) - os=-beos - ;; - *-ibm) - os=-aix - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -aix*) - vendor=ibm - ;; - -beos*) - vendor=be - ;; - -hpux*) - vendor=hp - ;; - -mpeix*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs* | -opened*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -vxsim* | -vxworks*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - vendor=atari - ;; - -vos*) - vendor=stratus - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os -exit 0 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/mplib/configure.in b/mplib/configure.in deleted file mode 100755 index b2f2d3d..0000000 --- a/mplib/configure.in +++ /dev/null @@ -1,39 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -AC_INIT(src/mplib.c) -AM_INIT_AUTOMAKE(mplib, 1.0.1) -AM_CONFIG_HEADER(config.h) - -dnl Checks for programs. -AC_ISC_POSIX -AC_PROG_CC -AC_PROG_AWK - -dnl libraries -AM_DISABLE_SHARED -AM_PROG_LIBTOOL - -dnl Checks for header files. -AC_HEADER_STDC -AC_CHECK_HEADERS(unistd.h strings.h) - -dnl Checks for typedefs, structures, and compiler characteristics. -AC_C_CONST -AC_TYPE_SIZE_T - -dnl Checks for library functions. -AC_CHECK_FUNCS(strtol,,AC_MSG_WARN([Your system lacks 'strtol' function - falling back to atoi which will result in a binary that is not able to check invalid user input on numbers])) - -dnl compile time options -AC_ARG_ENABLE(profiling, [ --enable-profiling enable collecting of gprof profiling data for debuging purposes]) - -if test "$enable_profiling"; then - CFLAGS="-pg -a $CFLAGS" - LDADD="-pg -a $LDADD" -fi - -dnl config testsuite if exists -if test -d "testsuite"; then - AC_CONFIG_SUBDIRS(testsuite) -fi - -AC_OUTPUT(Makefile src/Makefile mplib-config) diff --git a/mplib/depcomp b/mplib/depcomp deleted file mode 100755 index 6589965..0000000 --- a/mplib/depcomp +++ /dev/null @@ -1,411 +0,0 @@ -#! /bin/sh - -# depcomp - compile a program generating dependencies as side-effects -# Copyright 1999, 2000 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Originally written by Alexandre Oliva . - -if test -z "$depmode" || test -z "$source" || test -z "$object"; then - echo "depcomp: Variables source, object and depmode must be set" 1>&2 - exit 1 -fi -# `libtool' can also be set to `yes' or `no'. - -depfile=${depfile-`echo "$object" | sed 's,\([^/]*\)$,.deps/\1,;s/\.\([^.]*\)$/.P\1/'`} -tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} - -rm -f "$tmpdepfile" - -# Some modes work just like other modes, but use different flags. We -# parameterize here, but still list the modes in the big case below, -# to make depend.m4 easier to write. Note that we *cannot* use a case -# here, because this file can only contain one case statement. -if test "$depmode" = hp; then - # HP compiler uses -M and no extra arg. - gccflag=-M - depmode=gcc -fi - -if test "$depmode" = dashXmstdout; then - # This is just like dashmstdout with a different argument. - dashmflag=-xM - depmode=dashmstdout -fi - -case "$depmode" in -gcc3) -## gcc 3 implements dependency tracking that does exactly what -## we want. Yay! Note: for some reason libtool 1.4 doesn't like -## it if -MD -MP comes after the -MF stuff. Hmm. - "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - mv "$tmpdepfile" "$depfile" - ;; - -gcc) -## There are various ways to get dependency output from gcc. Here's -## why we pick this rather obscure method: -## - Don't want to use -MD because we'd like the dependencies to end -## up in a subdir. Having to rename by hand is ugly. -## (We might end up doing this anyway to support other compilers.) -## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like -## -MM, not -M (despite what the docs say). -## - Using -M directly means running the compiler twice (even worse -## than renaming). - if test -z "$gccflag"; then - gccflag=-MD, - fi - "$@" -Wp,"$gccflag$tmpdepfile" - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -## The second -e expression handles DOS-style file names with drive letters. - sed -e 's/^[^:]*: / /' \ - -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" -## This next piece of magic avoids the `deleted header file' problem. -## The problem is that when a header file which appears in a .P file -## is deleted, the dependency causes make to die (because there is -## typically no way to rebuild the header). We avoid this by adding -## dummy dependencies for each header file. Too bad gcc doesn't do -## this for us directly. - tr ' ' ' -' < "$tmpdepfile" | -## Some versions of gcc put a space before the `:'. On the theory -## that the space means something, we add a space to the output as -## well. -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -hp) - # This case exists only to let depend.m4 do its work. It works by - # looking at the text of this script. This case will never be run, - # since it is checked for above. - exit 1 - ;; - -sgi) - if test "$libtool" = yes; then - "$@" "-Wp,-MDupdate,$tmpdepfile" - else - "$@" -MDupdate "$tmpdepfile" - fi - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - rm -f "$depfile" - - if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files - echo "$object : \\" > "$depfile" - - # Clip off the initial element (the dependent). Don't try to be - # clever and replace this with sed code, as IRIX sed won't handle - # lines with more than a fixed number of characters (4096 in - # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; - # the IRIX cc adds comments like `#:fec' to the end of the - # dependency line. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ - tr ' -' ' ' >> $depfile - echo >> $depfile - - # The second pass generates a dummy entry for each header file. - tr ' ' ' -' < "$tmpdepfile" \ - | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ - >> $depfile - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -aix) - # The C for AIX Compiler uses -M and outputs the dependencies - # in a .u file. This file always lives in the current directory. - # Also, the AIX compiler puts `$object:' at the start of each line; - # $object doesn't have directory information. - stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'` - tmpdepfile="$stripped.u" - outname="$stripped.o" - if test "$libtool" = yes; then - "$@" -Wc,-M - else - "$@" -M - fi - - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile" - exit $stat - fi - - if test -f "$tmpdepfile"; then - # Each line is of the form `foo.o: dependent.h'. - # Do two passes, one to just change these to - # `$object: dependent.h' and one to simply `dependent.h:'. - sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" - sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" - else - # The sourcefile does not contain any dependencies, so just - # store a dummy comment line, to avoid errors with the Makefile - # "include basename.Plo" scheme. - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -tru64) - # The Tru64 AIX compiler uses -MD to generate dependencies as a side - # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. - # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put - # dependencies in `foo.d' instead, so we check for that too. - # Subdirectories are respected. - - tmpdepfile1="$object.d" - tmpdepfile2=`echo "$object" | sed -e 's/.o$/.d/'` - if test "$libtool" = yes; then - "$@" -Wc,-MD - else - "$@" -MD - fi - - stat=$? - if test $stat -eq 0; then : - else - rm -f "$tmpdepfile1" "$tmpdepfile2" - exit $stat - fi - - if test -f "$tmpdepfile1"; then - tmpdepfile="$tmpdepfile1" - else - tmpdepfile="$tmpdepfile2" - fi - if test -f "$tmpdepfile"; then - sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" - # That's a space and a tab in the []. - sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" - else - echo "#dummy" > "$depfile" - fi - rm -f "$tmpdepfile" - ;; - -#nosideeffect) - # This comment above is used by automake to tell side-effect - # dependency tracking mechanisms from slower ones. - -dashmstdout) - # Important note: in order to support this mode, a compiler *must* - # always write the proprocessed file to stdout, regardless of -o, - # because we must use -o when running libtool. - test -z "$dashmflag" && dashmflag=-M - ( IFS=" " - case " $* " in - *" --mode=compile "*) # this is libtool, let us make it quiet - for arg - do # cycle over the arguments - case "$arg" in - "--mode=compile") - # insert --quiet before "--mode=compile" - set fnord "$@" --quiet - shift # fnord - ;; - esac - set fnord "$@" "$arg" - shift # fnord - shift # "$arg" - done - ;; - esac - "$@" $dashmflag | sed 's:^[^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" - ) & - proc=$! - "$@" - stat=$? - wait "$proc" - if test "$stat" != 0; then exit $stat; fi - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - tr ' ' ' -' < "$tmpdepfile" | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -dashXmstdout) - # This case only exists to satisfy depend.m4. It is never actually - # run, as this mode is specially recognized in the preamble. - exit 1 - ;; - -makedepend) - # X makedepend - ( - shift - cleared=no - for arg in "$@"; do - case $cleared in no) - set ""; shift - cleared=yes - esac - case "$arg" in - -D*|-I*) - set fnord "$@" "$arg"; shift;; - -*) - ;; - *) - set fnord "$@" "$arg"; shift;; - esac - done - obj_suffix="`echo $object | sed 's/^.*\././'`" - touch "$tmpdepfile" - ${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@" - ) & - proc=$! - "$@" - stat=$? - wait "$proc" - if test "$stat" != 0; then exit $stat; fi - rm -f "$depfile" - cat < "$tmpdepfile" > "$depfile" - tail +3 "$tmpdepfile" | tr ' ' ' -' | \ -## Some versions of the HPUX 10.20 sed can't process this invocation -## correctly. Breaking it into two sed invocations is a workaround. - sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" "$tmpdepfile".bak - ;; - -cpp) - # Important note: in order to support this mode, a compiler *must* - # always write the proprocessed file to stdout, regardless of -o, - # because we must use -o when running libtool. - ( IFS=" " - case " $* " in - *" --mode=compile "*) - for arg - do # cycle over the arguments - case $arg in - "--mode=compile") - # insert --quiet before "--mode=compile" - set fnord "$@" --quiet - shift # fnord - ;; - esac - set fnord "$@" "$arg" - shift # fnord - shift # "$arg" - done - ;; - esac - "$@" -E | - sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | - sed '$ s: \\$::' > "$tmpdepfile" - ) & - proc=$! - "$@" - stat=$? - wait "$proc" - if test "$stat" != 0; then exit $stat; fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - cat < "$tmpdepfile" >> "$depfile" - sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -msvisualcpp) - # Important note: in order to support this mode, a compiler *must* - # always write the proprocessed file to stdout, regardless of -o, - # because we must use -o when running libtool. - ( IFS=" " - case " $* " in - *" --mode=compile "*) - for arg - do # cycle over the arguments - case $arg in - "--mode=compile") - # insert --quiet before "--mode=compile" - set fnord "$@" --quiet - shift # fnord - ;; - esac - set fnord "$@" "$arg" - shift # fnord - shift # "$arg" - done - ;; - esac - "$@" -E | - sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" - ) & - proc=$! - "$@" - stat=$? - wait "$proc" - if test "$stat" != 0; then exit $stat; fi - rm -f "$depfile" - echo "$object : \\" > "$depfile" - . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" - echo " " >> "$depfile" - . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" - rm -f "$tmpdepfile" - ;; - -none) - exec "$@" - ;; - -*) - echo "Unknown depmode $depmode" 1>&2 - exit 1 - ;; -esac - -exit 0 diff --git a/mplib/install-sh b/mplib/install-sh deleted file mode 100755 index e9de238..0000000 --- a/mplib/install-sh +++ /dev/null @@ -1,251 +0,0 @@ -#!/bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5 (mit/util/scripts/install.sh). -# -# Copyright 1991 by the Massachusetts Institute of Technology -# -# Permission to use, copy, modify, distribute, and sell this software and its -# documentation for any purpose is hereby granted without fee, provided that -# the above copyright notice appear in all copies and that both that -# copyright notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in advertising or -# publicity pertaining to distribution of the software without specific, -# written prior permission. M.I.T. makes no representations about the -# suitability of this software for any purpose. It is provided "as is" -# without express or implied warranty. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. It can only install one file at a time, a restriction -# shared with many OS's install programs. - - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -transformbasename="" -transform_arg="" -instcmd="$mvprog" -chmodcmd="$chmodprog 0755" -chowncmd="" -chgrpcmd="" -stripcmd="" -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src="" -dst="" -dir_arg="" - -while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd="$stripprog" - shift - continue;; - - -t=*) transformarg=`echo $1 | sed 's/-t=//'` - shift - continue;; - - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; - esac -done - -if [ x"$src" = x ] -then - echo "install: no input file specified" - exit 1 -else - true -fi - -if [ x"$dir_arg" != x ]; then - dst=$src - src="" - - if [ -d $dst ]; then - instcmd=: - chmodcmd="" - else - instcmd=mkdir - fi -else - -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - true - else - echo "install: $src does not exist" - exit 1 - fi - - if [ x"$dst" = x ] - then - echo "install: no destination specified" - exit 1 - else - true - fi - -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - - if [ -d $dst ] - then - dst="$dst"/`basename $src` - else - true - fi -fi - -## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - -# Make sure that the destination directory exists. -# this part is taken from Noah Friedman's mkinstalldirs script - -# Skip lots of stat calls in the usual case. -if [ ! -d "$dstdir" ]; then -defaultIFS=' -' -IFS="${IFS-${defaultIFS}}" - -oIFS="${IFS}" -# Some sh's can't handle IFS=/ for some reason. -IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" - -pathcomp='' - -while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" - shift - - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" - else - true - fi - - pathcomp="${pathcomp}/" -done -fi - -if [ x"$dir_arg" != x ] -then - $doit $instcmd $dst && - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi -else - -# If we're going to rename the final executable, determine the name now. - - if [ x"$transformarg" = x ] - then - dstfile=`basename $dst` - else - dstfile=`basename $dst $transformbasename | - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" = x ] - then - dstfile=`basename $dst` - else - true - fi - -# Make a temp file name in the proper directory. - - dsttmp=$dstdir/#inst.$$# - -# Move or copy the file name to the temp name - - $doit $instcmd $src $dsttmp && - - trap "rm -f ${dsttmp}" 0 && - -# and set any options; do chmod last to preserve setuid bits - -# If any of these fail, we abort the whole thing. If we want to -# ignore errors from any of these, just make sure not to ignore -# errors from the above "$doit $instcmd $src $dsttmp" command. - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && - -# Now rename the file to the real destination. - - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile - -fi && - - -exit 0 diff --git a/mplib/ltconfig b/mplib/ltconfig deleted file mode 100755 index a01334f..0000000 --- a/mplib/ltconfig +++ /dev/null @@ -1,3078 +0,0 @@ -#! /bin/sh - -# ltconfig - Create a system-specific libtool. -# Copyright (C) 1996-1999 Free Software Foundation, Inc. -# Originally by Gordon Matzigkeit , 1996 -# -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# A lot of this script is taken from autoconf-2.10. - -# Check that we are running under the correct shell. -SHELL=${CONFIG_SHELL-/bin/sh} -echo=echo -if test "X$1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X$1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then - # Yippee, $echo works! - : -else - # Restart under the correct shell. - exec "$SHELL" "$0" --no-reexec ${1+"$@"} -fi - -if test "X$1" = X--fallback-echo; then - # used as fallback echo - shift - cat </dev/null`} - case X$UNAME in - *-DOS) PATH_SEPARATOR=';' ;; - *) PATH_SEPARATOR=':' ;; - esac -fi - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi - -if test "X${echo_test_string+set}" != Xset; then - # find a string as large as possible, as long as the shell can cope with it - for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do - # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... - if (echo_test_string="`eval $cmd`") 2>/dev/null && - echo_test_string="`eval $cmd`" && - (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null; then - break - fi - done -fi - -if test "X`($echo '\t') 2>/dev/null`" != 'X\t' || - test "X`($echo "$echo_test_string") 2>/dev/null`" != X"$echo_test_string"; then - # The Solaris, AIX, and Digital Unix default echo programs unquote - # backslashes. This makes it impossible to quote backslashes using - # echo "$something" | sed 's/\\/\\\\/g' - # - # So, first we look for a working echo in the user's PATH. - - IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" - for dir in $PATH /usr/ucb; do - if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && - test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && - test "X`($dir/echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then - echo="$dir/echo" - break - fi - done - IFS="$save_ifs" - - if test "X$echo" = Xecho; then - # We didn't find a better echo, so look for alternatives. - if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && - test "X`(print -r "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then - # This shell has a builtin print -r that does the trick. - echo='print -r' - elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && - test "X$CONFIG_SHELL" != X/bin/ksh; then - # If we have ksh, try running ltconfig again with it. - ORIGINAL_CONFIG_SHELL="${CONFIG_SHELL-/bin/sh}" - export ORIGINAL_CONFIG_SHELL - CONFIG_SHELL=/bin/ksh - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" --no-reexec ${1+"$@"} - else - # Try using printf. - echo='printf "%s\n"' - if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && - test "X`($echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then - # Cool, printf works - : - elif test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && - test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then - CONFIG_SHELL="$ORIGINAL_CONFIG_SHELL" - export CONFIG_SHELL - SHELL="$CONFIG_SHELL" - export SHELL - echo="$CONFIG_SHELL $0 --fallback-echo" - elif test "X`("$CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && - test "X`("$CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then - echo="$CONFIG_SHELL $0 --fallback-echo" - else - # maybe with a smaller string... - prev=: - - for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do - if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null; then - break - fi - prev="$cmd" - done - - if test "$prev" != 'sed 50q "$0"'; then - echo_test_string=`eval $prev` - export echo_test_string - exec "${ORIGINAL_CONFIG_SHELL}" "$0" ${1+"$@"} - else - # Oops. We lost completely, so just stick with echo. - echo=echo - fi - fi - fi - fi -fi - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='sed -e s/^X//' -sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# The name of this program. -progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'` - -# Constants: -PROGRAM=ltconfig -PACKAGE=libtool -VERSION=1.3.4 -TIMESTAMP=" (1.385.2.196 1999/12/07 21:47:57)" -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -rm="rm -f" - -help="Try \`$progname --help' for more information." - -# Global variables: -default_ofile=libtool -can_build_shared=yes -enable_shared=yes -# All known linkers require a `.a' archive for static linking (except M$VC, -# which needs '.lib'). -enable_static=yes -enable_fast_install=yes -enable_dlopen=unknown -enable_win32_dll=no -ltmain= -silent= -srcdir= -ac_config_guess= -ac_config_sub= -host= -nonopt= -ofile="$default_ofile" -verify_host=yes -with_gcc=no -with_gnu_ld=no -need_locks=yes -ac_ext=c -objext=o -libext=a -exeext= -cache_file= - -old_AR="$AR" -old_CC="$CC" -old_CFLAGS="$CFLAGS" -old_CPPFLAGS="$CPPFLAGS" -old_LDFLAGS="$LDFLAGS" -old_LD="$LD" -old_LN_S="$LN_S" -old_LIBS="$LIBS" -old_NM="$NM" -old_RANLIB="$RANLIB" -old_DLLTOOL="$DLLTOOL" -old_OBJDUMP="$OBJDUMP" -old_AS="$AS" - -# Parse the command line options. -args= -prev= -for option -do - case "$option" in - -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - eval "$prev=\$option" - prev= - continue - fi - - case "$option" in - --help) cat <&2 - echo "$help" 1>&2 - exit 1 - ;; - - *) - if test -z "$ltmain"; then - ltmain="$option" - elif test -z "$host"; then -# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1 -# if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then -# echo "$progname: warning \`$option' is not a valid host type" 1>&2 -# fi - host="$option" - else - echo "$progname: too many arguments" 1>&2 - echo "$help" 1>&2 - exit 1 - fi ;; - esac -done - -if test -z "$ltmain"; then - echo "$progname: you must specify a LTMAIN file" 1>&2 - echo "$help" 1>&2 - exit 1 -fi - -if test ! -f "$ltmain"; then - echo "$progname: \`$ltmain' does not exist" 1>&2 - echo "$help" 1>&2 - exit 1 -fi - -# Quote any args containing shell metacharacters. -ltconfig_args= -for arg -do - case "$arg" in - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ltconfig_args="$ltconfig_args '$arg'" ;; - *) ltconfig_args="$ltconfig_args $arg" ;; - esac -done - -# A relevant subset of AC_INIT. - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 5 compiler messages saved in config.log -# 6 checking for... messages and results -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>>./config.log - -# NLS nuisances. -# Only set LANG and LC_ALL to C if already set. -# These must not be set unconditionally because not all systems understand -# e.g. LANG=C (notably SCO). -if test "X${LC_ALL+set}" = Xset; then LC_ALL=C; export LC_ALL; fi -if test "X${LANG+set}" = Xset; then LANG=C; export LANG; fi - -if test -n "$cache_file" && test -r "$cache_file"; then - echo "loading cache $cache_file within ltconfig" - . $cache_file -fi - -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - -if test -z "$srcdir"; then - # Assume the source directory is the same one as the path to LTMAIN. - srcdir=`$echo "X$ltmain" | $Xsed -e 's%/[^/]*$%%'` - test "$srcdir" = "$ltmain" && srcdir=. -fi - -trap "$rm conftest*; exit 1" 1 2 15 -if test "$verify_host" = yes; then - # Check for config.guess and config.sub. - ac_aux_dir= - for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/config.guess; then - ac_aux_dir=$ac_dir - break - fi - done - if test -z "$ac_aux_dir"; then - echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2 - echo "$help" 1>&2 - exit 1 - fi - ac_config_guess=$ac_aux_dir/config.guess - ac_config_sub=$ac_aux_dir/config.sub - - # Make sure we can run config.sub. - if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then : - else - echo "$progname: cannot run $ac_config_sub" 1>&2 - echo "$help" 1>&2 - exit 1 - fi - - echo $ac_n "checking host system type""... $ac_c" 1>&6 - - host_alias=$host - case "$host_alias" in - "") - if host_alias=`$SHELL $ac_config_guess`; then : - else - echo "$progname: cannot guess host type; you must specify one" 1>&2 - echo "$help" 1>&2 - exit 1 - fi ;; - esac - host=`$SHELL $ac_config_sub $host_alias` - echo "$ac_t$host" 1>&6 - - # Make sure the host verified. - test -z "$host" && exit 1 - -elif test -z "$host"; then - echo "$progname: you must specify a host type if you use \`--no-verify'" 1>&2 - echo "$help" 1>&2 - exit 1 -else - host_alias=$host -fi - -# Transform linux* to *-*-linux-gnu*, to support old configure scripts. -case "$host_os" in -linux-gnu*) ;; -linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` -esac - -host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` - -case "$host_os" in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR cru $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -# Set a sane default for `AR'. -test -z "$AR" && AR=ar - -# Set a sane default for `OBJDUMP'. -test -z "$OBJDUMP" && OBJDUMP=objdump - -# If RANLIB is not set, then run the test. -if test "${RANLIB+set}" != "set"; then - result=no - - echo $ac_n "checking for ranlib... $ac_c" 1>&6 - IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" - for dir in $PATH; do - test -z "$dir" && dir=. - if test -f $dir/ranlib || test -f $dir/ranlib$ac_exeext; then - RANLIB="ranlib" - result="ranlib" - break - fi - done - IFS="$save_ifs" - - echo "$ac_t$result" 1>&6 -fi - -if test -n "$RANLIB"; then - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" - old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" -fi - -# Set sane defaults for `DLLTOOL', `OBJDUMP', and `AS', used on cygwin. -test -z "$DLLTOOL" && DLLTOOL=dlltool -test -z "$OBJDUMP" && OBJDUMP=objdump -test -z "$AS" && AS=as - -# Check to see if we are using GCC. -if test "$with_gcc" != yes || test -z "$CC"; then - # If CC is not set, then try to find GCC or a usable CC. - if test -z "$CC"; then - echo $ac_n "checking for gcc... $ac_c" 1>&6 - IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" - for dir in $PATH; do - test -z "$dir" && dir=. - if test -f $dir/gcc || test -f $dir/gcc$ac_exeext; then - CC="gcc" - break - fi - done - IFS="$save_ifs" - - if test -n "$CC"; then - echo "$ac_t$CC" 1>&6 - else - echo "$ac_t"no 1>&6 - fi - fi - - # Not "gcc", so try "cc", rejecting "/usr/ucb/cc". - if test -z "$CC"; then - echo $ac_n "checking for cc... $ac_c" 1>&6 - IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" - cc_rejected=no - for dir in $PATH; do - test -z "$dir" && dir=. - if test -f $dir/cc || test -f $dir/cc$ac_exeext; then - if test "$dir/cc" = "/usr/ucb/cc"; then - cc_rejected=yes - continue - fi - CC="cc" - break - fi - done - IFS="$save_ifs" - if test $cc_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same name, so the bogon will be chosen - # first if we set CC to just the name; use the full file name. - shift - set dummy "$dir/cc" "$@" - shift - CC="$@" - fi - fi - - if test -n "$CC"; then - echo "$ac_t$CC" 1>&6 - else - echo "$ac_t"no 1>&6 - fi - - if test -z "$CC"; then - echo "$progname: error: no acceptable cc found in \$PATH" 1>&2 - exit 1 - fi - fi - - # Now see if the compiler is really GCC. - with_gcc=no - echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6 - echo "$progname:581: checking whether we are using GNU C" >&5 - - $rm conftest.c - cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - with_gcc=yes - fi - $rm conftest.c - echo "$ac_t$with_gcc" 1>&6 -fi - -# Allow CC to be a program name with arguments. -set dummy $CC -compiler="$2" - -echo $ac_n "checking for object suffix... $ac_c" 1>&6 -$rm conftest* -echo 'int i = 1;' > conftest.c -echo "$progname:603: checking for object suffix" >& 5 -if { (eval echo $progname:604: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; }; then - # Append any warnings to the config.log. - cat conftest.err 1>&5 - - for ac_file in conftest.*; do - case $ac_file in - *.c) ;; - *) objext=`echo $ac_file | sed -e s/conftest.//` ;; - esac - done -else - cat conftest.err 1>&5 - echo "$progname: failed program was:" >&5 - cat conftest.c >&5 -fi -$rm conftest* -echo "$ac_t$objext" 1>&6 - -echo $ac_n "checking for executable suffix... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_cv_exeext="no" - $rm conftest* - echo 'main () { return 0; }' > conftest.c - echo "$progname:629: checking for executable suffix" >& 5 - if { (eval echo $progname:630: \"$ac_link\") 1>&5; (eval $ac_link) 2>conftest.err; }; then - # Append any warnings to the config.log. - cat conftest.err 1>&5 - - for ac_file in conftest.*; do - case $ac_file in - *.c | *.err | *.$objext ) ;; - *) ac_cv_exeext=.`echo $ac_file | sed -e s/conftest.//` ;; - esac - done - else - cat conftest.err 1>&5 - echo "$progname: failed program was:" >&5 - cat conftest.c >&5 - fi - $rm conftest* -fi -if test "X$ac_cv_exeext" = Xno; then - exeext="" -else - exeext="$ac_cv_exeext" -fi -echo "$ac_t$ac_cv_exeext" 1>&6 - -echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6 -pic_flag= -special_shlib_compile_flags= -wl= -link_static_flag= -no_builtin_flag= - -if test "$with_gcc" = yes; then - wl='-Wl,' - link_static_flag='-static' - - case "$host_os" in - beos* | irix5* | irix6* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - aix*) - # Below there is a dirty hack to force normal static linking with -ldl - # The problem is because libdl dynamically linked with both libc and - # libC (AIX C++ library), which obviously doesn't included in libraries - # list by gcc. This cause undefined symbols with -static flags. - # This hack allows C programs to be linked with "-static -ldl", but - # we not sure about C++ programs. - link_static_flag="$link_static_flag ${wl}-lC" - ;; - cygwin* | mingw* | os2*) - # We can build DLLs from non-PIC. - ;; - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - pic_flag='-m68020 -resident32 -malways-restore-a4' - ;; - sysv4*MP*) - if test -d /usr/nec; then - pic_flag=-Kconform_pic - fi - ;; - *) - pic_flag='-fPIC' - ;; - esac -else - # PORTME Check for PIC flags for the system compiler. - case "$host_os" in - aix3* | aix4*) - # All AIX code is PIC. - link_static_flag='-bnso -bI:/lib/syscalls.exp' - ;; - - hpux9* | hpux10* | hpux11*) - # Is there a better link_static_flag that works with the bundled CC? - wl='-Wl,' - link_static_flag="${wl}-a ${wl}archive" - pic_flag='+Z' - ;; - - irix5* | irix6*) - wl='-Wl,' - link_static_flag='-non_shared' - # PIC (with -KPIC) is the default. - ;; - - cygwin* | mingw* | os2*) - # We can build DLLs from non-PIC. - ;; - - osf3* | osf4* | osf5*) - # All OSF/1 code is PIC. - wl='-Wl,' - link_static_flag='-non_shared' - ;; - - sco3.2v5*) - pic_flag='-Kpic' - link_static_flag='-dn' - special_shlib_compile_flags='-belf' - ;; - - solaris*) - pic_flag='-KPIC' - link_static_flag='-Bstatic' - wl='-Wl,' - ;; - - sunos4*) - pic_flag='-PIC' - link_static_flag='-Bstatic' - wl='-Qoption ld ' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - pic_flag='-KPIC' - link_static_flag='-Bstatic' - wl='-Wl,' - ;; - - uts4*) - pic_flag='-pic' - link_static_flag='-Bstatic' - ;; - sysv4*MP*) - if test -d /usr/nec ;then - pic_flag='-Kconform_pic' - link_static_flag='-Bstatic' - fi - ;; - *) - can_build_shared=no - ;; - esac -fi - -if test -n "$pic_flag"; then - echo "$ac_t$pic_flag" 1>&6 - - # Check to make sure the pic_flag actually works. - echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6 - $rm conftest* - echo "int some_variable = 0;" > conftest.c - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $pic_flag -DPIC" - echo "$progname:776: checking if $compiler PIC flag $pic_flag works" >&5 - if { (eval echo $progname:777: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then - # Append any warnings to the config.log. - cat conftest.err 1>&5 - - case "$host_os" in - hpux9* | hpux10* | hpux11*) - # On HP-UX, both CC and GCC only warn that PIC is supported... then they - # create non-PIC objects. So, if there were any warnings, we assume that - # PIC is not supported. - if test -s conftest.err; then - echo "$ac_t"no 1>&6 - can_build_shared=no - pic_flag= - else - echo "$ac_t"yes 1>&6 - pic_flag=" $pic_flag" - fi - ;; - *) - echo "$ac_t"yes 1>&6 - pic_flag=" $pic_flag" - ;; - esac - else - # Append any errors to the config.log. - cat conftest.err 1>&5 - can_build_shared=no - pic_flag= - echo "$ac_t"no 1>&6 - fi - CFLAGS="$save_CFLAGS" - $rm conftest* -else - echo "$ac_t"none 1>&6 -fi - -# Check to see if options -o and -c are simultaneously supported by compiler -echo $ac_n "checking if $compiler supports -c -o file.o... $ac_c" 1>&6 -$rm -r conftest 2>/dev/null -mkdir conftest -cd conftest -$rm conftest* -echo "int some_variable = 0;" > conftest.c -mkdir out -# According to Tom Tromey, Ian Lance Taylor reported there are C compilers -# that will create temporary files in the current directory regardless of -# the output directory. Thus, making CWD read-only will cause this test -# to fail, enabling locking or at least warning the user not to do parallel -# builds. -chmod -w . -save_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -o out/conftest2.o" -echo "$progname:829: checking if $compiler supports -c -o file.o" >&5 -if { (eval echo $progname:830: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.o; then - - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s out/conftest.err; then - echo "$ac_t"no 1>&6 - compiler_c_o=no - else - echo "$ac_t"yes 1>&6 - compiler_c_o=yes - fi -else - # Append any errors to the config.log. - cat out/conftest.err 1>&5 - compiler_c_o=no - echo "$ac_t"no 1>&6 -fi -CFLAGS="$save_CFLAGS" -chmod u+w . -$rm conftest* out/* -rmdir out -cd .. -rmdir conftest -$rm -r conftest 2>/dev/null - -if test x"$compiler_c_o" = x"yes"; then - # Check to see if we can write to a .lo - echo $ac_n "checking if $compiler supports -c -o file.lo... $ac_c" 1>&6 - $rm conftest* - echo "int some_variable = 0;" > conftest.c - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -c -o conftest.lo" - echo "$progname:862: checking if $compiler supports -c -o file.lo" >&5 -if { (eval echo $progname:863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; then - - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - echo "$ac_t"no 1>&6 - compiler_o_lo=no - else - echo "$ac_t"yes 1>&6 - compiler_o_lo=yes - fi - else - # Append any errors to the config.log. - cat conftest.err 1>&5 - compiler_o_lo=no - echo "$ac_t"no 1>&6 - fi - CFLAGS="$save_CFLAGS" - $rm conftest* -else - compiler_o_lo=no -fi - -# Check to see if we can do hard links to lock some files if needed -hard_links="nottested" -if test "$compiler_c_o" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - echo $ac_n "checking if we can lock with hard links... $ac_c" 1>&6 - hard_links=yes - $rm conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$ac_t$hard_links" 1>&6 - $rm conftest* - if test "$hard_links" = no; then - echo "*** WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2 - need_locks=warn - fi -else - need_locks=no -fi - -if test "$with_gcc" = yes; then - # Check to see if options -fno-rtti -fno-exceptions are supported by compiler - echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c" 1>&6 - $rm conftest* - echo "int some_variable = 0;" > conftest.c - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.c" - echo "$progname:914: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 - if { (eval echo $progname:915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then - - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - echo "$ac_t"no 1>&6 - compiler_rtti_exceptions=no - else - echo "$ac_t"yes 1>&6 - compiler_rtti_exceptions=yes - fi - else - # Append any errors to the config.log. - cat conftest.err 1>&5 - compiler_rtti_exceptions=no - echo "$ac_t"no 1>&6 - fi - CFLAGS="$save_CFLAGS" - $rm conftest* - - if test "$compiler_rtti_exceptions" = "yes"; then - no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' - else - no_builtin_flag=' -fno-builtin' - fi - -fi - -# Check for any special shared library compilation flags. -if test -n "$special_shlib_compile_flags"; then - echo "$progname: warning: \`$CC' requires \`$special_shlib_compile_flags' to build shared libraries" 1>&2 - if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$special_shlib_compile_flags[ ]" >/dev/null; then : - else - echo "$progname: add \`$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure" 1>&2 - can_build_shared=no - fi -fi - -echo $ac_n "checking if $compiler static flag $link_static_flag works... $ac_c" 1>&6 -$rm conftest* -echo 'main(){return(0);}' > conftest.c -save_LDFLAGS="$LDFLAGS" -LDFLAGS="$LDFLAGS $link_static_flag" -echo "$progname:958: checking if $compiler static flag $link_static_flag works" >&5 -if { (eval echo $progname:959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then - echo "$ac_t$link_static_flag" 1>&6 -else - echo "$ac_t"none 1>&6 - link_static_flag= -fi -LDFLAGS="$save_LDFLAGS" -$rm conftest* - -if test -z "$LN_S"; then - # Check to see if we can use ln -s, or we need hard links. - echo $ac_n "checking whether ln -s works... $ac_c" 1>&6 - $rm conftest.dat - if ln -s X conftest.dat 2>/dev/null; then - $rm conftest.dat - LN_S="ln -s" - else - LN_S=ln - fi - if test "$LN_S" = "ln -s"; then - echo "$ac_t"yes 1>&6 - else - echo "$ac_t"no 1>&6 - fi -fi - -# Make sure LD is an absolute path. -if test -z "$LD"; then - ac_prog=ld - if test "$with_gcc" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6 - echo "$progname:991: checking for ld used by GCC" >&5 - ac_prog=`($CC -print-prog-name=ld) 2>&5` - case "$ac_prog" in - # Accept absolute paths. - [\\/]* | [A-Za-z]:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the path of ld - ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we are not using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac - elif test "$with_gnu_ld" = yes; then - echo $ac_n "checking for GNU ld... $ac_c" 1>&6 - echo "$progname:1015: checking for GNU ld" >&5 - else - echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 - echo "$progname:1018: checking for non-GNU ld" >&5 - fi - - if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - if "$LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then - test "$with_gnu_ld" != no && break - else - test "$with_gnu_ld" != yes && break - fi - fi - done - IFS="$ac_save_ifs" - fi - - if test -n "$LD"; then - echo "$ac_t$LD" 1>&6 - else - echo "$ac_t"no 1>&6 - fi - - if test -z "$LD"; then - echo "$progname: error: no acceptable ld found in \$PATH" 1>&2 - exit 1 - fi -fi - -# Check to see if it really is or is not GNU ld. -echo $ac_n "checking if the linker ($LD) is GNU ld... $ac_c" 1>&6 -# I'd rather use --version here, but apparently some GNU ld's only accept -v. -if $LD -v 2>&1 &5; then - with_gnu_ld=yes -else - with_gnu_ld=no -fi -echo "$ac_t$with_gnu_ld" 1>&6 - -# See if the linker supports building shared libraries. -echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6 - -allow_undefined_flag= -no_undefined_flag= -need_lib_prefix=unknown -need_version=unknown -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -archive_cmds= -archive_expsym_cmds= -old_archive_from_new_cmds= -export_dynamic_flag_spec= -whole_archive_flag_spec= -thread_safe_flag_spec= -hardcode_libdir_flag_spec= -hardcode_libdir_separator= -hardcode_direct=no -hardcode_minus_L=no -hardcode_shlibpath_var=unsupported -runpath_var= -always_export_symbols=no -export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' -# include_expsyms should be a list of space-separated symbols to be *always* -# included in the symbol list -include_expsyms= -# exclude_expsyms can be an egrep regular expression of symbols to exclude -# it will be wrapped by ` (' and `)$', so one must not match beginning or -# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', -# as well as any symbol that contains `d'. -exclude_expsyms="_GLOBAL_OFFSET_TABLE_" -# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out -# platforms (ab)use it in PIC code, but their linkers get confused if -# the symbol is explicitly referenced. Since portable code cannot -# rely on this symbol name, it's probably fine to never include it in -# preloaded symbol tables. - -case "$host_os" in -cygwin* | mingw*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$with_gcc" != yes; then - with_gnu_ld=no - fi - ;; - -esac - -ld_shlibs=yes -if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # See if GNU ld supports shared libraries. - case "$host_os" in - aix3* | aix4*) - # On AIX, the GNU linker is very broken - ld_shlibs=no - cat <&2 - -*** Warning: the GNU linker, at least up to release 2.9.1, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. - -EOF - ;; - - amigaos*) - archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can use - # them. - ld_shlibs=no - ;; - - beos*) - if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw*) - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - allow_undefined_flag=unsupported - always_export_symbols=yes - - # Extract the symbol export list from an `--export-all' def file, - # then regenerate the def file from the symbol export list, so that - # the compiled dll only exports the symbol export list. - export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ - test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ - $DLLTOOL --export-all --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def $objdir/$soname-ltdll.$objext $libobjs $convenience~ - sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]* ; *//" < $objdir/$soname-def > $export_symbols' - - archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~ - _lt_hint=1; - for symbol in `cat $export_symbols`; do - echo " \$symbol @ \$_lt_hint ; " >> $objdir/$soname-def; - _lt_hint=`expr 1 + \$_lt_hint`; - done~ - test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ - test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ - $CC -Wl,--base-file,$objdir/$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ - $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ - $CC -Wl,--base-file,$objdir/$soname-base $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ - $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ - $CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts' - - old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a' - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - archive_cmds='$LD -Bshareable $libobjs $deplibs $linkopts -o $lib' - # can we support soname and/or expsyms with a.out? -oliva - fi - ;; - - solaris* | sysv5*) - if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -EOF - elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linkopts' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test "$ld_shlibs" = yes; then - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec='${wl}--export-dynamic' - case $host_os in - cygwin* | mingw*) - # dlltool doesn't understand --whole-archive et. al. - whole_archive_flag_spec= - ;; - *) - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= - fi - ;; - esac - fi -else - # PORTME fill in a description of your system's linker (not GNU ld) - case "$host_os" in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $objdir/$soname $libobjs $deplibs $linkopts -bE:$export_symbols -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$with_gcc" = yes && test -z "$link_static_flag"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix4*) - hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib' - hardcode_libdir_separator=':' - if test "$with_gcc" = yes; then - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct=yes - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - shared_flag='-shared' - else - shared_flag='${wl}-bM:SRE' - hardcode_direct=yes - fi - allow_undefined_flag=' ${wl}-berok' - archive_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bexpall ${wl}-bnoentry${allow_undefined_flag}' - archive_expsym_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}' - case "$host_os" in aix4.[01]|aix4.[01].*) - # According to Greg Wooledge, -bexpall is only supported from AIX 4.2 on - always_export_symbols=yes ;; - esac - ;; - - amigaos*) - archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - # see comment about different semantics on the GNU ld section - ld_shlibs=no - ;; - - cygwin* | mingw*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $linkopts `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib /OUT:$oldlib$oldobjs' - fix_srcfile_path='`cygpath -w $srcfile`' - ;; - - freebsd1*) - ld_shlibs=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd*) - archive_cmds='$CC -shared -o $lib $libobjs $deplibs $linkopts' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9* | hpux10* | hpux11*) - case "$host_os" in - hpux9*) archive_cmds='$rm $objdir/$soname~$LD -b +b $install_libdir -o $objdir/$soname $libobjs $deplibs $linkopts~test $objdir/$soname = $lib || mv $objdir/$soname $lib' ;; - *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linkopts' ;; - esac - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_minus_L=yes # Not in the search PATH, but as the default - # location of the library. - export_dynamic_flag_spec='${wl}-E' - ;; - - irix5* | irix6*) - if test "$with_gcc" = yes; then - archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - else - archive_cmds='$LD -shared $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linkopts' # ELF - fi - hardcode_libdir_flag_spec='${wl}-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - openbsd*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $objdir/$libname.def~$echo DATA >> $objdir/$libname.def~$echo " SINGLE NONSHARED" >> $objdir/$libname.def~$echo EXPORTS >> $objdir/$libname.def~emxexp $libobjs >> $objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $linkopts $objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def' - ;; - - osf3*) - if test "$with_gcc" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # As osf3* with the addition of the -msym flag - if test "$with_gcc" = yes; then - allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - - sco3.2v5*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ;; - - solaris*) - no_undefined_flag=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts' - archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case "$host_os" in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; - esac - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linkopts' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv5*) - no_undefined_flag=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts' - archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp' - hardcode_libdir_flag_spec= - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4.2uw2*) - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linkopts' - hardcode_direct=yes - hardcode_minus_L=no - hardcode_shlibpath_var=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; - - unixware7*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac -fi -echo "$ac_t$ld_shlibs" 1>&6 -test "$ld_shlibs" = no && can_build_shared=no - -if test -z "$NM"; then - echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6 - case "$NM" in - [\\/]* | [A-Za-z]:[\\/]*) ;; # Let the user override the test with a path. - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" - for ac_dir in $PATH /usr/ucb /usr/ccs/bin /bin; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - NM="$ac_dir/nm -B" - break - elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - NM="$ac_dir/nm -p" - break - else - NM=${NM="$ac_dir/nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - fi - fi - done - IFS="$ac_save_ifs" - test -z "$NM" && NM=nm - ;; - esac - echo "$ac_t$NM" 1>&6 -fi - -# Check for command to grab the raw symbol name followed by C symbol from nm. -echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6 - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' - -# Transform the above into a raw symbol and a C symbol. -symxfrm='\1 \2\3 \3' - -# Transform an extracted symbol line into a proper C declaration -global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" - -# Define system-specific variables. -case "$host_os" in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw*) - symcode='[ABCDGISTW]' - ;; -hpux*) # Its linker distinguishes data from code symbols - global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'" - ;; -irix*) - symcode='[BCDEGRST]' - ;; -solaris*) - symcode='[BDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then - symcode='[ABCDGISTW]' -fi - -# Try without a prefix undercore, then with it. -for ac_symprfx in "" "_"; do - - # Write the raw and C identifiers. - global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode\)[ ][ ]*\($ac_symprfx\)$sympat$/$symxfrm/p'" - - # Check to see that the pipe works correctly. - pipe_works=no - $rm conftest* - cat > conftest.c <&5 - if { (eval echo $progname:1636: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then - # Now try to grab the symbols. - nlist=conftest.nm - if { echo "$progname:1639: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then - - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if egrep ' nm_test_var$' "$nlist" >/dev/null; then - if egrep ' nm_test_func$' "$nlist" >/dev/null; then - cat < conftest.c -#ifdef __cplusplus -extern "C" { -#endif - -EOF - # Now generate the symbol file. - eval "$global_symbol_to_cdecl"' < "$nlist" >> conftest.c' - - cat <> conftest.c -#if defined (__STDC__) && __STDC__ -# define lt_ptr_t void * -#else -# define lt_ptr_t char * -# define const -#endif - -/* The mapping between symbol names and symbols. */ -const struct { - const char *name; - lt_ptr_t address; -} -lt_preloaded_symbols[] = -{ -EOF - sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$nlist" >> conftest.c - cat <<\EOF >> conftest.c - {0, (lt_ptr_t) 0} -}; - -#ifdef __cplusplus -} -#endif -EOF - # Now try linking the two files. - mv conftest.$objext conftstm.$objext - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" - LIBS="conftstm.$objext" - CFLAGS="$CFLAGS$no_builtin_flag" - if { (eval echo $progname:1691: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then - pipe_works=yes - else - echo "$progname: failed program was:" >&5 - cat conftest.c >&5 - fi - LIBS="$save_LIBS" - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.c >&5 - fi - $rm conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - global_symbol_pipe= - fi -done -if test "$pipe_works" = yes; then - echo "${ac_t}ok" 1>&6 -else - echo "${ac_t}failed" 1>&6 -fi - -if test -z "$global_symbol_pipe"; then - global_symbol_to_cdecl= -fi - -# Check hardcoding attributes. -echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6 -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || \ - test -n "$runpath_var"; then - - # We can hardcode non-existant directories. - if test "$hardcode_direct" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$hardcode_shlibpath_var" != no && - test "$hardcode_minus_L" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -echo "$ac_t$hardcode_action" 1>&6 - - -reload_flag= -reload_cmds='$LD$reload_flag -o $output$reload_objs' -echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6 -# PORTME Some linkers may need a different reload flag. -reload_flag='-r' -echo "$ac_t$reload_flag" 1>&6 -test -n "$reload_flag" && reload_flag=" $reload_flag" - -# PORTME Fill in your ld.so characteristics -library_names_spec= -libname_spec='lib$name' -soname_spec= -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -file_magic_cmd= -file_magic_test_file= -deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [regex]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given egrep regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. -echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6 -case "$host_os" in -aix3*) - version_type=linux - library_names_spec='${libname}${release}.so$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}.so$major' - ;; - -aix4*) - version_type=linux - # AIX has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - # We preserve .a as extension for shared libraries though AIX4.2 - # and later linker supports .so - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.a' - shlibpath_var=LIBPATH - deplibs_check_method=pass_all - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}.so' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - deplibs_check_method=pass_all - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - -bsdi4*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - file_magic_cmd=/usr/bin/file - file_magic_test_file=/shlib/libc.so - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - export_dynamic_flag_spec=-rdynamic - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw*) - version_type=windows - need_version=no - need_lib_prefix=no - if test "$with_gcc" = yes; then - library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a' - else - library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib' - fi - dynamic_linker='Win32 ld.exe' - deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' - file_magic_cmd='${OBJDUMP} -f' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - -freebsd1*) - dynamic_linker=no - ;; - -freebsd*) - objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` - version_type=freebsd-$objformat - case "$version_type" in - freebsd-elf*) - deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' - file_magic_cmd=/usr/bin/file - file_magic_test_file=`echo /usr/lib/libc.so*` - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - deplibs_check_method=unknown - library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case "$host_os" in - freebsd2* | freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - ;; - *) # from 3.2 on - shlibpath_overrides_runpath=no - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - dynamic_linker="$host_os dld.sl" - version_type=sunos - need_lib_prefix=no - need_version=no - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' - soname_spec='${libname}${release}.sl$major' - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -irix5* | irix6*) - version_type=irix - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}.so.$major' - library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major ${libname}${release}.so $libname.so' - case "$host_os" in - irix5*) - libsuff= shlibsuff= - # this will be overridden with pass_all, but let us keep it just in case - deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" - ;; - *) - case "$LD" in # libtool.m4 will add one of these switches to LD - *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - file_magic_cmd=/usr/bin/file - file_magic_test_file=`echo /lib${libsuff}/libc.so*` - deplibs_check_method='pass_all' - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux-gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - file_magic_cmd=/usr/bin/file - file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` - - if test -f /lib/ld.so.1; then - dynamic_linker='GNU ld.so' - else - # Only the GNU ld.so supports shared libraries on MkLinux. - case "$host_cpu" in - powerpc*) dynamic_linker=no ;; - *) dynamic_linker='Linux ld.so' ;; - esac - fi - ;; - -netbsd*) - version_type=sunos - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' - soname_spec='${libname}${release}.so$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - ;; - -openbsd*) - version_type=sunos - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - need_version=no - fi - library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - ;; - -os2*) - libname_spec='$name' - need_lib_prefix=no - library_names_spec='$libname.dll $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_version=no - soname_spec='${libname}${release}.so' - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' - shlibpath_var=LD_LIBRARY_PATH - # this will be overridden with pass_all, but let us keep it just in case - deplibs_check_method='file_magic COFF format alpha shared library' - file_magic_cmd=/usr/bin/file - file_magic_test_file=/shlib/libc.so - deplibs_check_method='pass_all' - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -sco3.2v5*) - version_type=osf - soname_spec='${libname}${release}.so$major' - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - shlibpath_var=LD_LIBRARY_PATH - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - deplibs_check_method="file_magic ELF [0-9][0-9]-bit [LM]SB dynamic lib" - file_magic_cmd=/usr/bin/file - file_magic_test_file=/lib/libc.so - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - version_type=linux - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - case "$host_vendor" in - ncr) - deplibs_check_method='pass_all' - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - file_magic_cmd=/usr/bin/file - file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - esac - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' - soname_spec='${libname}${release}.so$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' - soname_spec='$libname.so.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -*) - dynamic_linker=no - ;; -esac -echo "$ac_t$dynamic_linker" 1>&6 -test "$dynamic_linker" = no && can_build_shared=no - -# Report the final consequences. -echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6 - -# Only try to build win32 dlls if AC_LIBTOOL_WIN32_DLL was used in -# configure.in, otherwise build static only libraries. -case "$host_os" in -cygwin* | mingw* | os2*) - if test x$can_build_shared = xyes; then - test x$enable_win32_dll = xno && can_build_shared=no - echo "checking if package supports dlls... $can_build_shared" 1>&6 - fi -;; -esac - -if test -n "$file_magic_test_file" && test -n "$file_magic_cmd"; then - case "$deplibs_check_method" in - "file_magic "*) - file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - egrep "$file_magic_regex" > /dev/null; then - : - else - cat <&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -EOF - fi ;; - esac -fi - -echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6 -test "$can_build_shared" = "no" && enable_shared=no - -# On AIX, shared libraries and static libraries use the same namespace, and -# are all built from PIC. -case "$host_os" in -aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - -aix4*) - test "$enable_shared" = yes && enable_static=no - ;; -esac - -echo "$ac_t$enable_shared" 1>&6 - -# Make sure either enable_shared or enable_static is yes. -test "$enable_shared" = yes || enable_static=yes - -echo "checking whether to build static libraries... $enable_static" 1>&6 - -if test "$hardcode_action" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - -echo $ac_n "checking for objdir... $ac_c" 1>&6 -rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - objdir=_libs -fi -rmdir .libs 2>/dev/null -echo "$ac_t$objdir" 1>&6 - -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else -if eval "test \"`echo '$''{'lt_cv_dlopen'+set}'`\" != set"; then - lt_cv_dlopen=no lt_cv_dlopen_libs= -echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 -echo "$progname:2212: checking for dlopen in -ldl" >&5 -ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldl $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for dlopen""... $ac_c" 1>&6 -echo "$progname:2252: checking for dlopen" >&5 -if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_dlopen) || defined (__stub___dlopen) -choke me -#else -dlopen(); -#endif - -; return 0; } -EOF -if { (eval echo $progname:2282: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_dlopen=yes" -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_dlopen=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="dlopen" -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6 -echo "$progname:2299: checking for dld_link in -ldld" >&5 -ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldld $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for shl_load""... $ac_c" 1>&6 -echo "$progname:2339: checking for shl_load" >&5 -if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_shl_load) || defined (__stub___shl_load) -choke me -#else -shl_load(); -#endif - -; return 0; } -EOF -if { (eval echo $progname:2369: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_shl_load=yes" -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_shl_load=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'shl_load`\" = yes"; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="shl_load" -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6 -echo "$progname:2387: checking for shl_load in -ldld" >&5 -ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldld $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" -else - echo "$ac_t""no" 1>&6 -fi - - -fi - - -fi - - -fi - - -fi - -fi - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - fi - - case "$lt_cv_dlopen" in - dlopen) -for ac_hdr in dlfcn.h; do -ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "$progname:2452: checking for $ac_hdr" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int fnord = 0; -EOF -ac_try="$ac_compile >/dev/null 2>conftest.out" -{ (eval echo $progname:2462: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi -done - - if test "x$ac_cv_header_dlfcn_h" = xyes; then - CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - fi - eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - LIBS="$lt_cv_dlopen_libs $LIBS" - - echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6 -echo "$progname:2490: checking whether a program can dlopen itself" >&5 -if test "${lt_cv_dlopen_self+set}" = set; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - lt_cv_dlopen_self=cross - else - cat > conftest.c < -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LTDL_GLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LTDL_GLOBAL DL_GLOBAL -# else -# define LTDL_GLOBAL 0 -# endif -#endif - -/* We may have to define LTDL_LAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LTDL_LAZY_OR_NOW -# ifdef RTLD_LAZY -# define LTDL_LAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LTDL_LAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LTDL_LAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LTDL_LAZY_OR_NOW DL_NOW -# else -# define LTDL_LAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -fnord() { int i=42;} -main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); - if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); - if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } - -EOF -if { (eval echo $progname:2544: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null -then - lt_cv_dlopen_self=yes -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - lt_cv_dlopen_self=no -fi -rm -fr conftest* -fi - -fi - -echo "$ac_t""$lt_cv_dlopen_self" 1>&6 - - if test "$lt_cv_dlopen_self" = yes; then - LDFLAGS="$LDFLAGS $link_static_flag" - echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6 -echo "$progname:2563: checking whether a statically linked program can dlopen itself" >&5 -if test "${lt_cv_dlopen_self_static+set}" = set; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - lt_cv_dlopen_self_static=cross - else - cat > conftest.c < -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LTDL_GLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LTDL_GLOBAL DL_GLOBAL -# else -# define LTDL_GLOBAL 0 -# endif -#endif - -/* We may have to define LTDL_LAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LTDL_LAZY_OR_NOW -# ifdef RTLD_LAZY -# define LTDL_LAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LTDL_LAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LTDL_LAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LTDL_LAZY_OR_NOW DL_NOW -# else -# define LTDL_LAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -fnord() { int i=42;} -main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); - if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); - if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } - -EOF -if { (eval echo $progname:2617: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null -then - lt_cv_dlopen_self_static=yes -else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - lt_cv_dlopen_self_static=no -fi -rm -fr conftest* -fi - -fi - -echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6 -fi - ;; - esac - - case "$lt_cv_dlopen_self" in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case "$lt_cv_dlopen_self_static" in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - -# Copy echo and quote the copy, instead of the original, because it is -# used later. -ltecho="$echo" -if test "X$ltecho" = "X$CONFIG_SHELL $0 --fallback-echo"; then - ltecho="$CONFIG_SHELL \$0 --fallback-echo" -fi -LTSHELL="$SHELL" - -LTCONFIG_VERSION="$VERSION" - -# Only quote variables if we're using ltmain.sh. -case "$ltmain" in -*.sh) - # Now quote all the things that may contain metacharacters. - for var in ltecho old_CC old_CFLAGS old_CPPFLAGS \ - old_LD old_LDFLAGS old_LIBS \ - old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS \ - AR CC LD LN_S NM LTSHELL LTCONFIG_VERSION \ - reload_flag reload_cmds wl \ - pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ - thread_safe_flag_spec whole_archive_flag_spec libname_spec \ - library_names_spec soname_spec \ - RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ - old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds postuninstall_cmds \ - file_magic_cmd export_symbols_cmds deplibs_check_method allow_undefined_flag no_undefined_flag \ - finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ - hardcode_libdir_flag_spec hardcode_libdir_separator \ - sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do - - case "$var" in - reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ - postinstall_cmds | postuninstall_cmds | \ - finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) - # Double-quote double-evaled strings. - eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" - ;; - *) - eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" - ;; - esac - done - - case "$ltecho" in - *'\$0 --fallback-echo"') - ltecho=`$echo "X$ltecho" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - - trap "$rm \"$ofile\"; exit 1" 1 2 15 - echo "creating $ofile" - $rm "$ofile" - cat < "$ofile" -#! $SHELL - -# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) -# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh. -# -# Copyright (C) 1996-1999 Free Software Foundation, Inc. -# Originally by Gordon Matzigkeit , 1996 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="sed -e s/^X//" - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi - -### BEGIN LIBTOOL CONFIG -EOF - cfgfile="$ofile" - ;; - -*) - # Double-quote the variables that need it (for aesthetics). - for var in old_CC old_CFLAGS old_CPPFLAGS \ - old_LD old_LDFLAGS old_LIBS \ - old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS; do - eval "$var=\\\"\$var\\\"" - done - - # Just create a config file. - cfgfile="$ofile.cfg" - trap "$rm \"$cfgfile\"; exit 1" 1 2 15 - echo "creating $cfgfile" - $rm "$cfgfile" - cat < "$cfgfile" -# `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file. -# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) -EOF - ;; -esac - -cat <> "$cfgfile" -# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# -# CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\ -# LD=$old_LD LDFLAGS=$old_LDFLAGS LIBS=$old_LIBS \\ -# NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \\ -# DLLTOOL=$old_DLLTOOL OBJDUMP=$old_OBJDUMP AS=$old_AS \\ -# $0$ltconfig_args -# -# Compiler and other test output produced by $progname, useful for -# debugging $progname, is in ./config.log if it exists. - -# The version of $progname that generated this script. -LTCONFIG_VERSION=$LTCONFIG_VERSION - -# Shell to use when invoking shell scripts. -SHELL=$LTSHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host - -# An echo program that does not interpret backslashes. -echo=$ltecho - -# The archiver. -AR=$AR - -# The default C compiler. -CC=$CC - -# The linker used to build libraries. -LD=$LD - -# Whether we need hard or soft links. -LN_S=$LN_S - -# A BSD-compatible nm program. -NM=$NM - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$reload_flag -reload_cmds=$reload_cmds - -# How to pass a linker flag through the compiler. -wl=$wl - -# Object file suffix (normally "o"). -objext="$objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$pic_flag - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$compiler_c_o - -# Can we write directly to a .lo ? -compiler_o_lo=$compiler_o_lo - -# Must we lock files when doing compilation ? -need_locks=$need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$link_static_flag - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$no_builtin_flag - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$export_dynamic_flag_spec - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$whole_archive_flag_spec - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$thread_safe_flag_spec - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$RANLIB -old_archive_cmds=$old_archive_cmds -old_postinstall_cmds=$old_postinstall_cmds -old_postuninstall_cmds=$old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$old_archive_from_new_cmds - -# Commands used to build and install a shared archive. -archive_cmds=$archive_cmds -archive_expsym_cmds=$archive_expsym_cmds -postinstall_cmds=$postinstall_cmds -postuninstall_cmds=$postuninstall_cmds - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$allow_undefined_flag - -# Flag that forces no undefined symbols. -no_undefined_flag=$no_undefined_flag - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$global_symbol_to_cdecl - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$hardcode_libdir_flag_spec - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$hardcode_libdir_separator - -# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$hardcode_direct - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$hardcode_minus_L - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$fix_srcfile_path" - -# Set to yes if exported symbols are required. -always_export_symbols=$always_export_symbols - -# The commands to list exported symbols. -export_symbols_cmds=$export_symbols_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$exclude_expsyms - -# Symbols that must always be exported. -include_expsyms=$include_expsyms - -EOF - -case "$ltmain" in -*.sh) - echo '### END LIBTOOL CONFIG' >> "$ofile" - echo >> "$ofile" - case "$host_os" in - aix3*) - cat <<\EOF >> "$ofile" - -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -EOF - ;; - esac - - # Append the ltmain.sh script. - sed '$q' "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1) - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - - chmod +x "$ofile" - ;; - -*) - # Compile the libtool program. - echo "FIXME: would compile $ltmain" - ;; -esac - -test -n "$cache_file" || exit 0 - -# AC_CACHE_SAVE -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -exit 0 - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: diff --git a/mplib/ltmain.sh b/mplib/ltmain.sh deleted file mode 100755 index 6e5bf36..0000000 --- a/mplib/ltmain.sh +++ /dev/null @@ -1,4984 +0,0 @@ -# ltmain.sh - Provide generalized library-building support services. -# NOTE: Changing this file will not affect anything until you rerun configure. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -# Free Software Foundation, Inc. -# Originally by Gordon Matzigkeit , 1996 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Check that we have a working $echo. -if test "X$1" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift -elif test "X$1" = X--fallback-echo; then - # Avoid inline document here, it may be left over - : -elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then - # Yippee, $echo works! - : -else - # Restart under the correct shell, and then maybe $echo will work. - exec $SHELL "$0" --no-reexec ${1+"$@"} -fi - -if test "X$1" = X--fallback-echo; then - # used as fallback echo - shift - cat <&2 - echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit 1 -fi - -# Global variables. -mode=$default_mode -nonopt= -prev= -prevopt= -run= -show="$echo" -show_help= -execute_dlfiles= -lo2o="s/\\.lo\$/.${objext}/" -o2lo="s/\\.${objext}\$/.lo/" - -# Parse our command line options once, thoroughly. -while test $# -gt 0 -do - arg="$1" - shift - - case $arg in - -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - execute_dlfiles) - execute_dlfiles="$execute_dlfiles $arg" - ;; - *) - eval "$prev=\$arg" - ;; - esac - - prev= - prevopt= - continue - fi - - # Have we seen a non-optional argument yet? - case $arg in - --help) - show_help=yes - ;; - - --version) - echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" - exit 0 - ;; - - --config) - sed -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $0 - exit 0 - ;; - - --debug) - echo "$progname: enabling shell trace mode" - set -x - ;; - - --dry-run | -n) - run=: - ;; - - --features) - echo "host: $host" - if test "$build_libtool_libs" = yes; then - echo "enable shared libraries" - else - echo "disable shared libraries" - fi - if test "$build_old_libs" = yes; then - echo "enable static libraries" - else - echo "disable static libraries" - fi - exit 0 - ;; - - --finish) mode="finish" ;; - - --mode) prevopt="--mode" prev=mode ;; - --mode=*) mode="$optarg" ;; - - --quiet | --silent) - show=: - ;; - - -dlopen) - prevopt="-dlopen" - prev=execute_dlfiles - ;; - - -*) - $echo "$modename: unrecognized option \`$arg'" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; - - *) - nonopt="$arg" - break - ;; - esac -done - -if test -n "$prevopt"; then - $echo "$modename: option \`$prevopt' requires an argument" 1>&2 - $echo "$help" 1>&2 - exit 1 -fi - -# If this variable is set in any of the actions, the command in it -# will be execed at the end. This prevents here-documents from being -# left over by shells. -exec_cmd= - -if test -z "$show_help"; then - - # Infer the operation mode. - if test -z "$mode"; then - case $nonopt in - *cc | *++ | gcc* | *-gcc*) - mode=link - for arg - do - case $arg in - -c) - mode=compile - break - ;; - esac - done - ;; - *db | *dbx | *strace | *truss) - mode=execute - ;; - *install*|cp|mv) - mode=install - ;; - *rm) - mode=uninstall - ;; - *) - # If we have no mode, but dlfiles were specified, then do execute mode. - test -n "$execute_dlfiles" && mode=execute - - # Just use the default operation mode. - if test -z "$mode"; then - if test -n "$nonopt"; then - $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 - else - $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 - fi - fi - ;; - esac - fi - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$execute_dlfiles" && test "$mode" != execute; then - $echo "$modename: unrecognized option \`-dlopen'" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try \`$modename --help --mode=$mode' for more information." - - # These modes are in order of execution frequency so that they run quickly. - case $mode in - # libtool compile mode - compile) - modename="$modename: compile" - # Get the compilation command and the source file. - base_compile= - prev= - lastarg= - srcfile="$nonopt" - suppress_output= - - user_target=no - for arg - do - case $prev in - "") ;; - xcompiler) - # Aesthetically quote the previous argument. - prev= - lastarg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - - case $arg in - # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - - # Add the previous argument to base_compile. - if test -z "$base_compile"; then - base_compile="$lastarg" - else - base_compile="$base_compile $lastarg" - fi - continue - ;; - esac - - # Accept any command-line options. - case $arg in - -o) - if test "$user_target" != "no"; then - $echo "$modename: you cannot specify \`-o' more than once" 1>&2 - exit 1 - fi - user_target=next - ;; - - -static) - build_old_libs=yes - continue - ;; - - -prefer-pic) - pic_mode=yes - continue - ;; - - -prefer-non-pic) - pic_mode=no - continue - ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Wc,*) - args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` - lastarg= - save_ifs="$IFS"; IFS=',' - for arg in $args; do - IFS="$save_ifs" - - # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - lastarg="$lastarg $arg" - done - IFS="$save_ifs" - lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` - - # Add the arguments to base_compile. - if test -z "$base_compile"; then - base_compile="$lastarg" - else - base_compile="$base_compile $lastarg" - fi - continue - ;; - esac - - case $user_target in - next) - # The next one is the -o target name - user_target=yes - continue - ;; - yes) - # We got the output file - user_target=set - libobj="$arg" - continue - ;; - esac - - # Accept the current argument as the source file. - lastarg="$srcfile" - srcfile="$arg" - - # Aesthetically quote the previous argument. - - # Backslashify any backslashes, double quotes, and dollar signs. - # These are the only characters that are still specially - # interpreted inside of double-quoted scrings. - lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` - - # Double-quote args containing other shell metacharacters. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - case $lastarg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - lastarg="\"$lastarg\"" - ;; - esac - - # Add the previous argument to base_compile. - if test -z "$base_compile"; then - base_compile="$lastarg" - else - base_compile="$base_compile $lastarg" - fi - done - - case $user_target in - set) - ;; - no) - # Get the name of the library object. - libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` - ;; - *) - $echo "$modename: you must specify a target with \`-o'" 1>&2 - exit 1 - ;; - esac - - # Recognize several different file suffixes. - # If the user specifies -o file.o, it is replaced with file.lo - xform='[cCFSfmso]' - case $libobj in - *.ada) xform=ada ;; - *.adb) xform=adb ;; - *.ads) xform=ads ;; - *.asm) xform=asm ;; - *.c++) xform=c++ ;; - *.cc) xform=cc ;; - *.cpp) xform=cpp ;; - *.cxx) xform=cxx ;; - *.f90) xform=f90 ;; - *.for) xform=for ;; - esac - - libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` - - case $libobj in - *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; - *) - $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 - exit 1 - ;; - esac - - if test -z "$base_compile"; then - $echo "$modename: you must specify a compilation command" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - # Delete any leftover library objects. - if test "$build_old_libs" = yes; then - removelist="$obj $libobj" - else - removelist="$libobj" - fi - - $run $rm $removelist - trap "$run $rm $removelist; exit 1" 1 2 15 - - # On Cygwin there's no "real" PIC flag so we must build both object types - case $host_os in - cygwin* | mingw* | pw32* | os2*) - pic_mode=default - ;; - esac - if test $pic_mode = no && test "$deplibs_check_method" != pass_all; then - # non-PIC code in shared libraries is not supported - pic_mode=default - fi - - # Calculate the filename of the output object if compiler does - # not support -o with -c - if test "$compiler_c_o" = no; then - output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} - lockfile="$output_obj.lock" - removelist="$removelist $output_obj $lockfile" - trap "$run $rm $removelist; exit 1" 1 2 15 - else - need_locks=no - lockfile= - fi - - # Lock this critical section if it is needed - # We use this script file to make the link, it avoids creating a new file - if test "$need_locks" = yes; then - until $run ln "$0" "$lockfile" 2>/dev/null; do - $show "Waiting for $lockfile to be removed" - sleep 2 - done - elif test "$need_locks" = warn; then - if test -f "$lockfile"; then - echo "\ -*** ERROR, $lockfile exists and contains: -`cat $lockfile 2>/dev/null` - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit 1 - fi - echo $srcfile > "$lockfile" - fi - - if test -n "$fix_srcfile_path"; then - eval srcfile=\"$fix_srcfile_path\" - fi - - # Only build a PIC object if we are building libtool libraries. - if test "$build_libtool_libs" = yes; then - # Without this assignment, base_compile gets emptied. - fbsd_hideous_sh_bug=$base_compile - - if test "$pic_mode" != no; then - # All platforms use -DPIC, to notify preprocessed assembler code. - command="$base_compile $srcfile $pic_flag -DPIC" - else - # Don't build PIC code - command="$base_compile $srcfile" - fi - if test "$build_old_libs" = yes; then - lo_libobj="$libobj" - dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$dir" = "X$libobj"; then - dir="$objdir" - else - dir="$dir/$objdir" - fi - libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` - - if test -d "$dir"; then - $show "$rm $libobj" - $run $rm $libobj - else - $show "$mkdir $dir" - $run $mkdir $dir - status=$? - if test $status -ne 0 && test ! -d $dir; then - exit $status - fi - fi - fi - if test "$compiler_o_lo" = yes; then - output_obj="$libobj" - command="$command -o $output_obj" - elif test "$compiler_c_o" = yes; then - output_obj="$obj" - command="$command -o $output_obj" - fi - - $run $rm "$output_obj" - $show "$command" - if $run eval "$command"; then : - else - test -n "$output_obj" && $run $rm $removelist - exit 1 - fi - - if test "$need_locks" = warn && - test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then - echo "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit 1 - fi - - # Just move the object if needed, then go on to compile the next one - if test x"$output_obj" != x"$libobj"; then - $show "$mv $output_obj $libobj" - if $run $mv $output_obj $libobj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - fi - - # If we have no pic_flag, then copy the object into place and finish. - if (test -z "$pic_flag" || test "$pic_mode" != default) && - test "$build_old_libs" = yes; then - # Rename the .lo from within objdir to obj - if test -f $obj; then - $show $rm $obj - $run $rm $obj - fi - - $show "$mv $libobj $obj" - if $run $mv $libobj $obj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - - xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$obj"; then - xdir="." - else - xdir="$xdir" - fi - baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"` - libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` - # Now arrange that obj and lo_libobj become the same file - $show "(cd $xdir && $LN_S $baseobj $libobj)" - if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then - # Unlock the critical section if it was locked - if test "$need_locks" != no; then - $run $rm "$lockfile" - fi - exit 0 - else - error=$? - $run $rm $removelist - exit $error - fi - fi - - # Allow error messages only from the first compilation. - suppress_output=' >/dev/null 2>&1' - fi - - # Only build a position-dependent object if we build old libraries. - if test "$build_old_libs" = yes; then - if test "$pic_mode" != yes; then - # Don't build PIC code - command="$base_compile $srcfile" - else - # All platforms use -DPIC, to notify preprocessed assembler code. - command="$base_compile $srcfile $pic_flag -DPIC" - fi - if test "$compiler_c_o" = yes; then - command="$command -o $obj" - output_obj="$obj" - fi - - # Suppress compiler output if we already did a PIC compilation. - command="$command$suppress_output" - $run $rm "$output_obj" - $show "$command" - if $run eval "$command"; then : - else - $run $rm $removelist - exit 1 - fi - - if test "$need_locks" = warn && - test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then - echo "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support \`-c' and \`-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $run $rm $removelist - exit 1 - fi - - # Just move the object if needed - if test x"$output_obj" != x"$obj"; then - $show "$mv $output_obj $obj" - if $run $mv $output_obj $obj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - fi - - # Create an invalid libtool object if no PIC, so that we do not - # accidentally link it into a program. - if test "$build_libtool_libs" != yes; then - $show "echo timestamp > $libobj" - $run eval "echo timestamp > \$libobj" || exit $? - else - # Move the .lo from within objdir - $show "$mv $libobj $lo_libobj" - if $run $mv $libobj $lo_libobj; then : - else - error=$? - $run $rm $removelist - exit $error - fi - fi - fi - - # Unlock the critical section if it was locked - if test "$need_locks" != no; then - $run $rm "$lockfile" - fi - - exit 0 - ;; - - # libtool link mode - link | relink) - modename="$modename: link" - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) - # It is impossible to link a dll without this setting, and - # we shouldn't force the makefile maintainer to figure out - # which system we are compiling for in order to pass an extra - # flag for every libtool invokation. - # allow_undefined=no - - # FIXME: Unfortunately, there are problems with the above when trying - # to make a dll which has undefined symbols, in which case not - # even a static library is built. For now, we need to specify - # -no-undefined on the libtool link line when we can be certain - # that all symbols are satisfied, otherwise we get a static library. - allow_undefined=yes - ;; - *) - allow_undefined=yes - ;; - esac - libtool_args="$nonopt" - compile_command="$nonopt" - finalize_command="$nonopt" - - compile_rpath= - finalize_rpath= - compile_shlibpath= - finalize_shlibpath= - convenience= - old_convenience= - deplibs= - old_deplibs= - compiler_flags= - linker_flags= - dllsearchpath= - lib_search_path=`pwd` - - avoid_version=no - dlfiles= - dlprefiles= - dlself=no - export_dynamic=no - export_symbols= - export_symbols_regex= - generated= - libobjs= - ltlibs= - module=no - no_install=no - objs= - prefer_static_libs=no - preload=no - prev= - prevarg= - release= - rpath= - xrpath= - perm_rpath= - temp_rpath= - thread_safe=no - vinfo= - - # We need to know -static, to get the right output filenames. - for arg - do - case $arg in - -all-static | -static) - if test "X$arg" = "X-all-static"; then - if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then - $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2 - fi - if test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - else - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - fi - build_libtool_libs=no - build_old_libs=yes - prefer_static_libs=yes - break - ;; - esac - done - - # See if our shared archives depend on static archives. - test -n "$old_archive_from_new_cmds" && build_old_libs=yes - - # Go through the arguments, transforming them on the way. - while test $# -gt 0; do - arg="$1" - shift - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test - ;; - *) qarg=$arg ;; - esac - libtool_args="$libtool_args $qarg" - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - output) - compile_command="$compile_command @OUTPUT@" - finalize_command="$finalize_command @OUTPUT@" - ;; - esac - - case $prev in - dlfiles|dlprefiles) - if test "$preload" = no; then - # Add the symbol object into the linking commands. - compile_command="$compile_command @SYMFILE@" - finalize_command="$finalize_command @SYMFILE@" - preload=yes - fi - case $arg in - *.la | *.lo) ;; # We handle these cases below. - force) - if test "$dlself" = no; then - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - self) - if test "$prev" = dlprefiles; then - dlself=yes - elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then - dlself=yes - else - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - *) - if test "$prev" = dlfiles; then - dlfiles="$dlfiles $arg" - else - dlprefiles="$dlprefiles $arg" - fi - prev= - continue - ;; - esac - ;; - expsyms) - export_symbols="$arg" - if test ! -f "$arg"; then - $echo "$modename: symbol file \`$arg' does not exist" - exit 1 - fi - prev= - continue - ;; - expsyms_regex) - export_symbols_regex="$arg" - prev= - continue - ;; - release) - release="-$arg" - prev= - continue - ;; - rpath | xrpath) - # We need an absolute path. - case $arg in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - $echo "$modename: only absolute run-paths are allowed" 1>&2 - exit 1 - ;; - esac - if test "$prev" = rpath; then - case "$rpath " in - *" $arg "*) ;; - *) rpath="$rpath $arg" ;; - esac - else - case "$xrpath " in - *" $arg "*) ;; - *) xrpath="$xrpath $arg" ;; - esac - fi - prev= - continue - ;; - xcompiler) - compiler_flags="$compiler_flags $qarg" - prev= - compile_command="$compile_command $qarg" - finalize_command="$finalize_command $qarg" - continue - ;; - xlinker) - linker_flags="$linker_flags $qarg" - compiler_flags="$compiler_flags $wl$qarg" - prev= - compile_command="$compile_command $wl$qarg" - finalize_command="$finalize_command $wl$qarg" - continue - ;; - *) - eval "$prev=\"\$arg\"" - prev= - continue - ;; - esac - fi # test -n $prev - - prevarg="$arg" - - case $arg in - -all-static) - if test -n "$link_static_flag"; then - compile_command="$compile_command $link_static_flag" - finalize_command="$finalize_command $link_static_flag" - fi - continue - ;; - - -allow-undefined) - # FIXME: remove this flag sometime in the future. - $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 - continue - ;; - - -avoid-version) - avoid_version=yes - continue - ;; - - -dlopen) - prev=dlfiles - continue - ;; - - -dlpreopen) - prev=dlprefiles - continue - ;; - - -export-dynamic) - export_dynamic=yes - continue - ;; - - -export-symbols | -export-symbols-regex) - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - $echo "$modename: more than one -exported-symbols argument is not allowed" - exit 1 - fi - if test "X$arg" = "X-export-symbols"; then - prev=expsyms - else - prev=expsyms_regex - fi - continue - ;; - - # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* - # so, if we see these flags be careful not to treat them like -L - -L[A-Z][A-Z]*:*) - case $with_gcc/$host in - no/*-*-irix*) - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - ;; - esac - continue - ;; - - -L*) - dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 - exit 1 - fi - dir="$absdir" - ;; - esac - case "$deplibs " in - *" -L$dir "*) ;; - *) - deplibs="$deplibs -L$dir" - lib_search_path="$lib_search_path $dir" - ;; - esac - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) - case :$dllsearchpath: in - *":$dir:"*) ;; - *) dllsearchpath="$dllsearchpath:$dir";; - esac - ;; - esac - continue - ;; - - -l*) - if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then - case $host in - *-*-cygwin* | *-*-pw32* | *-*-beos*) - # These systems don't actually have a C or math library (as such) - continue - ;; - *-*-mingw* | *-*-os2*) - # These systems don't actually have a C library (as such) - test "X$arg" = "X-lc" && continue - ;; - *-*-openbsd*) - # Do not include libc due to us having libc/libc_r. - test "X$arg" = "X-lc" && continue - ;; - esac - elif test "X$arg" = "X-lc_r"; then - case $host in - *-*-openbsd*) - # Do not include libc_r directly, use -pthread flag. - continue - ;; - esac - fi - deplibs="$deplibs $arg" - continue - ;; - - -module) - module=yes - continue - ;; - - -no-fast-install) - fast_install=no - continue - ;; - - -no-install) - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) - # The PATH hackery in wrapper scripts is required on Windows - # in order for the loader to find any dlls it needs. - $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 - $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 - fast_install=no - ;; - *) no_install=yes ;; - esac - continue - ;; - - -no-undefined) - allow_undefined=no - continue - ;; - - -o) prev=output ;; - - -release) - prev=release - continue - ;; - - -rpath) - prev=rpath - continue - ;; - - -R) - prev=xrpath - continue - ;; - - -R*) - dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - $echo "$modename: only absolute run-paths are allowed" 1>&2 - exit 1 - ;; - esac - case "$xrpath " in - *" $dir "*) ;; - *) xrpath="$xrpath $dir" ;; - esac - continue - ;; - - -static) - # The effects of -static are defined in a previous loop. - # We used to do the same as -all-static on platforms that - # didn't have a PIC flag, but the assumption that the effects - # would be equivalent was wrong. It would break on at least - # Digital Unix and AIX. - continue - ;; - - -thread-safe) - thread_safe=yes - continue - ;; - - -version-info) - prev=vinfo - continue - ;; - - -Wc,*) - args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - case $flag in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - flag="\"$flag\"" - ;; - esac - arg="$arg $wl$flag" - compiler_flags="$compiler_flags $flag" - done - IFS="$save_ifs" - arg=`$echo "X$arg" | $Xsed -e "s/^ //"` - ;; - - -Wl,*) - args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` - arg= - save_ifs="$IFS"; IFS=',' - for flag in $args; do - IFS="$save_ifs" - case $flag in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - flag="\"$flag\"" - ;; - esac - arg="$arg $wl$flag" - compiler_flags="$compiler_flags $wl$flag" - linker_flags="$linker_flags $flag" - done - IFS="$save_ifs" - arg=`$echo "X$arg" | $Xsed -e "s/^ //"` - ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Xlinker) - prev=xlinker - continue - ;; - - # Some other compiler flag. - -* | +*) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - ;; - - *.lo | *.$objext) - # A library or standard object. - if test "$prev" = dlfiles; then - # This file was specified with -dlopen. - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - dlfiles="$dlfiles $arg" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - if test "$prev" = dlprefiles; then - # Preload the old-style object. - dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` - prev= - else - case $arg in - *.lo) libobjs="$libobjs $arg" ;; - *) objs="$objs $arg" ;; - esac - fi - ;; - - *.$libext) - # An archive. - deplibs="$deplibs $arg" - old_deplibs="$old_deplibs $arg" - continue - ;; - - *.la) - # A libtool-controlled library. - - if test "$prev" = dlfiles; then - # This library was specified with -dlopen. - dlfiles="$dlfiles $arg" - prev= - elif test "$prev" = dlprefiles; then - # The library was specified with -dlpreopen. - dlprefiles="$dlprefiles $arg" - prev= - else - deplibs="$deplibs $arg" - fi - continue - ;; - - # Some other compiler argument. - *) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - arg="\"$arg\"" - ;; - esac - ;; - esac # arg - - # Now actually substitute the argument into the commands. - if test -n "$arg"; then - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - fi - done # argument parsing loop - - if test -n "$prev"; then - $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then - eval arg=\"$export_dynamic_flag_spec\" - compile_command="$compile_command $arg" - finalize_command="$finalize_command $arg" - fi - - # calculate the name of the file, without its directory - outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` - libobjs_save="$libobjs" - - if test -n "$shlibpath_var"; then - # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` - else - shlib_search_path= - fi - eval sys_lib_search_path=\"$sys_lib_search_path_spec\" - eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" - - output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` - if test "X$output_objdir" = "X$output"; then - output_objdir="$objdir" - else - output_objdir="$output_objdir/$objdir" - fi - # Create the object directory. - if test ! -d $output_objdir; then - $show "$mkdir $output_objdir" - $run $mkdir $output_objdir - status=$? - if test $status -ne 0 && test ! -d $output_objdir; then - exit $status - fi - fi - - # Determine the type of output - case $output in - "") - $echo "$modename: you must specify an output file" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; - *.$libext) linkmode=oldlib ;; - *.lo | *.$objext) linkmode=obj ;; - *.la) linkmode=lib ;; - *) linkmode=prog ;; # Anything else should be a program. - esac - - specialdeplibs= - libs= - # Find all interdependent deplibs by searching for libraries - # that are linked more than once (e.g. -la -lb -la) - for deplib in $deplibs; do - case "$libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - libs="$libs $deplib" - done - deplibs= - newdependency_libs= - newlib_search_path= - need_relink=no # whether we're linking any uninstalled libtool libraries - notinst_deplibs= # not-installed libtool libraries - notinst_path= # paths that contain not-installed libtool libraries - case $linkmode in - lib) - passes="conv link" - for file in $dlfiles $dlprefiles; do - case $file in - *.la) ;; - *) - $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 - exit 1 - ;; - esac - done - ;; - prog) - compile_deplibs= - finalize_deplibs= - alldeplibs=no - newdlfiles= - newdlprefiles= - passes="conv scan dlopen dlpreopen link" - ;; - *) passes="conv" - ;; - esac - for pass in $passes; do - if test $linkmode = prog; then - # Determine which files to process - case $pass in - dlopen) - libs="$dlfiles" - save_deplibs="$deplibs" # Collect dlpreopened libraries - deplibs= - ;; - dlpreopen) libs="$dlprefiles" ;; - link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; - esac - fi - for deplib in $libs; do - lib= - found=no - case $deplib in - -l*) - if test $linkmode = oldlib && test $linkmode = obj; then - $echo "$modename: warning: \`-l' is ignored for archives/objects: $deplib" 1>&2 - continue - fi - if test $pass = conv; then - deplibs="$deplib $deplibs" - continue - fi - name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` - for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do - # Search the libtool library - lib="$searchdir/lib${name}.la" - if test -f "$lib"; then - found=yes - break - fi - done - if test "$found" != yes; then - # deplib doesn't seem to be a libtool library - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test $linkmode = lib && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - ;; # -l - -L*) - case $linkmode in - lib) - deplibs="$deplib $deplibs" - test $pass = conv && continue - newdependency_libs="$deplib $newdependency_libs" - newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` - ;; - prog) - if test $pass = conv; then - deplibs="$deplib $deplibs" - continue - fi - if test $pass = scan; then - deplibs="$deplib $deplibs" - newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - ;; - *) - $echo "$modename: warning: \`-L' is ignored for archives/objects: $deplib" 1>&2 - ;; - esac # linkmode - continue - ;; # -L - -R*) - if test $pass = link; then - dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` - # Make sure the xrpath contains only unique directories. - case "$xrpath " in - *" $dir "*) ;; - *) xrpath="$xrpath $dir" ;; - esac - fi - deplibs="$deplib $deplibs" - continue - ;; - *.la) lib="$deplib" ;; - *.$libext) - if test $pass = conv; then - deplibs="$deplib $deplibs" - continue - fi - case $linkmode in - lib) - if test "$deplibs_check_method" != pass_all; then - echo - echo "*** Warning: This library needs some functionality provided by $deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - else - echo - echo "*** Warning: Linking the shared library $output against the" - echo "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" - fi - continue - ;; - prog) - if test $pass != link; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - continue - ;; - esac # linkmode - ;; # *.$libext - *.lo | *.$objext) - if test $pass = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then - # If there is no dlopen support or we're linking statically, - # we need to preload. - newdlprefiles="$newdlprefiles $deplib" - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - newdlfiles="$newdlfiles $deplib" - fi - continue - ;; - %DEPLIBS%) - alldeplibs=yes - continue - ;; - esac # case $deplib - if test $found = yes || test -f "$lib"; then : - else - $echo "$modename: cannot find the library \`$lib'" 1>&2 - exit 1 - fi - - # Check to see that this really is a libtool archive. - if (sed -e '2q' $lib | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit 1 - fi - - ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` - test "X$ladir" = "X$lib" && ladir="." - - dlname= - dlopen= - dlpreopen= - libdir= - library_names= - old_library= - # If the library was installed with an old release of libtool, - # it will not redefine variable installed. - installed=yes - - # Read the .la file - case $lib in - */* | *\\*) . $lib ;; - *) . ./$lib ;; - esac - - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan" || - { test $linkmode = oldlib && test $linkmode = obj; }; then - # Add dl[pre]opened files of deplib - test -n "$dlopen" && dlfiles="$dlfiles $dlopen" - test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" - fi - - if test $pass = conv; then - # Only check for convenience libraries - deplibs="$lib $deplibs" - if test -z "$libdir"; then - if test -z "$old_library"; then - $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 - exit 1 - fi - # It is a libtool convenience library, so add in its objects. - convenience="$convenience $ladir/$objdir/$old_library" - old_convenience="$old_convenience $ladir/$objdir/$old_library" - tmp_libs= - for deplib in $dependency_libs; do - deplibs="$deplib $deplibs" - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - tmp_libs="$tmp_libs $deplib" - done - elif test $linkmode != prog && test $linkmode != lib; then - $echo "$modename: \`$lib' is not a convenience library" 1>&2 - exit 1 - fi - continue - fi # $pass = conv - - # Get the name of the library we link against. - linklib= - for l in $old_library $library_names; do - linklib="$l" - done - if test -z "$linklib"; then - $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 - exit 1 - fi - - # This library was specified with -dlopen. - if test $pass = dlopen; then - if test -z "$libdir"; then - $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 - exit 1 - fi - if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then - # If there is no dlname, no dlopen support or we're linking - # statically, we need to preload. - dlprefiles="$dlprefiles $lib" - else - newdlfiles="$newdlfiles $lib" - fi - continue - fi # $pass = dlopen - - # We need an absolute path. - case $ladir in - [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; - *) - abs_ladir=`cd "$ladir" && pwd` - if test -z "$abs_ladir"; then - $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 - $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 - abs_ladir="$ladir" - fi - ;; - esac - laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` - - # Find the relevant object directory and library name. - if test "X$installed" = Xyes; then - if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then - $echo "$modename: warning: library \`$lib' was moved." 1>&2 - dir="$ladir" - absdir="$abs_ladir" - libdir="$abs_ladir" - else - dir="$libdir" - absdir="$libdir" - fi - else - dir="$ladir/$objdir" - absdir="$abs_ladir/$objdir" - # Remove this search path later - notinst_path="$notinst_path $abs_ladir" - fi # $installed = yes - name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` - - # This library was specified with -dlpreopen. - if test $pass = dlpreopen; then - if test -z "$libdir"; then - $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 - exit 1 - fi - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - newdlprefiles="$newdlprefiles $dir/$old_library" - # Otherwise, use the dlname, so that lt_dlopen finds it. - elif test -n "$dlname"; then - newdlprefiles="$newdlprefiles $dir/$dlname" - else - newdlprefiles="$newdlprefiles $dir/$linklib" - fi - fi # $pass = dlpreopen - - if test -z "$libdir"; then - # Link the convenience library - if test $linkmode = lib; then - deplibs="$dir/$old_library $deplibs" - elif test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$dir/$old_library $compile_deplibs" - finalize_deplibs="$dir/$old_library $finalize_deplibs" - else - deplibs="$lib $deplibs" - fi - continue - fi - - if test $linkmode = prog && test $pass != link; then - newlib_search_path="$newlib_search_path $ladir" - deplibs="$lib $deplibs" - - linkalldeplibs=no - if test "$link_all_deplibs" != no || test -z "$library_names" || - test "$build_libtool_libs" = no; then - linkalldeplibs=yes - fi - - tmp_libs= - for deplib in $dependency_libs; do - case $deplib in - -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test - esac - # Need to link against all dependency_libs? - if test $linkalldeplibs = yes; then - deplibs="$deplib $deplibs" - else - # Need to hardcode shared library paths - # or/and link against static libraries - newdependency_libs="$deplib $newdependency_libs" - fi - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - tmp_libs="$tmp_libs $deplib" - done # for deplib - continue - fi # $linkmode = prog... - - link_static=no # Whether the deplib will be linked statically - if test -n "$library_names" && - { test "$prefer_static_libs" = no || test -z "$old_library"; }; then - # Link against this shared library - - if test "$linkmode,$pass" = "prog,link" || - { test $linkmode = lib && test $hardcode_into_libs = yes; }; then - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) compile_rpath="$compile_rpath $absdir" - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" - esac - ;; - esac - if test $linkmode = prog; then - # We need to hardcode the library path - if test -n "$shlibpath_var"; then - # Make sure the rpath contains only unique directories. - case "$temp_rpath " in - *" $dir "*) ;; - *" $absdir "*) ;; - *) temp_rpath="$temp_rpath $dir" ;; - esac - fi - fi - fi # $linkmode,$pass = prog,link... - - if test "$alldeplibs" = yes && - { test "$deplibs_check_method" = pass_all || - { test "$build_libtool_libs" = yes && - test -n "$library_names"; }; }; then - # We only need to search for static libraries - continue - fi - - if test "$installed" = no; then - notinst_deplibs="$notinst_deplibs $lib" - need_relink=yes - fi - - if test -n "$old_archive_from_expsyms_cmds"; then - # figure out the soname - set dummy $library_names - realname="$2" - shift; shift - libname=`eval \\$echo \"$libname_spec\"` - # use dlname if we got it. it's perfectly good, no? - if test -n "$dlname"; then - soname="$dlname" - elif test -n "$soname_spec"; then - # bleh windows - case $host in - *cygwin*) - major=`expr $current - $age` - versuffix="-$major" - ;; - esac - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - - # Make a new name for the extract_expsyms_cmds to use - soroot="$soname" - soname=`echo $soroot | sed -e 's/^.*\///'` - newlib="libimp-`echo $soname | sed 's/^lib//;s/\.dll$//'`.a" - - # If the library has no export list, then create one now - if test -f "$output_objdir/$soname-def"; then : - else - $show "extracting exported symbol list from \`$soname'" - save_ifs="$IFS"; IFS='~' - eval cmds=\"$extract_expsyms_cmds\" - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - fi - - # Create $newlib - if test -f "$output_objdir/$newlib"; then :; else - $show "generating import library for \`$soname'" - save_ifs="$IFS"; IFS='~' - eval cmds=\"$old_archive_from_expsyms_cmds\" - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - fi - # make sure the library variables are pointing to the new library - dir=$output_objdir - linklib=$newlib - fi # test -n $old_archive_from_expsyms_cmds - - if test $linkmode = prog || test "$mode" != relink; then - add_shlibpath= - add_dir= - add= - lib_linked=yes - case $hardcode_action in - immediate | unsupported) - if test "$hardcode_direct" = no; then - add="$dir/$linklib" - elif test "$hardcode_minus_L" = no; then - case $host in - *-*-sunos*) add_shlibpath="$dir" ;; - esac - add_dir="-L$dir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = no; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - relink) - if test "$hardcode_direct" = yes; then - add="$dir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$dir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - add_shlibpath="$dir" - add="-l$name" - else - lib_linked=no - fi - ;; - *) lib_linked=no ;; - esac - - if test "$lib_linked" != yes; then - $echo "$modename: configuration error: unsupported hardcode properties" - exit 1 - fi - - if test -n "$add_shlibpath"; then - case :$compile_shlibpath: in - *":$add_shlibpath:"*) ;; - *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; - esac - fi - if test $linkmode = prog; then - test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" - test -n "$add" && compile_deplibs="$add $compile_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - if test "$hardcode_direct" != yes && \ - test "$hardcode_minus_L" != yes && \ - test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; - esac - fi - fi - fi - - if test $linkmode = prog || test "$mode" = relink; then - add_shlibpath= - add_dir= - add= - # Finalize command for both is simple: just hardcode it. - if test "$hardcode_direct" = yes; then - add="$libdir/$linklib" - elif test "$hardcode_minus_L" = yes; then - add_dir="-L$libdir" - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; - esac - add="-l$name" - else - # We cannot seem to hardcode it, guess we'll fake it. - add_dir="-L$libdir" - add="-l$name" - fi - - if test $linkmode = prog; then - test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" - test -n "$add" && finalize_deplibs="$add $finalize_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - fi - fi - elif test $linkmode = prog; then - if test "$alldeplibs" = yes && - { test "$deplibs_check_method" = pass_all || - { test "$build_libtool_libs" = yes && - test -n "$library_names"; }; }; then - # We only need to search for static libraries - continue - fi - - # Try to link the static library - # Here we assume that one of hardcode_direct or hardcode_minus_L - # is not unsupported. This is valid on all known static and - # shared platforms. - if test "$hardcode_direct" != unsupported; then - test -n "$old_library" && linklib="$old_library" - compile_deplibs="$dir/$linklib $compile_deplibs" - finalize_deplibs="$dir/$linklib $finalize_deplibs" - else - compile_deplibs="-l$name -L$dir $compile_deplibs" - finalize_deplibs="-l$name -L$dir $finalize_deplibs" - fi - elif test "$build_libtool_libs" = yes; then - # Not a shared library - if test "$deplibs_check_method" != pass_all; then - # We're trying link a shared library against a static one - # but the system doesn't support it. - - # Just print a warning and add the library to dependency_libs so - # that the program can be linked against the static library. - echo - echo "*** Warning: This library needs some functionality provided by $lib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - if test "$module" = yes; then - echo "*** Therefore, libtool will create a static module, that should work " - echo "*** as long as the dlopening application is linked with the -dlopen flag." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - else - convenience="$convenience $dir/$old_library" - old_convenience="$old_convenience $dir/$old_library" - deplibs="$dir/$old_library $deplibs" - link_static=yes - fi - fi # link shared/static library? - - if test $linkmode = lib; then - if test -n "$dependency_libs" && - { test $hardcode_into_libs != yes || test $build_old_libs = yes || - test $link_static = yes; }; then - # Extract -R from dependency_libs - temp_deplibs= - for libdir in $dependency_libs; do - case $libdir in - -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` - case " $xrpath " in - *" $temp_xrpath "*) ;; - *) xrpath="$xrpath $temp_xrpath";; - esac;; - *) temp_deplibs="$temp_deplibs $libdir";; - esac - done - dependency_libs="$temp_deplibs" - fi - - newlib_search_path="$newlib_search_path $absdir" - # Link against this library - test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" - # ... and its dependency_libs - tmp_libs= - for deplib in $dependency_libs; do - newdependency_libs="$deplib $newdependency_libs" - case "$tmp_libs " in - *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; - esac - tmp_libs="$tmp_libs $deplib" - done - - if test $link_all_deplibs != no; then - # Add the search paths of all dependency libraries - for deplib in $dependency_libs; do - case $deplib in - -L*) path="$deplib" ;; - *.la) - dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$deplib" && dir="." - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 - absdir="$dir" - fi - ;; - esac - if grep "^installed=no" $deplib > /dev/null; then - path="-L$absdir/$objdir" - else - eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - if test -z "$libdir"; then - $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 - exit 1 - fi - if test "$absdir" != "$libdir"; then - $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 - fi - path="-L$absdir" - fi - ;; - *) continue ;; - esac - case " $deplibs " in - *" $path "*) ;; - *) deplibs="$deplibs $path" ;; - esac - done - fi # link_all_deplibs != no - fi # linkmode = lib - done # for deplib in $libs - if test $pass = dlpreopen; then - # Link the dlpreopened libraries before other libraries - for deplib in $save_deplibs; do - deplibs="$deplib $deplibs" - done - fi - if test $pass != dlopen; then - test $pass != scan && dependency_libs="$newdependency_libs" - if test $pass != conv; then - # Make sure lib_search_path contains only unique directories. - lib_search_path= - for dir in $newlib_search_path; do - case "$lib_search_path " in - *" $dir "*) ;; - *) lib_search_path="$lib_search_path $dir" ;; - esac - done - newlib_search_path= - fi - - if test "$linkmode,$pass" != "prog,link"; then - vars="deplibs" - else - vars="compile_deplibs finalize_deplibs" - fi - for var in $vars dependency_libs; do - # Add libraries to $var in reverse order - eval tmp_libs=\"\$$var\" - new_libs= - for deplib in $tmp_libs; do - case $deplib in - -L*) new_libs="$deplib $new_libs" ;; - *) - case " $specialdeplibs " in - *" $deplib "*) new_libs="$deplib $new_libs" ;; - *) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$deplib $new_libs" ;; - esac - ;; - esac - ;; - esac - done - tmp_libs= - for deplib in $new_libs; do - case $deplib in - -L*) - case " $tmp_libs " in - *" $deplib "*) ;; - *) tmp_libs="$tmp_libs $deplib" ;; - esac - ;; - *) tmp_libs="$tmp_libs $deplib" ;; - esac - done - eval $var=\"$tmp_libs\" - done # for var - fi - if test "$pass" = "conv" && - { test "$linkmode" = "lib" || test "$linkmode" = "prog"; }; then - libs="$deplibs" # reset libs - deplibs= - fi - done # for pass - if test $linkmode = prog; then - dlfiles="$newdlfiles" - dlprefiles="$newdlprefiles" - fi - - case $linkmode in - oldlib) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 - fi - - if test -n "$rpath"; then - $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 - fi - - if test -n "$xrpath"; then - $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 - fi - - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 - fi - - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 - fi - - # Now set the variables for building old libraries. - build_libtool_libs=no - oldlibs="$output" - objs="$objs$old_deplibs" - ;; - - lib) - # Make sure we only generate libraries of the form `libNAME.la'. - case $outputname in - lib*) - name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` - eval libname=\"$libname_spec\" - ;; - *) - if test "$module" = no; then - $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - if test "$need_lib_prefix" != no; then - # Add the "lib" prefix for modules if required - name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` - eval libname=\"$libname_spec\" - else - libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` - fi - ;; - esac - - if test -n "$objs"; then - if test "$deplibs_check_method" != pass_all; then - $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 - exit 1 - else - echo - echo "*** Warning: Linking the shared library $output against the non-libtool" - echo "*** objects $objs is not portable!" - libobjs="$libobjs $objs" - fi - fi - - if test "$dlself" != no; then - $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 - fi - - set dummy $rpath - if test $# -gt 2; then - $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 - fi - install_libdir="$2" - - oldlibs= - if test -z "$rpath"; then - if test "$build_libtool_libs" = yes; then - # Building a libtool convenience library. - libext=al - oldlibs="$output_objdir/$libname.$libext $oldlibs" - build_libtool_libs=convenience - build_old_libs=yes - fi - - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 - fi - else - - # Parse the version information argument. - save_ifs="$IFS"; IFS=':' - set dummy $vinfo 0 0 0 - IFS="$save_ifs" - - if test -n "$8"; then - $echo "$modename: too many parameters to \`-version-info'" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - current="$2" - revision="$3" - age="$4" - - # Check that each of the things are valid numbers. - case $current in - 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; - *) - $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 - ;; - esac - - case $revision in - 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; - *) - $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 - ;; - esac - - case $age in - 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; - *) - $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 - ;; - esac - - if test $age -gt $current; then - $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 - $echo "$modename: \`$vinfo' is not valid version information" 1>&2 - exit 1 - fi - - # Calculate the version variables. - major= - versuffix= - verstring= - case $version_type in - none) ;; - - darwin) - # Like Linux, but with the current version available in - # verstring for coding it into the library header - major=.`expr $current - $age` - versuffix="$major.$age.$revision" - # Darwin ld doesn't like 0 for these options... - minor_current=`expr $current + 1` - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - ;; - - freebsd-aout) - major=".$current" - versuffix=".$current.$revision"; - ;; - - freebsd-elf) - major=".$current" - versuffix=".$current"; - ;; - - irix) - major=`expr $current - $age + 1` - verstring="sgi$major.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$revision - while test $loop != 0; do - iface=`expr $revision - $loop` - loop=`expr $loop - 1` - verstring="sgi$major.$iface:$verstring" - done - - # Before this point, $major must not contain `.'. - major=.$major - versuffix="$major.$revision" - ;; - - linux) - major=.`expr $current - $age` - versuffix="$major.$age.$revision" - ;; - - osf) - major=`expr $current - $age` - versuffix=".$current.$age.$revision" - verstring="$current.$age.$revision" - - # Add in all the interfaces that we are compatible with. - loop=$age - while test $loop != 0; do - iface=`expr $current - $loop` - loop=`expr $loop - 1` - verstring="$verstring:${iface}.0" - done - - # Make executables depend on our current version. - verstring="$verstring:${current}.0" - ;; - - sunos) - major=".$current" - versuffix=".$current.$revision" - ;; - - windows) - # Use '-' rather than '.', since we only want one - # extension on DOS 8.3 filesystems. - major=`expr $current - $age` - versuffix="-$major" - ;; - - *) - $echo "$modename: unknown library version type \`$version_type'" 1>&2 - echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 - exit 1 - ;; - esac - - # Clear the version info if we defaulted, and they specified a release. - if test -z "$vinfo" && test -n "$release"; then - major= - verstring="0.0" - case $version_type in - darwin) - # we can't check for "0.0" in archive_cmds due to quoting - # problems, so we reset it completely - verstring="" - ;; - *) - verstring="0.0" - ;; - esac - if test "$need_version" = no; then - versuffix= - else - versuffix=".0.0" - fi - fi - - # Remove version info from name if versioning should be avoided - if test "$avoid_version" = yes && test "$need_version" = no; then - major= - versuffix= - verstring="" - fi - - # Check to see if the archive will have undefined symbols. - if test "$allow_undefined" = yes; then - if test "$allow_undefined_flag" = unsupported; then - $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 - build_libtool_libs=no - build_old_libs=yes - fi - else - # Don't allow undefined symbols. - allow_undefined_flag="$no_undefined_flag" - fi - fi - - if test "$mode" != relink; then - # Remove our outputs. - $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*" - $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.* - fi - - # Now set the variables for building old libraries. - if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then - oldlibs="$oldlibs $output_objdir/$libname.$libext" - - # Transform .lo files to .o files. - oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` - fi - - # Eliminate all temporary directories. - for path in $notinst_path; do - lib_search_path=`echo "$lib_search_path " | sed -e 's% $path % %g'` - deplibs=`echo "$deplibs " | sed -e 's% -L$path % %g'` - dependency_libs=`echo "$dependency_libs " | sed -e 's% -L$path % %g'` - done - - if test -n "$xrpath"; then - # If the user specified any rpath flags, then add them. - temp_xrpath= - for libdir in $xrpath; do - temp_xrpath="$temp_xrpath -R$libdir" - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" ;; - esac - done - if test $hardcode_into_libs != yes || test $build_old_libs = yes; then - dependency_libs="$temp_xrpath $dependency_libs" - fi - fi - - # Make sure dlfiles contains only unique files that won't be dlpreopened - old_dlfiles="$dlfiles" - dlfiles= - for lib in $old_dlfiles; do - case " $dlprefiles $dlfiles " in - *" $lib "*) ;; - *) dlfiles="$dlfiles $lib" ;; - esac - done - - # Make sure dlprefiles contains only unique files - old_dlprefiles="$dlprefiles" - dlprefiles= - for lib in $old_dlprefiles; do - case "$dlprefiles " in - *" $lib "*) ;; - *) dlprefiles="$dlprefiles $lib" ;; - esac - done - - if test "$build_libtool_libs" = yes; then - if test -n "$rpath"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) - # these systems don't actually have a c library (as such)! - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C library is in the System framework - deplibs="$deplibs -framework System" - ;; - *-*-netbsd*) - # Don't link with libc until the a.out ld.so is fixed. - ;; - *-*-openbsd*) - # Do not include libc due to us having libc/libc_r. - ;; - *) - # Add libc to deplibs on all other systems if necessary. - if test $build_libtool_need_lc = "yes"; then - deplibs="$deplibs -lc" - fi - ;; - esac - fi - - # Transform deplibs into only deplibs that can be linked in shared. - name_save=$name - libname_save=$libname - release_save=$release - versuffix_save=$versuffix - major_save=$major - # I'm not sure if I'm treating the release correctly. I think - # release should show up in the -l (ie -lgmp5) so we don't want to - # add it in twice. Is that correct? - release="" - versuffix="" - major="" - newdeplibs= - droppeddeps=no - case $deplibs_check_method in - pass_all) - # Don't check for shared/static. Everything works. - # This might be a little naive. We might want to check - # whether the library exists or not. But this is on - # osf3 & osf4 and I'm not really sure... Just - # implementing what was already the behaviour. - newdeplibs=$deplibs - ;; - test_compile) - # This code stresses the "libraries are programs" paradigm to its - # limits. Maybe even breaks it. We compile a program, linking it - # against the deplibs as a proxy for the library. Then we can check - # whether they linked in statically or dynamically with ldd. - $rm conftest.c - cat > conftest.c </dev/null` - for potent_lib in $potential_libs; do - # Follow soft links. - if ls -lLd "$potent_lib" 2>/dev/null \ - | grep " -> " >/dev/null; then - continue - fi - # The statement above tries to avoid entering an - # endless loop below, in case of cyclic links. - # We might still enter an endless loop, since a link - # loop can be closed while we follow links, - # but so what? - potlib="$potent_lib" - while test -h "$potlib" 2>/dev/null; do - potliblink=`ls -ld $potlib | sed 's/.* -> //'` - case $potliblink in - [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; - *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; - esac - done - if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ - | sed 10q \ - | egrep "$file_magic_regex" > /dev/null; then - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - break 2 - fi - done - done - if test -n "$a_deplib" ; then - droppeddeps=yes - echo - echo "*** Warning: This library needs some functionality provided by $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - fi - else - # Add a -L argument. - newdeplibs="$newdeplibs $a_deplib" - fi - done # Gone through all deplibs. - ;; - match_pattern*) - set dummy $deplibs_check_method - match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` - for a_deplib in $deplibs; do - name="`expr $a_deplib : '-l\(.*\)'`" - # If $name is empty we are operating on a -L argument. - if test -n "$name" && test "$name" != "0"; then - libname=`eval \\$echo \"$libname_spec\"` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do - if eval echo \"$potent_lib\" 2>/dev/null \ - | sed 10q \ - | egrep "$match_pattern_regex" > /dev/null; then - newdeplibs="$newdeplibs $a_deplib" - a_deplib="" - break 2 - fi - done - done - if test -n "$a_deplib" ; then - droppeddeps=yes - echo - echo "*** Warning: This library needs some functionality provided by $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - fi - else - # Add a -L argument. - newdeplibs="$newdeplibs $a_deplib" - fi - done # Gone through all deplibs. - ;; - none | unknown | *) - newdeplibs="" - if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ - -e 's/ -[LR][^ ]*//g' -e 's/[ ]//g' | - grep . >/dev/null; then - echo - if test "X$deplibs_check_method" = "Xnone"; then - echo "*** Warning: inter-library dependencies are not supported in this platform." - else - echo "*** Warning: inter-library dependencies are not known to be supported." - fi - echo "*** All declared inter-library dependencies are being dropped." - droppeddeps=yes - fi - ;; - esac - versuffix=$versuffix_save - major=$major_save - release=$release_save - libname=$libname_save - name=$name_save - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library is the System framework - newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` - ;; - esac - - if test "$droppeddeps" = yes; then - if test "$module" = yes; then - echo - echo "*** Warning: libtool could not satisfy all declared inter-library" - echo "*** dependencies of module $libname. Therefore, libtool will create" - echo "*** a static module, that should work as long as the dlopening" - echo "*** application is linked with the -dlopen flag." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." - fi - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - else - echo "*** The inter-library dependencies that have been dropped here will be" - echo "*** automatically added whenever a program is linked with this library" - echo "*** or is declared to -dlopen it." - - if test $allow_undefined = no; then - echo - echo "*** Since this library must not contain undefined symbols," - echo "*** because either the platform does not support them or" - echo "*** it was explicitly requested with -no-undefined," - echo "*** libtool will only create a static version of it." - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - fi - fi - # Done checking deplibs! - deplibs=$newdeplibs - fi - - # All the library-specific variables (install_libdir is set above). - library_names= - old_library= - dlname= - - # Test again, we may have decided not to build it any more - if test "$build_libtool_libs" = yes; then - if test $hardcode_into_libs = yes; then - # Hardcode the library paths - hardcode_libdirs= - dep_rpath= - rpath="$finalize_rpath" - test "$mode" != relink && rpath="$compile_rpath$rpath" - for libdir in $rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - dep_rpath="$dep_rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) perm_rpath="$perm_rpath $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval dep_rpath=\"$hardcode_libdir_flag_spec\" - fi - if test -n "$runpath_var" && test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - rpath="$rpath$dir:" - done - eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" - fi - test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" - fi - - shlibpath="$finalize_shlibpath" - test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" - if test -n "$shlibpath"; then - eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" - fi - - # Get the real and link names of the library. - eval library_names=\"$library_names_spec\" - set dummy $library_names - realname="$2" - shift; shift - - if test -n "$soname_spec"; then - eval soname=\"$soname_spec\" - else - soname="$realname" - fi - test -z "$dlname" && dlname=$soname - - lib="$output_objdir/$realname" - for link - do - linknames="$linknames $link" - done - - # Ensure that we have .o objects for linkers which dislike .lo - # (e.g. aix) in case we are running --disable-static - for obj in $libobjs; do - xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$obj"; then - xdir="." - else - xdir="$xdir" - fi - baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` - oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` - if test ! -f $xdir/$oldobj; then - $show "(cd $xdir && ${LN_S} $baseobj $oldobj)" - $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $? - fi - done - - # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then - $show "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $run $rm $export_symbols - eval cmds=\"$export_symbols_cmds\" - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - if test -n "$export_symbols_regex"; then - $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" - $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - $show "$mv \"${export_symbols}T\" \"$export_symbols\"" - $run eval '$mv "${export_symbols}T" "$export_symbols"' - fi - fi - fi - - if test -n "$export_symbols" && test -n "$include_expsyms"; then - $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' - fi - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - else - gentop="$output_objdir/${outputname}x" - $show "${rm}r $gentop" - $run ${rm}r "$gentop" - $show "mkdir $gentop" - $run mkdir "$gentop" - status=$? - if test $status -ne 0 && test ! -d "$gentop"; then - exit $status - fi - generated="$generated $gentop" - - for xlib in $convenience; do - # Extract the objects. - case $xlib in - [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; - *) xabs=`pwd`"/$xlib" ;; - esac - xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` - xdir="$gentop/$xlib" - - $show "${rm}r $xdir" - $run ${rm}r "$xdir" - $show "mkdir $xdir" - $run mkdir "$xdir" - status=$? - if test $status -ne 0 && test ! -d "$xdir"; then - exit $status - fi - $show "(cd $xdir && $AR x $xabs)" - $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? - - libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` - done - fi - fi - - if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then - eval flag=\"$thread_safe_flag_spec\" - linker_flags="$linker_flags $flag" - fi - - # Make a backup of the uninstalled library when relinking - if test "$mode" = relink; then - $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? - fi - - # Do each of the archive commands. - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval cmds=\"$archive_expsym_cmds\" - else - eval cmds=\"$archive_cmds\" - fi - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - - # Restore the uninstalled library and exit - if test "$mode" = relink; then - $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? - exit 0 - fi - - # Create links to the real library. - for linkname in $linknames; do - if test "$realname" != "$linkname"; then - $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" - $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? - fi - done - - # If -module or -export-dynamic was specified, set the dlname. - if test "$module" = yes || test "$export_dynamic" = yes; then - # On all known operating systems, these are identical. - dlname="$soname" - fi - fi - ;; - - obj) - if test -n "$deplibs"; then - $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 - fi - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 - fi - - if test -n "$rpath"; then - $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 - fi - - if test -n "$xrpath"; then - $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 - fi - - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 - fi - - case $output in - *.lo) - if test -n "$objs$old_deplibs"; then - $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 - exit 1 - fi - libobj="$output" - obj=`$echo "X$output" | $Xsed -e "$lo2o"` - ;; - *) - libobj= - obj="$output" - ;; - esac - - # Delete the old objects. - $run $rm $obj $libobj - - # Objects from convenience libraries. This assumes - # single-version convenience libraries. Whenever we create - # different ones for PIC/non-PIC, this we'll have to duplicate - # the extraction. - reload_conv_objs= - gentop= - # reload_cmds runs $LD directly, so let us get rid of - # -Wl from whole_archive_flag_spec - wl= - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" - else - gentop="$output_objdir/${obj}x" - $show "${rm}r $gentop" - $run ${rm}r "$gentop" - $show "mkdir $gentop" - $run mkdir "$gentop" - status=$? - if test $status -ne 0 && test ! -d "$gentop"; then - exit $status - fi - generated="$generated $gentop" - - for xlib in $convenience; do - # Extract the objects. - case $xlib in - [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; - *) xabs=`pwd`"/$xlib" ;; - esac - xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` - xdir="$gentop/$xlib" - - $show "${rm}r $xdir" - $run ${rm}r "$xdir" - $show "mkdir $xdir" - $run mkdir "$xdir" - status=$? - if test $status -ne 0 && test ! -d "$xdir"; then - exit $status - fi - $show "(cd $xdir && $AR x $xabs)" - $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? - - reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` - done - fi - fi - - # Create the old-style object. - reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test - - output="$obj" - eval cmds=\"$reload_cmds\" - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - - # Exit if we aren't doing a library object file. - if test -z "$libobj"; then - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - exit 0 - fi - - if test "$build_libtool_libs" != yes; then - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - # Create an invalid libtool object if no PIC, so that we don't - # accidentally link it into a program. - $show "echo timestamp > $libobj" - $run eval "echo timestamp > $libobj" || exit $? - exit 0 - fi - - if test -n "$pic_flag" || test "$pic_mode" != default; then - # Only do commands if we really have different PIC objects. - reload_objs="$libobjs $reload_conv_objs" - output="$libobj" - eval cmds=\"$reload_cmds\" - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - else - # Just create a symlink. - $show $rm $libobj - $run $rm $libobj - xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$libobj"; then - xdir="." - else - xdir="$xdir" - fi - baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` - oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` - $show "(cd $xdir && $LN_S $oldobj $baseobj)" - $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $? - fi - - if test -n "$gentop"; then - $show "${rm}r $gentop" - $run ${rm}r $gentop - fi - - exit 0 - ;; - - prog) - case $host in - *cygwin*) output=`echo $output | sed -e 's,.exe$,,;s,$,.exe,'` ;; - esac - if test -n "$vinfo"; then - $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 - fi - - if test -n "$release"; then - $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 - fi - - if test "$preload" = yes; then - if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && - test "$dlopen_self_static" = unknown; then - $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." - fi - fi - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library is the System framework - compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` - finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` - ;; - esac - - compile_command="$compile_command $compile_deplibs" - finalize_command="$finalize_command $finalize_deplibs" - - if test -n "$rpath$xrpath"; then - # If the user specified any rpath flags, then add them. - for libdir in $rpath $xrpath; do - # This is the magic to use -rpath. - case "$finalize_rpath " in - *" $libdir "*) ;; - *) finalize_rpath="$finalize_rpath $libdir" ;; - esac - done - fi - - # Now hardcode the library paths - rpath= - hardcode_libdirs= - for libdir in $compile_rpath $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - rpath="$rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) perm_rpath="$perm_rpath $libdir" ;; - esac - fi - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) - case :$dllsearchpath: in - *":$libdir:"*) ;; - *) dllsearchpath="$dllsearchpath:$libdir";; - esac - ;; - esac - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - compile_rpath="$rpath" - - rpath= - hardcode_libdirs= - for libdir in $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - rpath="$rpath $flag" - fi - elif test -n "$runpath_var"; then - case "$finalize_perm_rpath " in - *" $libdir "*) ;; - *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - finalize_rpath="$rpath" - - if test -n "$libobjs" && test "$build_old_libs" = yes; then - # Transform all the library objects into standard objects. - compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - fi - - dlsyms= - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - if test -n "$NM" && test -n "$global_symbol_pipe"; then - dlsyms="${outputname}S.c" - else - $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 - fi - fi - - if test -n "$dlsyms"; then - case $dlsyms in - "") ;; - *.c) - # Discover the nlist of each of the dlfiles. - nlist="$output_objdir/${outputname}.nm" - - $show "$rm $nlist ${nlist}S ${nlist}T" - $run $rm "$nlist" "${nlist}S" "${nlist}T" - - # Parse the name list into a source file. - $show "creating $output_objdir/$dlsyms" - - test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ -/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ -/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ - -#ifdef __cplusplus -extern \"C\" { -#endif - -/* Prevent the only kind of declaration conflicts we can make. */ -#define lt_preloaded_symbols some_other_symbol - -/* External symbol declarations for the compiler. */\ -" - - if test "$dlself" = yes; then - $show "generating symbol list for \`$output'" - - test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" - - # Add our own program objects to the symbol list. - progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` - for arg in $progfiles; do - $show "extracting global C symbols from \`$arg'" - $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" - done - - if test -n "$exclude_expsyms"; then - $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' - $run eval '$mv "$nlist"T "$nlist"' - fi - - if test -n "$export_symbols_regex"; then - $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T' - $run eval '$mv "$nlist"T "$nlist"' - fi - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - export_symbols="$output_objdir/$output.exp" - $run $rm $export_symbols - $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' - else - $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' - $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' - $run eval 'mv "$nlist"T "$nlist"' - fi - fi - - for arg in $dlprefiles; do - $show "extracting global C symbols from \`$arg'" - name=`echo "$arg" | sed -e 's%^.*/%%'` - $run eval 'echo ": $name " >> "$nlist"' - $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" - done - - if test -z "$run"; then - # Make sure we have at least an empty file. - test -f "$nlist" || : > "$nlist" - - if test -n "$exclude_expsyms"; then - egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T - $mv "$nlist"T "$nlist" - fi - - # Try sorting and uniquifying the output. - if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then - : - else - grep -v "^: " < "$nlist" > "$nlist"S - fi - - if test -f "$nlist"S; then - eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' - else - echo '/* NONE */' >> "$output_objdir/$dlsyms" - fi - - $echo >> "$output_objdir/$dlsyms" "\ - -#undef lt_preloaded_symbols - -#if defined (__STDC__) && __STDC__ -# define lt_ptr void * -#else -# define lt_ptr char * -# define const -#endif - -/* The mapping between symbol names and symbols. */ -const struct { - const char *name; - lt_ptr address; -} -lt_preloaded_symbols[] = -{\ -" - - eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" - - $echo >> "$output_objdir/$dlsyms" "\ - {0, (lt_ptr) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif\ -" - fi - - pic_flag_for_symtable= - case $host in - # compiling the symbol table file with pic_flag works around - # a FreeBSD bug that causes programs to crash when -lm is - # linked before any other PIC object. But we must not use - # pic_flag when linking with -static. The problem exists in - # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. - *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) - case "$compile_command " in - *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";; - esac;; - *-*-hpux*) - case "$compile_command " in - *" -static "*) ;; - *) pic_flag_for_symtable=" $pic_flag -DPIC";; - esac - esac - - # Now compile the dynamic symbol file. - $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" - $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? - - # Clean up the generated files. - $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" - $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" - - # Transform the symbol file into the correct name. - compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` - finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` - ;; - *) - $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 - exit 1 - ;; - esac - else - # We keep going just in case the user didn't refer to - # lt_preloaded_symbols. The linker will fail if global_symbol_pipe - # really was required. - - # Nullify the symbol file. - compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` - finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` - fi - - if test $need_relink = no || test "$build_libtool_libs" != yes; then - # Replace the output file specification. - compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` - link_command="$compile_command$compile_rpath" - - # We have no uninstalled library dependencies, so finalize right now. - $show "$link_command" - $run eval "$link_command" - status=$? - - # Delete the generated files. - if test -n "$dlsyms"; then - $show "$rm $output_objdir/${outputname}S.${objext}" - $run $rm "$output_objdir/${outputname}S.${objext}" - fi - - exit $status - fi - - if test -n "$shlibpath_var"; then - # We should set the shlibpath_var - rpath= - for dir in $temp_rpath; do - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) - # Absolute path. - rpath="$rpath$dir:" - ;; - *) - # Relative path: add a thisdir entry. - rpath="$rpath\$thisdir/$dir:" - ;; - esac - done - temp_rpath="$rpath" - fi - - if test -n "$compile_shlibpath$finalize_shlibpath"; then - compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" - fi - if test -n "$finalize_shlibpath"; then - finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" - fi - - compile_var= - finalize_var= - if test -n "$runpath_var"; then - if test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - rpath="$rpath$dir:" - done - compile_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - if test -n "$finalize_perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $finalize_perm_rpath; do - rpath="$rpath$dir:" - done - finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - fi - - if test "$no_install" = yes; then - # We don't need to create a wrapper script. - link_command="$compile_var$compile_command$compile_rpath" - # Replace the output file specification. - link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` - # Delete the old output file. - $run $rm $output - # Link the executable and exit - $show "$link_command" - $run eval "$link_command" || exit $? - exit 0 - fi - - if test "$hardcode_action" = relink; then - # Fast installation is not supported - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - - $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 - $echo "$modename: \`$output' will be relinked during installation" 1>&2 - else - if test "$fast_install" != no; then - link_command="$finalize_var$compile_command$finalize_rpath" - if test "$fast_install" = yes; then - relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` - else - # fast_install is set to needless - relink_command= - fi - else - link_command="$compile_var$compile_command$compile_rpath" - relink_command="$finalize_var$finalize_command$finalize_rpath" - fi - fi - - # Replace the output file specification. - link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` - - # Delete the old output files. - $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname - - $show "$link_command" - $run eval "$link_command" || exit $? - - # Now create the wrapper script. - $show "creating $output" - - # Quote the relink command for shipping. - if test -n "$relink_command"; then - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` - relink_command="$var=\"$var_value\"; export $var; $relink_command" - fi - done - relink_command="cd `pwd`; $relink_command" - relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` - fi - - # Quote $echo for shipping. - if test "X$echo" = "X$SHELL $0 --fallback-echo"; then - case $0 in - [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";; - *) qecho="$SHELL `pwd`/$0 --fallback-echo";; - esac - qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` - else - qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` - fi - - # Only actually do things if our run command is non-null. - if test -z "$run"; then - # win32 will think the script is a binary if it has - # a .exe suffix, so we strip it off here. - case $output in - *.exe) output=`echo $output|sed 's,.exe$,,'` ;; - esac - # test for cygwin because mv fails w/o .exe extensions - case $host in - *cygwin*) exeext=.exe ;; - *) exeext= ;; - esac - $rm $output - trap "$rm $output; exit 1" 1 2 15 - - $echo > $output "\ -#! $SHELL - -# $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP -# -# The $output program cannot be directly executed until all the libtool -# libraries that it depends on are installed. -# -# This wrapper script should never be moved out of the build directory. -# If it is, it will not operate correctly. - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed='sed -e 1s/^X//' -sed_quote_subst='$sed_quote_subst' - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi - -relink_command=\"$relink_command\" - -# This environment variable determines our operation mode. -if test \"\$libtool_install_magic\" = \"$magic\"; then - # install mode needs the following variable: - notinst_deplibs='$notinst_deplibs' -else - # When we are sourced in execute mode, \$file and \$echo are already set. - if test \"\$libtool_execute_magic\" != \"$magic\"; then - echo=\"$qecho\" - file=\"\$0\" - # Make sure echo works. - if test \"X\$1\" = X--no-reexec; then - # Discard the --no-reexec flag, and continue. - shift - elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then - # Yippee, \$echo works! - : - else - # Restart under the correct shell, and then maybe \$echo will work. - exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} - fi - fi\ -" - $echo >> $output "\ - - # Find the directory that this script lives in. - thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` - test \"x\$thisdir\" = \"x\$file\" && thisdir=. - - # Follow symbolic links until we get to the real thisdir. - file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\` - while test -n \"\$file\"; do - destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` - - # If there was a directory component, then change thisdir. - if test \"x\$destdir\" != \"x\$file\"; then - case \"\$destdir\" in - [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; - *) thisdir=\"\$thisdir/\$destdir\" ;; - esac - fi - - file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\` - done - - # Try to get the absolute directory name. - absdir=\`cd \"\$thisdir\" && pwd\` - test -n \"\$absdir\" && thisdir=\"\$absdir\" -" - - if test "$fast_install" = yes; then - echo >> $output "\ - program=lt-'$outputname'$exeext - progdir=\"\$thisdir/$objdir\" - - if test ! -f \"\$progdir/\$program\" || \\ - { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\ - test \"X\$file\" != \"X\$progdir/\$program\"; }; then - - file=\"\$\$-\$program\" - - if test ! -d \"\$progdir\"; then - $mkdir \"\$progdir\" - else - $rm \"\$progdir/\$file\" - fi" - - echo >> $output "\ - - # relink executable if necessary - if test -n \"\$relink_command\"; then - if relink_command_output=\`eval \$relink_command 2>&1\`; then : - else - $echo \"\$relink_command_output\" >&2 - $rm \"\$progdir/\$file\" - exit 1 - fi - fi - - $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || - { $rm \"\$progdir/\$program\"; - $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } - $rm \"\$progdir/\$file\" - fi" - else - echo >> $output "\ - program='$outputname' - progdir=\"\$thisdir/$objdir\" -" - fi - - echo >> $output "\ - - if test -f \"\$progdir/\$program\"; then" - - # Export our shlibpath_var if we have one. - if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - $echo >> $output "\ - # Add our own library path to $shlibpath_var - $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" - - # Some systems cannot cope with colon-terminated $shlibpath_var - # The second colon is a workaround for a bug in BeOS R4 sed - $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` - - export $shlibpath_var -" - fi - - # fixup the dll searchpath if we need to. - if test -n "$dllsearchpath"; then - $echo >> $output "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - - $echo >> $output "\ - if test \"\$libtool_execute_magic\" != \"$magic\"; then - # Run the actual program with our arguments. -" - case $host in - # win32 systems need to use the prog path for dll - # lookup to work - *-*-cygwin* | *-*-pw32*) - $echo >> $output "\ - exec \$progdir/\$program \${1+\"\$@\"} -" - ;; - - # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2*) - $echo >> $output "\ - exec \$progdir\\\\\$program \${1+\"\$@\"} -" - ;; - - *) - $echo >> $output "\ - # Export the path to the program. - PATH=\"\$progdir:\$PATH\" - export PATH - - exec \$program \${1+\"\$@\"} -" - ;; - esac - $echo >> $output "\ - \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" - exit 1 - fi - else - # The program doesn't exist. - \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 - \$echo \"This script is just a wrapper for \$program.\" 1>&2 - echo \"See the $PACKAGE documentation for more information.\" 1>&2 - exit 1 - fi -fi\ -" - chmod +x $output - fi - exit 0 - ;; - esac - - # See if we need to build an old-fashioned archive. - for oldlib in $oldlibs; do - - if test "$build_libtool_libs" = convenience; then - oldobjs="$libobjs_save" - addlibs="$convenience" - build_libtool_libs=no - else - if test "$build_libtool_libs" = module; then - oldobjs="$libobjs_save" - build_libtool_libs=no - else - oldobjs="$objs$old_deplibs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP` - fi - addlibs="$old_convenience" - fi - - if test -n "$addlibs"; then - gentop="$output_objdir/${outputname}x" - $show "${rm}r $gentop" - $run ${rm}r "$gentop" - $show "mkdir $gentop" - $run mkdir "$gentop" - status=$? - if test $status -ne 0 && test ! -d "$gentop"; then - exit $status - fi - generated="$generated $gentop" - - # Add in members from convenience archives. - for xlib in $addlibs; do - # Extract the objects. - case $xlib in - [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; - *) xabs=`pwd`"/$xlib" ;; - esac - xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` - xdir="$gentop/$xlib" - - $show "${rm}r $xdir" - $run ${rm}r "$xdir" - $show "mkdir $xdir" - $run mkdir "$xdir" - status=$? - if test $status -ne 0 && test ! -d "$xdir"; then - exit $status - fi - $show "(cd $xdir && $AR x $xabs)" - $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? - - oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` - done - fi - - # Do each command in the archive commands. - if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then - eval cmds=\"$old_archive_from_new_cmds\" - else - # Ensure that we have .o objects in place in case we decided - # not to build a shared library, and have fallen back to building - # static libs even though --disable-static was passed! - for oldobj in $oldobjs; do - if test ! -f $oldobj; then - xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'` - if test "X$xdir" = "X$oldobj"; then - xdir="." - else - xdir="$xdir" - fi - baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'` - obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` - $show "(cd $xdir && ${LN_S} $obj $baseobj)" - $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $? - fi - done - - eval cmds=\"$old_archive_cmds\" - fi - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - done - - if test -n "$generated"; then - $show "${rm}r$generated" - $run ${rm}r$generated - fi - - # Now create the libtool archive. - case $output in - *.la) - old_library= - test "$build_old_libs" = yes && old_library="$libname.$libext" - $show "creating $output" - - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` - relink_command="$var=\"$var_value\"; export $var; $relink_command" - fi - done - # Quote the link command for shipping. - relink_command="cd `pwd`; $SHELL $0 --mode=relink $libtool_args" - relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` - - # Only create the output if not a dry run. - if test -z "$run"; then - for installed in no yes; do - if test "$installed" = yes; then - if test -z "$install_libdir"; then - break - fi - output="$output_objdir/$outputname"i - # Replace all uninstalled libtool libraries with the installed ones - newdependency_libs= - for deplib in $dependency_libs; do - case $deplib in - *.la) - name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` - eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - if test -z "$libdir"; then - $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 - exit 1 - fi - newdependency_libs="$newdependency_libs $libdir/$name" - ;; - *) newdependency_libs="$newdependency_libs $deplib" ;; - esac - done - dependency_libs="$newdependency_libs" - newdlfiles= - for lib in $dlfiles; do - name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` - eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - if test -z "$libdir"; then - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit 1 - fi - newdlfiles="$newdlfiles $libdir/$name" - done - dlfiles="$newdlfiles" - newdlprefiles= - for lib in $dlprefiles; do - name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` - eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - if test -z "$libdir"; then - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - exit 1 - fi - newdlprefiles="$newdlprefiles $libdir/$name" - done - dlprefiles="$newdlprefiles" - fi - $rm $output - # place dlname in correct position for cygwin - tdlname=$dlname - case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; - esac - $echo > $output "\ -# $outputname - a libtool library file -# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='$tdlname' - -# Names of this library. -library_names='$library_names' - -# The name of the static archive. -old_library='$old_library' - -# Libraries that this one depends upon. -dependency_libs='$dependency_libs' - -# Version information for $libname. -current=$current -age=$age -revision=$revision - -# Is this an already installed library? -installed=$installed - -# Files to dlopen/dlpreopen -dlopen='$dlfiles' -dlpreopen='$dlprefiles' - -# Directory that this library needs to be installed in: -libdir='$install_libdir'" - if test "$installed" = no && test $need_relink = yes; then - $echo >> $output "\ -relink_command=\"$relink_command\"" - fi - done - fi - - # Do a symbolic link so that the libtool archive can be found in - # LD_LIBRARY_PATH before the program is installed. - $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" - $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? - ;; - esac - exit 0 - ;; - - # libtool install mode - install) - modename="$modename: install" - - # There may be an optional sh(1) argument at the beginning of - # install_prog (especially on Windows NT). - if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || - # Allow the use of GNU shtool's install command. - $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then - # Aesthetically quote it. - arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) - arg="\"$arg\"" - ;; - esac - install_prog="$arg " - arg="$1" - shift - else - install_prog= - arg="$nonopt" - fi - - # The real first argument should be the name of the installation program. - # Aesthetically quote it. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) - arg="\"$arg\"" - ;; - esac - install_prog="$install_prog$arg" - - # We need to accept at least all the BSD install flags. - dest= - files= - opts= - prev= - install_type= - isdir=no - stripme= - for arg - do - if test -n "$dest"; then - files="$files $dest" - dest="$arg" - continue - fi - - case $arg in - -d) isdir=yes ;; - -f) prev="-f" ;; - -g) prev="-g" ;; - -m) prev="-m" ;; - -o) prev="-o" ;; - -s) - stripme=" -s" - continue - ;; - -*) ;; - - *) - # If the previous option needed an argument, then skip it. - if test -n "$prev"; then - prev= - else - dest="$arg" - continue - fi - ;; - esac - - # Aesthetically quote the argument. - arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` - case $arg in - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) - arg="\"$arg\"" - ;; - esac - install_prog="$install_prog $arg" - done - - if test -z "$install_prog"; then - $echo "$modename: you must specify an install program" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - if test -n "$prev"; then - $echo "$modename: the \`$prev' option requires an argument" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - if test -z "$files"; then - if test -z "$dest"; then - $echo "$modename: no file or destination specified" 1>&2 - else - $echo "$modename: you must specify a destination" 1>&2 - fi - $echo "$help" 1>&2 - exit 1 - fi - - # Strip any trailing slash from the destination. - dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` - - # Check to see that the destination is a directory. - test -d "$dest" && isdir=yes - if test "$isdir" = yes; then - destdir="$dest" - destname= - else - destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` - test "X$destdir" = "X$dest" && destdir=. - destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` - - # Not a directory, so check to see that there is only one file specified. - set dummy $files - if test $# -gt 2; then - $echo "$modename: \`$dest' is not a directory" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - fi - case $destdir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - for file in $files; do - case $file in - *.lo) ;; - *) - $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; - esac - done - ;; - esac - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - staticlibs= - future_libdirs= - current_libdirs= - for file in $files; do - - # Do each installation. - case $file in - *.$libext) - # Do the static libraries later. - staticlibs="$staticlibs $file" - ;; - - *.la) - # Check to see that this really is a libtool archive. - if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - library_names= - old_library= - relink_command= - # If there is no directory component, then add one. - case $file in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - # Add the libdir to current_libdirs if it is the destination. - if test "X$destdir" = "X$libdir"; then - case "$current_libdirs " in - *" $libdir "*) ;; - *) current_libdirs="$current_libdirs $libdir" ;; - esac - else - # Note the libdir as a future libdir. - case "$future_libdirs " in - *" $libdir "*) ;; - *) future_libdirs="$future_libdirs $libdir" ;; - esac - fi - - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ - test "X$dir" = "X$file/" && dir= - dir="$dir$objdir" - - if test -n "$relink_command"; then - $echo "$modename: warning: relinking \`$file'" 1>&2 - $show "$relink_command" - if $run eval "$relink_command"; then : - else - $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 - continue - fi - fi - - # See the names of the shared library. - set dummy $library_names - if test -n "$2"; then - realname="$2" - shift - shift - - srcname="$realname" - test -n "$relink_command" && srcname="$realname"T - - # Install the shared library and build the symlinks. - $show "$install_prog $dir/$srcname $destdir/$realname" - $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? - if test -n "$stripme" && test -n "$striplib"; then - $show "$striplib $destdir/$realname" - $run eval "$striplib $destdir/$realname" || exit $? - fi - - if test $# -gt 0; then - # Delete the old symlinks, and create new ones. - for linkname - do - if test "$linkname" != "$realname"; then - $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" - $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" - fi - done - fi - - # Do each command in the postinstall commands. - lib="$destdir/$realname" - eval cmds=\"$postinstall_cmds\" - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - fi - - # Install the pseudo-library for information purposes. - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - instname="$dir/$name"i - $show "$install_prog $instname $destdir/$name" - $run eval "$install_prog $instname $destdir/$name" || exit $? - - # Maybe install the static library, too. - test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" - ;; - - *.lo) - # Install (i.e. copy) a libtool object. - - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - destfile="$destdir/$destfile" - fi - - # Deduce the name of the destination old-style object file. - case $destfile in - *.lo) - staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` - ;; - *.$objext) - staticdest="$destfile" - destfile= - ;; - *) - $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; - esac - - # Install the libtool object if requested. - if test -n "$destfile"; then - $show "$install_prog $file $destfile" - $run eval "$install_prog $file $destfile" || exit $? - fi - - # Install the old object if enabled. - if test "$build_old_libs" = yes; then - # Deduce the name of the old-style object file. - staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` - - $show "$install_prog $staticobj $staticdest" - $run eval "$install_prog \$staticobj \$staticdest" || exit $? - fi - exit 0 - ;; - - *) - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - destfile="$destdir/$destfile" - fi - - # Do a test to see if this is really a libtool program. - if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - notinst_deplibs= - relink_command= - - # If there is no directory component, then add one. - case $file in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - # Check the variables that should have been set. - if test -z "$notinst_deplibs"; then - $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2 - exit 1 - fi - - finalize=yes - for lib in $notinst_deplibs; do - # Check to see that each library is installed. - libdir= - if test -f "$lib"; then - # If there is no directory component, then add one. - case $lib in - */* | *\\*) . $lib ;; - *) . ./$lib ;; - esac - fi - libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test - if test -n "$libdir" && test ! -f "$libfile"; then - $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 - finalize=no - fi - done - - relink_command= - # If there is no directory component, then add one. - case $file in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - outputname= - if test "$fast_install" = no && test -n "$relink_command"; then - if test "$finalize" = yes && test -z "$run"; then - tmpdir="/tmp" - test -n "$TMPDIR" && tmpdir="$TMPDIR" - tmpdir="$tmpdir/libtool-$$" - if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : - else - $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 - continue - fi - file=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - outputname="$tmpdir/$file" - # Replace the output file specification. - relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` - - $show "$relink_command" - if $run eval "$relink_command"; then : - else - $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 - ${rm}r "$tmpdir" - continue - fi - file="$outputname" - else - $echo "$modename: warning: cannot relink \`$file'" 1>&2 - fi - else - # Install the binary that we compiled earlier. - file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` - fi - fi - - # remove .exe since cygwin /usr/bin/install will append another - # one anyways - case $install_prog,$host in - /usr/bin/install*,*cygwin*) - case $file:$destfile in - *.exe:*.exe) - # this is ok - ;; - *.exe:*) - destfile=$destfile.exe - ;; - *:*.exe) - destfile=`echo $destfile | sed -e 's,.exe$,,'` - ;; - esac - ;; - esac - $show "$install_prog$stripme $file $destfile" - $run eval "$install_prog\$stripme \$file \$destfile" || exit $? - test -n "$outputname" && ${rm}r "$tmpdir" - ;; - esac - done - - for file in $staticlibs; do - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - - # Set up the ranlib parameters. - oldlib="$destdir/$name" - - $show "$install_prog $file $oldlib" - $run eval "$install_prog \$file \$oldlib" || exit $? - - if test -n "$stripme" && test -n "$striplib"; then - $show "$old_striplib $oldlib" - $run eval "$old_striplib $oldlib" || exit $? - fi - - # Do each command in the postinstall commands. - eval cmds=\"$old_postinstall_cmds\" - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || exit $? - done - IFS="$save_ifs" - done - - if test -n "$future_libdirs"; then - $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 - fi - - if test -n "$current_libdirs"; then - # Maybe just do a dry run. - test -n "$run" && current_libdirs=" -n$current_libdirs" - exec_cmd='$SHELL $0 --finish$current_libdirs' - else - exit 0 - fi - ;; - - # libtool finish mode - finish) - modename="$modename: finish" - libdirs="$nonopt" - admincmds= - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - for dir - do - libdirs="$libdirs $dir" - done - - for libdir in $libdirs; do - if test -n "$finish_cmds"; then - # Do each command in the finish commands. - eval cmds=\"$finish_cmds\" - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" || admincmds="$admincmds - $cmd" - done - IFS="$save_ifs" - fi - if test -n "$finish_eval"; then - # Do the single finish_eval. - eval cmds=\"$finish_eval\" - $run eval "$cmds" || admincmds="$admincmds - $cmds" - fi - done - fi - - # Exit here if they wanted silent mode. - test "$show" = ":" && exit 0 - - echo "----------------------------------------------------------------------" - echo "Libraries have been installed in:" - for libdir in $libdirs; do - echo " $libdir" - done - echo - echo "If you ever happen to want to link against installed libraries" - echo "in a given directory, LIBDIR, you must either use libtool, and" - echo "specify the full pathname of the library, or use the \`-LLIBDIR'" - echo "flag during linking and do at least one of the following:" - if test -n "$shlibpath_var"; then - echo " - add LIBDIR to the \`$shlibpath_var' environment variable" - echo " during execution" - fi - if test -n "$runpath_var"; then - echo " - add LIBDIR to the \`$runpath_var' environment variable" - echo " during linking" - fi - if test -n "$hardcode_libdir_flag_spec"; then - libdir=LIBDIR - eval flag=\"$hardcode_libdir_flag_spec\" - - echo " - use the \`$flag' linker flag" - fi - if test -n "$admincmds"; then - echo " - have your system administrator run these commands:$admincmds" - fi - if test -f /etc/ld.so.conf; then - echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" - fi - echo - echo "See any operating system documentation about shared libraries for" - echo "more information, such as the ld(1) and ld.so(8) manual pages." - echo "----------------------------------------------------------------------" - exit 0 - ;; - - # libtool execute mode - execute) - modename="$modename: execute" - - # The first argument is the command name. - cmd="$nonopt" - if test -z "$cmd"; then - $echo "$modename: you must specify a COMMAND" 1>&2 - $echo "$help" - exit 1 - fi - - # Handle -dlopen flags immediately. - for file in $execute_dlfiles; do - if test ! -f "$file"; then - $echo "$modename: \`$file' is not a file" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - dir= - case $file in - *.la) - # Check to see that this really is a libtool archive. - if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : - else - $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - # Read the libtool library. - dlname= - library_names= - - # If there is no directory component, then add one. - case $file in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - # Skip this library if it cannot be dlopened. - if test -z "$dlname"; then - # Warn if it was a shared library. - test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" - continue - fi - - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$file" && dir=. - - if test -f "$dir/$objdir/$dlname"; then - dir="$dir/$objdir" - else - $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 - exit 1 - fi - ;; - - *.lo) - # Just add the directory containing the .lo file. - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - test "X$dir" = "X$file" && dir=. - ;; - - *) - $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 - continue - ;; - esac - - # Get the absolute pathname. - absdir=`cd "$dir" && pwd` - test -n "$absdir" && dir="$absdir" - - # Now add the directory to shlibpath_var. - if eval "test -z \"\$$shlibpath_var\""; then - eval "$shlibpath_var=\"\$dir\"" - else - eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" - fi - done - - # This variable tells wrapper scripts just to set shlibpath_var - # rather than running their programs. - libtool_execute_magic="$magic" - - # Check if any of the arguments is a wrapper script. - args= - for file - do - case $file in - -*) ;; - *) - # Do a test to see if this is really a libtool program. - if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - # If there is no directory component, then add one. - case $file in - */* | *\\*) . $file ;; - *) . ./$file ;; - esac - - # Transform arg to wrapped name. - file="$progdir/$program" - fi - ;; - esac - # Quote arguments (to preserve shell metacharacters). - file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` - args="$args \"$file\"" - done - - if test -z "$run"; then - if test -n "$shlibpath_var"; then - # Export the shlibpath_var. - eval "export $shlibpath_var" - fi - - # Restore saved enviroment variables - if test "${save_LC_ALL+set}" = set; then - LC_ALL="$save_LC_ALL"; export LC_ALL - fi - if test "${save_LANG+set}" = set; then - LANG="$save_LANG"; export LANG - fi - - # Now prepare to actually exec the command. - exec_cmd='"$cmd"$args' - else - # Display what would be done. - if test -n "$shlibpath_var"; then - eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" - $echo "export $shlibpath_var" - fi - $echo "$cmd$args" - exit 0 - fi - ;; - - # libtool clean and uninstall mode - clean | uninstall) - modename="$modename: $mode" - rm="$nonopt" - files= - rmforce= - exit_status=0 - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - for arg - do - case $arg in - -f) rm="$rm $arg"; rmforce=yes ;; - -*) rm="$rm $arg" ;; - *) files="$files $arg" ;; - esac - done - - if test -z "$rm"; then - $echo "$modename: you must specify an RM program" 1>&2 - $echo "$help" 1>&2 - exit 1 - fi - - rmdirs= - - for file in $files; do - dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` - if test "X$dir" = "X$file"; then - dir=. - objdir="$objdir" - else - objdir="$dir/$objdir" - fi - name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` - test $mode = uninstall && objdir="$dir" - - # Remember objdir for removal later, being careful to avoid duplicates - if test $mode = clean; then - case " $rmdirs " in - *" $objdir "*) ;; - *) rmdirs="$rmdirs $objdir" ;; - esac - fi - - # Don't error if the file doesn't exist and rm -f was used. - if (test -L "$file") >/dev/null 2>&1 \ - || (test -h "$file") >/dev/null 2>&1 \ - || test -f "$file"; then - : - elif test -d "$file"; then - exit_status=1 - continue - elif test "$rmforce" = yes; then - continue - fi - - rmfiles="$file" - - case $name in - *.la) - # Possibly a libtool archive, so verify it. - if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - . $dir/$name - - # Delete the libtool libraries and symlinks. - for n in $library_names; do - rmfiles="$rmfiles $objdir/$n" - done - test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" - test $mode = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" - - if test $mode = uninstall; then - if test -n "$library_names"; then - # Do each command in the postuninstall commands. - eval cmds=\"$postuninstall_cmds\" - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" - if test $? != 0 && test "$rmforce" != yes; then - exit_status=1 - fi - done - IFS="$save_ifs" - fi - - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - eval cmds=\"$old_postuninstall_cmds\" - save_ifs="$IFS"; IFS='~' - for cmd in $cmds; do - IFS="$save_ifs" - $show "$cmd" - $run eval "$cmd" - if test $? != 0 && test "$rmforce" != yes; then - exit_status=1 - fi - done - IFS="$save_ifs" - fi - # FIXME: should reinstall the best remaining shared library. - fi - fi - ;; - - *.lo) - if test "$build_old_libs" = yes; then - oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` - rmfiles="$rmfiles $dir/$oldobj" - fi - ;; - - *) - # Do a test to see if this is a libtool program. - if test $mode = clean && - (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then - relink_command= - . $dir/$file - - rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" - if test "$fast_install" = yes && test -n "$relink_command"; then - rmfiles="$rmfiles $objdir/lt-$name" - fi - fi - ;; - esac - $show "$rm $rmfiles" - $run $rm $rmfiles || exit_status=1 - done - - # Try to remove the ${objdir}s in the directories where we deleted files - for dir in $rmdirs; do - if test -d "$dir"; then - $show "rmdir $dir" - $run rmdir $dir >/dev/null 2>&1 - fi - done - - exit $exit_status - ;; - - "") - $echo "$modename: you must specify a MODE" 1>&2 - $echo "$generic_help" 1>&2 - exit 1 - ;; - esac - - if test -z "$exec_cmd"; then - $echo "$modename: invalid operation mode \`$mode'" 1>&2 - $echo "$generic_help" 1>&2 - exit 1 - fi -fi # test -z "$show_help" - -if test -n "$exec_cmd"; then - eval exec $exec_cmd - exit 1 -fi - -# We need to display help for each of the modes. -case $mode in -"") $echo \ -"Usage: $modename [OPTION]... [MODE-ARG]... - -Provide generalized library-building support services. - - --config show all configuration variables - --debug enable verbose shell tracing --n, --dry-run display commands without modifying any files - --features display basic configuration information and exit - --finish same as \`--mode=finish' - --help display this help message and exit - --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] - --quiet same as \`--silent' - --silent don't print informational messages - --version print version information - -MODE must be one of the following: - - clean remove files from the build directory - compile compile a source file into a libtool object - execute automatically set library path, then run a program - finish complete the installation of libtool libraries - install install libraries or executables - link create a library or an executable - uninstall remove libraries from an installed directory - -MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for -a more detailed description of MODE." - exit 0 - ;; - -clean) - $echo \ -"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... - -Remove files from the build directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, object or program, all the files associated -with it are deleted. Otherwise, only FILE itself is deleted using RM." - ;; - -compile) - $echo \ -"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE - -Compile a source file into a libtool library object. - -This mode accepts the following additional options: - - -o OUTPUT-FILE set the output file name to OUTPUT-FILE - -prefer-pic try to building PIC objects only - -prefer-non-pic try to building non-PIC objects only - -static always build a \`.o' file suitable for static linking - -COMPILE-COMMAND is a command to be used in creating a \`standard' object file -from the given SOURCEFILE. - -The output file name is determined by removing the directory component from -SOURCEFILE, then substituting the C source code suffix \`.c' with the -library object suffix, \`.lo'." - ;; - -execute) - $echo \ -"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... - -Automatically set library path, then run a program. - -This mode accepts the following additional options: - - -dlopen FILE add the directory containing FILE to the library path - -This mode sets the library path environment variable according to \`-dlopen' -flags. - -If any of the ARGS are libtool executable wrappers, then they are translated -into their corresponding uninstalled binary, and any of their required library -directories are added to the library path. - -Then, COMMAND is executed, with ARGS as arguments." - ;; - -finish) - $echo \ -"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... - -Complete the installation of libtool libraries. - -Each LIBDIR is a directory that contains libtool libraries. - -The commands that this mode executes may require superuser privileges. Use -the \`--dry-run' option if you just want to see what would be executed." - ;; - -install) - $echo \ -"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... - -Install executables or libraries. - -INSTALL-COMMAND is the installation command. The first component should be -either the \`install' or \`cp' program. - -The rest of the components are interpreted as arguments to that command (only -BSD-compatible install options are recognized)." - ;; - -link) - $echo \ -"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... - -Link object files or libraries together to form another library, or to -create an executable program. - -LINK-COMMAND is a command using the C compiler that you would use to create -a program from several object files. - -The following components of LINK-COMMAND are treated specially: - - -all-static do not do any dynamic linking at all - -avoid-version do not add a version suffix if possible - -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime - -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols - -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) - -export-symbols SYMFILE - try to export only the symbols listed in SYMFILE - -export-symbols-regex REGEX - try to export only the symbols matching REGEX - -LLIBDIR search LIBDIR for required installed libraries - -lNAME OUTPUT-FILE requires the installed library libNAME - -module build a library that can dlopened - -no-fast-install disable the fast-install mode - -no-install link a not-installable executable - -no-undefined declare that a library does not refer to external symbols - -o OUTPUT-FILE create OUTPUT-FILE from the specified objects - -release RELEASE specify package release information - -rpath LIBDIR the created library will eventually be installed in LIBDIR - -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries - -static do not do any dynamic linking of libtool libraries - -version-info CURRENT[:REVISION[:AGE]] - specify library version info [each variable defaults to 0] - -All other options (arguments beginning with \`-') are ignored. - -Every other argument is treated as a filename. Files ending in \`.la' are -treated as uninstalled libtool libraries, other files are standard or library -object files. - -If the OUTPUT-FILE ends in \`.la', then a libtool library is created, -only library objects (\`.lo' files) may be specified, and \`-rpath' is -required, except when creating a convenience library. - -If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created -using \`ar' and \`ranlib', or on Windows using \`lib'. - -If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file -is created, otherwise an executable program is created." - ;; - -uninstall) - $echo \ -"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... - -Remove libraries from an installation directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed -to RM. - -If FILE is a libtool library, all the files associated with it are deleted. -Otherwise, only FILE itself is deleted using RM." - ;; - -*) - $echo "$modename: invalid operation mode \`$mode'" 1>&2 - $echo "$help" 1>&2 - exit 1 - ;; -esac - -echo -$echo "Try \`$modename --help' for more information about other modes." - -exit 0 - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: diff --git a/mplib/missing b/mplib/missing deleted file mode 100755 index 0a7fb5a..0000000 --- a/mplib/missing +++ /dev/null @@ -1,283 +0,0 @@ -#! /bin/sh -# Common stub for a few missing GNU programs while installing. -# Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc. -# Originally by Fran,cois Pinard , 1996. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -if test $# -eq 0; then - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 -fi - -run=: - -# In the cases where this matters, `missing' is being run in the -# srcdir already. -if test -f configure.ac; then - configure_ac=configure.ac -else - configure_ac=configure.in -fi - -case "$1" in ---run) - # Try to run requested program, and just exit if it succeeds. - run= - shift - "$@" && exit 0 - ;; -esac - -# If it does not exist, or fails to run (possibly an outdated version), -# try to emulate it. -case "$1" in - - -h|--h|--he|--hel|--help) - echo "\ -$0 [OPTION]... PROGRAM [ARGUMENT]... - -Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. - -Options: - -h, --help display this help and exit - -v, --version output version information and exit - --run try to run the given command, and emulate it if it fails - -Supported PROGRAM values: - aclocal touch file \`aclocal.m4' - autoconf touch file \`configure' - autoheader touch file \`config.h.in' - automake touch all \`Makefile.in' files - bison create \`y.tab.[ch]', if possible, from existing .[ch] - flex create \`lex.yy.c', if possible, from existing .c - help2man touch the output file - lex create \`lex.yy.c', if possible, from existing .c - makeinfo touch the output file - tar try tar, gnutar, gtar, then tar without non-portable flags - yacc create \`y.tab.[ch]', if possible, from existing .[ch]" - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing 0.3 - GNU automake" - ;; - - -*) - echo 1>&2 "$0: Unknown \`$1' option" - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 - ;; - - aclocal) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`acinclude.m4' or \`${configure_ac}'. You might want - to install the \`Automake' and \`Perl' packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`${configure_ac}'. You might want to install the - \`Autoconf' and \`GNU m4' packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`acconfig.h' or \`${configure_ac}'. You might want - to install the \`Autoconf' and \`GNU m4' packages. Grab them - from any GNU archive site." - files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` - test -z "$files" && files="config.h" - touch_files= - for f in $files; do - case "$f" in - *:*) touch_files="$touch_files "`echo "$f" | - sed -e 's/^[^:]*://' -e 's/:.*//'`;; - *) touch_files="$touch_files $f.in";; - esac - done - touch $touch_files - ;; - - automake) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. - You might want to install the \`Automake' and \`Perl' packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print | - sed 's/\.am$/.in/' | - while read f; do touch "$f"; done - ;; - - bison|yacc) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a \`.y' file. You may need the \`Bison' package - in order for those modifications to take effect. You can get - \`Bison' from any GNU archive site." - rm -f y.tab.c y.tab.h - if [ $# -ne 1 ]; then - eval LASTARG="\${$#}" - case "$LASTARG" in - *.y) - SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" y.tab.c - fi - SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" y.tab.h - fi - ;; - esac - fi - if [ ! -f y.tab.h ]; then - echo >y.tab.h - fi - if [ ! -f y.tab.c ]; then - echo 'main() { return 0; }' >y.tab.c - fi - ;; - - lex|flex) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a \`.l' file. You may need the \`Flex' package - in order for those modifications to take effect. You can get - \`Flex' from any GNU archive site." - rm -f lex.yy.c - if [ $# -ne 1 ]; then - eval LASTARG="\${$#}" - case "$LASTARG" in - *.l) - SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" lex.yy.c - fi - ;; - esac - fi - if [ ! -f lex.yy.c ]; then - echo 'main() { return 0; }' >lex.yy.c - fi - ;; - - help2man) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a dependency of a manual page. You may need the - \`Help2man' package in order for those modifications to take - effect. You can get \`Help2man' from any GNU archive site." - - file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` - if test -z "$file"; then - file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` - fi - if [ -f "$file" ]; then - touch $file - else - test -z "$file" || exec >$file - echo ".ab help2man is required to generate this page" - exit 1 - fi - ;; - - makeinfo) - if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then - # We have makeinfo, but it failed. - exit 1 - fi - - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a \`.texi' or \`.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy \`make' (AIX, - DU, IRIX). You might want to install the \`Texinfo' package or - the \`GNU make' package. Grab either from any GNU archive site." - file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` - if test -z "$file"; then - file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` - fi - touch $file - ;; - - tar) - shift - if test -n "$run"; then - echo 1>&2 "ERROR: \`tar' requires --run" - exit 1 - fi - - # We have already tried tar in the generic part. - # Look for gnutar/gtar before invocation to avoid ugly error - # messages. - if (gnutar --version > /dev/null 2>&1); then - gnutar ${1+"$@"} && exit 0 - fi - if (gtar --version > /dev/null 2>&1); then - gtar ${1+"$@"} && exit 0 - fi - firstarg="$1" - if shift; then - case "$firstarg" in - *o*) - firstarg=`echo "$firstarg" | sed s/o//` - tar "$firstarg" ${1+"$@"} && exit 0 - ;; - esac - case "$firstarg" in - *h*) - firstarg=`echo "$firstarg" | sed s/h//` - tar "$firstarg" ${1+"$@"} && exit 0 - ;; - esac - fi - - echo 1>&2 "\ -WARNING: I can't seem to be able to run \`tar' with the given arguments. - You may want to install GNU tar or Free paxutils, or check the - command line arguments." - exit 1 - ;; - - *) - echo 1>&2 "\ -WARNING: \`$1' is needed, and you do not seem to have it handy on your - system. You might have modified some files without having the - proper tools for further handling them. Check the \`README' file, - it often tells you about the needed prerequirements for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing \`$1' program." - exit 1 - ;; -esac - -exit 0 diff --git a/mplib/mkinstalldirs b/mplib/mkinstalldirs deleted file mode 100755 index 7aebfdd..0000000 --- a/mplib/mkinstalldirs +++ /dev/null @@ -1,40 +0,0 @@ -#! /bin/sh -# mkinstalldirs --- make directory hierarchy -# Author: Noah Friedman -# Created: 1993-05-16 -# Public domain - -# $Id: mkinstalldirs,v 1.1 2003/04/18 14:14:01 germeier Exp $ - -errstatus=0 - -for file -do - set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` - shift - - pathcomp= - for d - do - pathcomp="$pathcomp$d" - case "$pathcomp" in - -* ) pathcomp=./$pathcomp ;; - esac - - if test ! -d "$pathcomp"; then - echo "mkdir $pathcomp" - - mkdir "$pathcomp" || lasterr=$? - - if test ! -d "$pathcomp"; then - errstatus=$lasterr - fi - fi - - pathcomp="$pathcomp/" - done -done - -exit $errstatus - -# mkinstalldirs ends here diff --git a/mplib/mplib-config.in b/mplib/mplib-config.in deleted file mode 100755 index f558972..0000000 --- a/mplib/mplib-config.in +++ /dev/null @@ -1,98 +0,0 @@ -#!/bin/sh - - -mplib_libs="@LIBS@" -mplib_cflags="@CFLAGS@" - -prefix=@prefix@ -exec_prefix=@exec_prefix@ -exec_prefix_set=no - -usage() -{ - cat <&2 -fi - -lib_gtk=yes - -while test $# -gt 0; do - case "$1" in - -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - case $1 in - --prefix=*) - prefix=$optarg - if test $exec_prefix_set = no ; then - exec_prefix=$optarg - fi - ;; - --prefix) - echo_prefix=yes - ;; - --exec-prefix=*) - exec_prefix=$optarg - exec_prefix_set=yes - ;; - --exec-prefix) - echo_exec_prefix=yes - ;; - --version) - echo @VERSION@ - ;; - --cflags) - echo_cflags=yes - ;; - --libs) - echo_libs=yes - ;; - *) - usage 1 1>&2 - ;; - esac - shift -done - -if test "$echo_prefix" = "yes"; then - echo $prefix -fi - -if test "$echo_exec_prefix" = "yes"; then - echo $exec_prefix -fi - -if test "$echo_cflags" = "yes"; then - echo -I@includedir@/mplib -fi - -if test "$echo_libs" = "yes"; then - my_mplib_libs= - libdirs=-L@libdir@ - for i in $mplib_libs ; do - if test $i != -L@libdir@ ; then - if test -z "$my_mplib_libs" ; then - my_mplib_libs="$i" - else - my_mplib_libs="$my_mplib_libs $i" - fi - fi - done - - echo $libdirs $my_mplib_libs -lmp -fi - diff --git a/mplib/src/Makefile.am b/mplib/src/Makefile.am deleted file mode 100755 index 0a1453d..0000000 --- a/mplib/src/Makefile.am +++ /dev/null @@ -1,4 +0,0 @@ -lib_LTLIBRARIES = libmp.la -libmp_la_SOURCES = mplib.c mplib.h mplib_s.c mplib_s.h mplib_paas.c xmalloc.c xmalloc.h -libmp_la_LDFLAGS = -version-info 1:0:1 -include_HEADERS = mplib.h diff --git a/mplib/src/mplib.c b/mplib/src/mplib.c deleted file mode 100755 index afa7066..0000000 --- a/mplib/src/mplib.c +++ /dev/null @@ -1,1011 +0,0 @@ -/* - * mplib - a library that enables you to edit ID3 tags - * Copyright (C) 2001,2002 Stefan Podkowinski - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; version 2.1. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#if STDC_HEADERS -# include -# include -#elif HAVE_STRINGS_H -# include -#endif /*STDC_HEADERS*/ - -#if HAVE_UNISTD_H -# include -# include -#endif - -#include -#include -#include - -#include "xmalloc.h" -#include "mplib.h" -#include "mplib_s.h" -#include "mplib_s.c" - - - -/******************************************************************************************* - * Extern functions - *******************************************************************************************/ - - - -/******************************************************************************************* - * Get - *******************************************************************************************/ - - mpeg_header* - mp_get_mpeg_header_from_file(const char* filename) - { - mpeg_header *ret; - int fd; - - if(!filename) return NULL; - - fd = open(filename, O_RDONLY); - if(fd == -1) return NULL; - - ret = mp_get_mpeg_header_from_fd(fd); - close(fd); - return ret; - } - - -mpeg_header* -mp_get_mpeg_header_from_fd(int fd) -{ - mpeg_header *h; - unsigned char c[5]; - - h = XMALLOCD(mpeg_header, "mp_get_mpeg_header_from_fd:h"); - - if(id3_lseek_syncword(fd)) goto exit_on_error; - - if(read(fd, c, 4) < 4) goto exit_on_error; - - memset(h, 0, sizeof(h)); - h->syncword = (c[1] & 240); - h->syncword <<= 8; - h->syncword |= c[0]; - h->version = (c[1] & 8) >> 3; - h->layer = (c[1] & 6) >> 1; - h->protbit = (c[1] & 1); - h->bitrate = (c[2] & 240) >> 4; - h->samplingfreq = (c[2] & 12) >> 2; - h->padbit = (c[2] & 2) >> 1; - h->privbit = (c[2] & 1); - h->mode = (c[3] & 192) >> 6; - h->mode_ext = (c[3] & 48) >> 4; - h->copyright = (c[3] & 8) >> 3; - h->originalhome = (c[3] & 4) >> 2; - h->emphasis = (c[3] & 3); - - return h; - - exit_on_error: - xfree(h); - return NULL; -} - -char* -mp_get_str_version(const mpeg_header *h) -{ - return h->version == 0 ? "MPEG 2" : "MPEG 1"; -} - -char* -mp_get_str_layer(const mpeg_header *h) -{ - switch(h->layer) - { - case 1: return "Layer III"; - case 2: return "Layer II"; - case 3: return "Layer I"; - default: return "undefined"; - } -} - -char* -mp_get_str_bitrate(const mpeg_header *h) -{ - char *buf = (char *)xmallocd0(11, "mp_get_str_bitrate:buf"); - - if(h->version == 1) /* MPEG 1 */ - { - switch(h->layer) - { - case 1: - snprintf(buf, sizeof buf, "%d kBit/s", br_1_3[h->bitrate]); - return buf; - case 2: - snprintf(buf, sizeof buf, "%d kBit/s", br_1_2[h->bitrate]); - return buf; - case 3: - snprintf(buf, sizeof buf, "%d kBit/s", br_1_1[h->bitrate]); - return buf; - default: - return "undefined"; - } - } - else /* MPEG 2 */ - { - switch(h->layer) - { - case 1: - snprintf(buf, sizeof buf, "%d kBit/s", br_2_3[h->bitrate]); - return buf; - case 2: - snprintf(buf, sizeof buf, "%d kBit/s", br_2_2[h->bitrate]); - return buf; - case 3: - snprintf(buf, sizeof buf, "%d kBit/s", br_2_1[h->bitrate]); - return buf; - default: - return "undefined"; - } - } -} - -char* -mp_get_str_samplingfreq(const mpeg_header *h) -{ - if(h->version == 1) - { - switch(h->samplingfreq) - { - case 0: return "44100 Hz"; - case 1: return "48000 Hz"; - case 2: return "32000 Hz"; - default: return "undefined"; - } - } - else - { - switch(h->samplingfreq) - { - case 0: return "22050 Hz"; - case 1: return "24000 Hz"; - case 2: return "16000 Hz"; - default: return "undefined"; - } - } -} - -char* -mp_get_str_mode(const mpeg_header *h) -{ - switch(h->mode) - { - case 0: return "Stereo"; - case 1: return "Joint-Stereo"; - case 2: return "Dual-Channel"; - case 3: return "Mono"; - default: return "undefined"; - } -} - -id3_tag_list* -mp_get_tag_list_from_file(const char* filename) -{ - id3_tag_list *ret; - int fd; - - if(!filename) return NULL; - - fd = open(filename, O_RDONLY); - if(fd == -1) return NULL; - - ret = mp_get_tag_list_from_fd(fd); - close(fd); - return ret; -} - -id3_tag_list* -mp_get_tag_list_from_fd(int fd) -{ - id3_tag_list *tag_list = NULL; - id3_tag_list *tag_list2 = NULL; - id3v2_tag *v2tag = NULL; - id3v1_tag *v1tag = NULL; - id3_tag *tag = NULL; - - v2tag = id3v2_get_tag(fd); - if(v2tag) - { - tag = XMALLOCD0(id3_tag, "mp_get_tag_list_from_fd:tag"); - if(v2tag->header->version_minor == 3 || v2tag->header->version_minor == 4) - tag->version = 2; - else - tag->version = -1; - tag->tag = v2tag; - - tag_list = XMALLOCD(id3_tag_list, "mp_get_tag_list_from_fd:tag_list"); - tag_list->tag = tag; - tag_list->next = NULL; - tag_list->first = tag_list; - } - - v1tag = id3v1_get_tag(fd); - if(v1tag) - { - tag = XMALLOCD(id3_tag, "mp_get_tag_list_from_fd:tag"); - tag->version = 1; - tag->tag = v1tag; - - if(tag_list) - { - tag_list2 = XMALLOCD(id3_tag_list, "mp_get_tag_list_from_fd:tag_list2"); - tag_list2->tag = tag; - tag_list2->next = NULL; - tag_list2->first = tag_list; - tag_list->next = tag_list2; - } - else - { - tag_list = XMALLOCD(id3_tag_list, "mp_get_tag_list_from_fd:tag_list"); - tag_list->tag = tag; - tag_list->next = NULL; - tag_list->first = tag_list; - } - } - - return tag_list; -} - -id3_content* -mp_get_content(const id3_tag *tag, int field) -{ - return mp_get_content_at_pos(tag, field, 0); -} - -id3_content* -mp_get_content_at_pos(const id3_tag *tag, int field, int pos) -{ - int i; - char *c; - id3_content *ret; - - if(!tag || !tag->tag) - { - errno = MP_EERROR; - return NULL; - } - - if(tag->version == 1) - { - if(pos != 0) - { - errno = MP_EERROR; - return NULL; - } - else return id3v1_get_content(tag->tag, field); - } - else if(tag->version == 2) - { - id3v2_tag *v2 = tag->tag; - char *val; - - switch(field) - { - case MP_ARTIST: - return mp_get_content_custom_at_pos(tag, "TPE1", pos); - case MP_TITLE: - return mp_get_content_custom_at_pos(tag, "TIT2", pos); - case MP_ALBUM: - return mp_get_content_custom_at_pos(tag, "TALB", pos); - case MP_GENRE: - return mp_get_content_custom_at_pos(tag, "TCON", pos); - case MP_COMMENT: - return mp_get_content_custom_at_pos(tag, "COMM", pos); - case MP_YEAR: - return mp_get_content_custom_at_pos(tag, "TYER", pos); - case MP_TRACK: - return mp_get_content_custom_at_pos(tag, "TRCK", pos); - } - errno = MP_EFNF; - return NULL; - } - else - { - errno = MP_EVERSION; - return NULL; - } -} - -id3_content* -mp_get_content_custom(const id3_tag* tag, const char*field) -{ - if(!tag) - { - errno = MP_EERROR; - return NULL; - } - else if(tag->version != 2) - { - errno = MP_EVERSION; - return NULL; - } - - return id3v2_get_content_at_pos(tag->tag, field, 0); - -} - -id3_content* -mp_get_content_custom_at_pos(const id3_tag* tag, const char*field, int pos) -{ - if(!tag) - { - errno = MP_EERROR; - return NULL; - } - else if(tag->version != 2) - { - errno = MP_EVERSION; - return NULL; - } - - - return id3v2_get_content_at_pos(tag->tag, field, pos); -} - - -/******************************************************************************************* - * Set - *******************************************************************************************/ - - int - mp_set_content(id3_tag* tag, const int field, id3_content* new_content) - { - id3v1_tag *v1; - id3v2_tag *v2; - - - if(!tag) return MP_EERROR; - - if(tag->version == 2) - { - return mp_set_content_at_pos(tag, field, new_content, 0); - } - else if(tag->version == 1) - { - unsigned char c; - char *my_val; - int len, j; - - v1 = tag->tag; - - switch(field) - { - -#define FLD(str1, str2, str3, str4) \ - case str1:\ - if(!new_content) v1->str2 = NULL;\ - else\ - {\ - id3_text_content *tc = str4(new_content);\ - if(strlen(tc->text) > str3 || tc->encoding != ISO_8859_1)\ - {\ - mp_convert_to_v2(tag);\ - mp_free_text_content(tc);\ - return mp_set_content(tag, field, new_content);\ - }\ - \ - v1->str2 = tc->text;\ - xfree(tc);\ - }\ - break; - - FLD(MP_ARTIST, artist, 30, mp_parse_artist); - FLD(MP_TITLE, title, 30, mp_parse_title); - FLD(MP_ALBUM, album, 30, mp_parse_album); - FLD(MP_YEAR, year, 4, mp_parse_year); - - case MP_COMMENT: - if(!new_content) v1->comment = NULL; - else - { - id3_comment_content *tc = mp_parse_comment(new_content); - if(strlen(tc->text) > 30 || tc->short_descr || tc->encoding != ISO_8859_1) - { - mp_convert_to_v2(tag); - mp_free_comment_content(tc); - return mp_set_content(tag, field, new_content); - } - v1->comment = xmallocd0(strlen(tc->text)+1, - "mp_set_content:v1->comment"); - memcpy(v1->comment, tc->text, strlen(tc->text)); - mp_free_comment_content(tc); - } - break; - - case MP_TRACK: - if(!new_content) v1->track = 0; - else - { - id3_text_content *tc = mp_parse_track(new_content); -#ifdef HAVE_STRTOL - errno = 0; - j = strtol(tc->text, (char **)NULL, 10); - if(errno != ERANGE) v1->track = j; - else return MP_EERROR; -#else - v1->track = atoi(tc->text); -#endif - mp_free_text_content(tc); - } - break; - - case MP_GENRE: - if(!new_content) v1->genre = 0xFF; - else - { - int b = 0, i; - id3_text_content *tc = mp_parse_genre(new_content); - /* i = strlen(tc->text); */ - for(c = 0; c < GLL; c++) { - if(!strcmp(genre_list[c], tc->text)) - { - v1->genre = c; - b = 1; - } - } - mp_free_text_content(tc); - if(!b) - { - mp_convert_to_v2(tag); - return mp_set_content(tag, field, new_content); - } - break; - } - } - } - else if(tag->version == -1) return MP_EVERSION; - else return MP_EFNF; - - return 0; - } - -int -mp_set_content_at_pos(id3_tag* tag, const int field, id3_content* new_content, int pos) -{ - char* c; - - if(!tag) return MP_EERROR; - if(field < MP_ARTIST || field > MP_TRACK) return MP_EFNF; - - if(tag->version == 1 && pos == 0) return mp_set_content(tag, field, new_content); - - switch(field) - { - case MP_ARTIST: c = "TPE1"; break; - case MP_TITLE: c = "TIT2"; break; - case MP_ALBUM: c = "TALB"; break; - case MP_TRACK: c = "TRCK"; break; - case MP_YEAR: c = "TYER"; break; - case MP_COMMENT: c = "COMM"; break; - case MP_GENRE: c = "TCON"; break; - } - return mp_set_custom_content_at_pos(tag, c, new_content, pos); -} - -int -mp_set_custom_content(id3_tag* tag, char* field, id3_content* new_content) -{ - return mp_set_custom_content_at_pos(tag, field, new_content, 0); -} - -int -mp_set_custom_content_at_pos(id3_tag* tag, char* field, id3_content* new_content, int pos) -{ - id3v2_tag *v2; - - if(!tag || !field || strlen(field) != 4) return MP_EERROR; - - if(tag->version == 1) - { - if(mp_convert_to_v2(tag)) - return MP_EERROR; - } - else if(tag->version == -1) return MP_EVERSION; - - v2 = (id3v2_tag*)tag->tag; - if(!v2->frame_list) - { - v2->frame_list = XMALLOCD0(id3v2_frame_list, - "mp_set_custom_content_at_pos:v2->frame_list"); - id3_add_frame(v2->frame_list, field, new_content->data, new_content->length); - } - else - { - id3v2_frame *frame; - - if((frame = id3_lookup_frame(v2->frame_list, field, pos))) - { - if(new_content) - { - long len, len_sync; - /* make sync safe */ - len = new_content->length; - len_sync = id3_sync(new_content->data, len); - - xfree(frame->data); - frame->data = xmallocd(new_content->length, - "mp_set_custom_content_at_pos:frame->data"); - memcpy(frame->data, new_content->data, new_content->length); - frame->status_flag = 0; - if(len != len_sync) frame->format_flag = 64; - else frame->format_flag = 0; - frame->data_size = len_sync; - } - else id3_remove_frame(v2->frame_list, frame); - } - else if(pos == 0) id3_add_frame(v2->frame_list, field, new_content->data, new_content->length); - else return MP_EFNF; - } - - return 0; -} - -/******************************************************************************************* - * Write & delete - *******************************************************************************************/ - int - mp_write_to_file(const id3_tag_list* tag_list, const char *filename) - { - int ret; - int fd; - - if(!filename) return MP_EERROR; - - fd = open(filename, O_RDWR); - if(fd == -1) return MP_EERROR; - - ret = mp_write_to_fd(tag_list, fd); - close(fd); - return ret; - } - - - int - mp_write_to_fd(const id3_tag_list* tag_list, const int fd) - { - id3_tag *tag; - id3v1_tag *v1; - id3v2_tag *v2; - id3_tag_list *mylist; - int ret = 0; - - if(!tag_list) { - ret |= id3v1_del_tag(fd); - ret |= id3v2_del_tag(fd, NULL); - return ret; - } - - while(tag_list) - { - tag = tag_list->tag; - if(!tag) - { - tag_list = tag_list->next; - continue; - } - - if(tag->version == 1) - { - id3v1_del_tag(fd); - ret |= id3v1_add_tag(fd, tag->tag); - } - else if(tag->version == 2) - { - int pad = 0; - id3v2_frame_list *frame_list; - id3v2_tag *old_v2; - id3v2_tag *v2 = tag->tag; - - /* calculate tag size */ - v2->header->total_tag_size = 10; - if(v2->header->has_footer) v2->header->total_tag_size += 10; - if(v2->header->has_extended_header) v2->header->total_tag_size += v2->header->extended_header->size; - frame_list = v2->frame_list; - while(frame_list) - { - v2->header->total_tag_size += frame_list->data->data_size + 10; - frame_list = frame_list->next; - } - - /* this is where padding handling takes place */ - /* we must get the old tag to see if padding can be used */ - old_v2 = id3v2_get_tag(fd); - if(old_v2) { - if(v2->header->total_tag_size > old_v2->header->total_tag_size) - { - /* padding not sufficent */ - ret |= id3v2_del_tag(fd, old_v2); - ret |= id3v2_add_tag(fd, v2, NULL); - } - else - { - ret |= id3v2_add_tag(fd, v2, old_v2); - } - id3v2_free_tag(old_v2); - } else { - ret |= id3v2_add_tag(fd, v2, NULL); - } - - } - else - { - ret |= MP_EVERSION; - } - - tag_list = tag_list->next; - } /* tag list */ - - return ret; - } - -int -mp_del_tags_from_file(const char* filename) -{ - int ret, fd; - - if(!filename) return 1; - - fd = open(filename, O_RDWR); - if(fd == -1) return 1; - - ret = mp_del_tags_from_fd(fd); - close(fd); - return ret; -} - -int -mp_del_tags_from_fd(const int fd) -{ - int ret = 0; - - ret |= id3v1_del_tag(fd); - ret |= id3v2_del_tag(fd, NULL); - - return ret; -} - -int -mp_del_tags_by_ver_from_file(const char* filename, const int version) -{ - int fd, ret; - - if(!filename) return 1; - - fd = open(filename, O_RDWR); - if(fd == -1) return 1; - - ret = mp_del_tags_by_ver_from_fd(fd, version); - close(fd); - return ret; -} - -int -mp_del_tags_by_ver_from_fd(const int fd, const int version) -{ - if(version == 1) return id3v1_del_tag(fd); - else if(version == 2) return id3v2_del_tag(fd, NULL); - else return MP_EVERSION; -} - - - - -/******************************************************************************************* - * Misc - *******************************************************************************************/ - - int - mp_convert_to_v2(id3_tag *tag) - { - id3v1_tag *v1; - id3_tag *tmp; - id3_content* content; - - if(tag->version == 2) return 0; - else if(tag->version == -1) return MP_EVERSION; - - tmp = mp_alloc_tag_with_version(2); - - v1 = (id3v1_tag*)tag->tag; - - content = mp_assemble_text_content(v1->artist, ISO_8859_1); - if(v1->artist) mp_set_content(tmp, MP_ARTIST, content); - - content = mp_assemble_text_content(v1->title, ISO_8859_1); - if(v1->title) mp_set_content(tmp, MP_TITLE, content); - - content = mp_assemble_text_content(v1->album, ISO_8859_1); - if(v1->album) mp_set_content(tmp, MP_ALBUM, content); - - content = mp_assemble_text_content(v1->year, ISO_8859_1); - if(v1->year) mp_set_content(tmp, MP_YEAR, content); - - content = mp_assemble_comment_content(v1->comment, NULL, ISO_8859_1, NULL); - if(v1->comment) mp_set_content(tmp, MP_COMMENT, content); - - if(v1->genre != 0xFF) - { - char *c = xmallocd(strlen(genre_list[v1->genre]) + 1, - "mp_convert_to_v2:c"); - strcpy(c, genre_list[v1->genre]); - content = mp_assemble_text_content(c, ISO_8859_1); - mp_set_content(tmp, MP_GENRE, content); - } - if(v1->track > 0) - { - char *trk = (char *)xmallocd(4, "mp_convert_to_v2:trk"); - snprintf(trk, 3, "%d", v1->track); - trk[3] = 0; - content = mp_assemble_text_content(trk, ISO_8859_1); - mp_set_content(tmp, MP_TRACK, content); - } - - tag->version = 2; - tag->tag = tmp->tag; - - id3v1_free_tag(v1); - xfree(tmp); - - return 0; - } - -int -mp_convert_to_v1(id3_tag *tag) -{ - id3v1_tag *v1; - id3_tag* tmp; - id3_content* content; - id3_text_content* tc; - id3_comment_content* cc; - char* c; - int j, k = 0; - - if(tag->version == 1) return 0; - else if(tag->version == -1) return MP_EVERSION; - - v1 = XMALLOCD0(id3v1_tag, "mp_convert_to_v1:v1"); - - content = mp_get_content(tag, MP_ARTIST); - tc = mp_parse_artist(content); - v1->artist = tc->text; - xfree(tc); - mp_free_content(content); - - content = mp_get_content(tag, MP_TITLE); - tc = mp_parse_title(content); - v1->title = tc->text; - xfree(tc); - mp_free_content(content); - - content = mp_get_content(tag, MP_ALBUM); - tc = mp_parse_album(content); - v1->album = tc->text; - xfree(tc); - mp_free_content(content); - - content = mp_get_content(tag, MP_YEAR); - tc = mp_parse_year(content); - v1->year = tc->text; - xfree(tc); - mp_free_content(content); - - content = mp_get_content(tag, MP_COMMENT); - cc = mp_parse_comment(content); - v1->comment = cc->text; - xfree(cc->language); - xfree(cc->short_descr); - xfree(cc); - mp_free_content(content); - - content = mp_get_content(tag, MP_TRACK); - tc = mp_parse_track(content); - c = tc->text; - if(c) - { -#ifdef HAVE_STRTOL - errno = 0; - j = strtol(c, (char **)NULL, 10); - if(errno != ERANGE) v1->track = j; - else v1->track = 0; -#else - v1->track = atoi(c); -#endif - } - else v1->track = 0; - xfree(c); - mp_free_text_content(tc); - mp_free_content(content); - - content = mp_get_content(tag, MP_GENRE); - tc = mp_parse_genre(content); - c = tc->text; - for(j = 0; c, j < GLL; j++) { - if(!strcmp(genre_list[j], c)) - { - v1->genre = j; - k = 1; - } - } - if(!c) v1->genre = 0xFF; - xfree(c); - mp_free_text_content(tc); - mp_free_content(content); - - id3v1_truncate_tag(v1); - - id3v2_free_tag(tag->tag); - - tag->version = 1; - tag->tag = v1; - - return 0; -} - -int -mp_is_valid_v1_value(int field, char *value) -{ - int len = 30; - int j; - - switch(field) { - case MP_YEAR: - len = 4; - break; - - case MP_TRACK: -#ifdef HAVE_STRTOL - errno = 0; - j = strtol(value, (char **)NULL, 10); - if(errno != ERANGE) return 1; - else return 0; -#else - return 1; /* poor fellow */ -#endif - - case MP_GENRE: - for(j = 0; j < GLL; j++) { - if(!strcmp(genre_list[j], value)) - { - return 1; - } - return 0; - } - } - - /* Check string length */ - if(strlen(value) > len) return 0; - else return 1; -} - - -void -mp_free_list(id3_tag_list *list) -{ - if(!list) return; - - /* free tag */ - if(list->tag) mp_free_tag(list->tag); - - /* free next element */ - if(list->next) mp_free_list(list->next); - - /* free this element */ - xfree(list); -} - -id3_tag* -mp_alloc_tag(void) -{ - /* The tags initialized version makes a different. Generally spoken, we - like to make id3v1 tags if possible and therefor set the version to 1 - here. This matters in mp_set_content(). */ - return mp_alloc_tag_with_version(1); -} - -id3_tag* -mp_alloc_tag_with_version(int v) -{ - id3_tag* ret; - - if(v != 1 && v != 2) return NULL; - - ret = XMALLOCD(id3_tag, "mp_alloc_tag_with_version:ret"); - ret->version = v; - if(v == 1) - { - ret->tag = XMALLOCD0(id3v1_tag, "mp_alloc_tag_with_version:ret->tag"); - ((id3v1_tag*)ret->tag)->genre = 0xFF; - } - else - { - id3v2_tag *v2; - /* XXX */ - ret->tag = XMALLOCD0(id3v2_tag, "mp_alloc_tag_with_version:ret->tag"); - v2 = (id3v2_tag*)ret->tag; - v2->header = XMALLOCD0(id3v2_header, "mp_alloc_tag_with_version:v2->header"); -//if ID3VERSION == "2.4" - v2->header->version_minor = 4; -//else - v2->header->version_minor = 3; -//endif - v2->header->version_revision = 0; - v2->header->unsyncronization = 1; - v2->header->has_extended_header = 0; - v2->header->is_experimental = 1; - v2->header->has_footer = 0; - v2->header->flags = 0; - v2->header->total_tag_size = 0; - v2->header->extended_header = NULL; - v2->frame_list = NULL; - } - return ret; -} - -void -mp_free_tag(id3_tag *tag) -{ - if(!tag) return; - - if(tag->version == 1) - { - id3v1_free_tag(tag->tag); - } - else if(tag->version == 2) - { - id3v2_free_tag(tag->tag); - } - xfree(tag); -} - -void -mp_free_content(id3_content *content) -{ - if(!content) return; - xfree(content->data); - xfree(content); -} - -void -mp_free_text_content(id3_text_content *content) -{ - if(!content) return; - xfree(content->text); - xfree(content); -} - -void -mp_free_comment_content(id3_comment_content *content) -{ - if(!content) return; - xfree(content->language); - xfree(content->short_descr); - xfree(content->text); - xfree(content); -} - - diff --git a/mplib/src/mplib.h b/mplib/src/mplib.h deleted file mode 100755 index 8b3fe64..0000000 --- a/mplib/src/mplib.h +++ /dev/null @@ -1,438 +0,0 @@ -/* - * mplib - a library that enables you to edit ID3 tags - * Copyright (C) 2001,2002 Stefan Podkowinski - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; version 2.1. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __MPLIB_H -#define __MPLIB_H - - -/* __BEGIN_DECLS should be used at the beginning of your declarations, - so that C++ compilers don't mangle their names. Use __END_DECLS at - the end of C declarations. */ -#undef __BEGIN_DECLS -#undef __END_DECLS -#ifdef __cplusplus -# define __BEGIN_DECLS extern "C" { -# define __END_DECLS } -#else -# define __BEGIN_DECLS /* empty */ -# define __END_DECLS /* empty */ -#endif - -/* __P is a macro used to wrap function prototypes, so that compilers - that don't understand ANSI C prototypes still work, and ANSI C - compilers can issue warnings about type mismatches. */ -#undef __P -#if defined (__STDC__) || defined (_AIX) \ - || (defined (__mips) && defined (_SYSTYPE_SVR4)) \ - || defined(WIN32) || defined(__cplusplus) -# define __P(protos) protos -#else -# define __P(protos) () -#endif - - -__BEGIN_DECLS - - - -/*************************************/ -/* Defines */ -/*************************************/ - -#define MP_ARTIST 1 -#define MP_TITLE 2 -#define MP_ALBUM 3 -#define MP_GENRE 4 -#define MP_COMMENT 5 -#define MP_YEAR 6 -#define MP_TRACK 7 - -#define ISO_8859_1 0 -#define UTF16 1 -#define UTF16BE 2 -#define UTF8 3 - - -/*************************************/ -/* errno values */ -/*************************************/ -#define MP_EERROR 1 -#define MP_EFNF 2 -#define MP_EFCOMPR 3 -#define MP_EFENCR 4 -/*define MP_EUNICODE 5*/ -#define MP_EVERSION 6 - - -/*************************************/ -/* Structs and company */ -/*************************************/ - -/* Header structure with 4 segments containing 32 bit header information */ -typedef struct _mpeg_header -{ - unsigned int syncword; /* Sync Word */ - unsigned int version; /* Version number */ - unsigned int layer; /* Layer number */ - unsigned int protbit; /* Protection Bit */ - unsigned int bitrate; /* kbit/sec */ - unsigned int samplingfreq; /* hz */ - unsigned int padbit; /* Padding bit */ - unsigned int privbit; /* Private Bit */ - unsigned int mode; /* Stereo, Joint-Stereo, Dual-Channel, Mono */ - unsigned int mode_ext; /* Mode extension */ - unsigned int copyright; /* Copyright yes/no */ - unsigned int originalhome; /* Original datastream yes/no */ - unsigned int emphasis; /* Emphasis bits */ -} mpeg_header; - - -/* Generic tag structure */ -typedef struct _id3_tag -{ - int version; /* tags version, either 1 or 2 or -1 if not supported */ - void *tag; /* pointer to specific struct */ -} id3_tag; - - -/* list of tags found in file */ -typedef struct _id3_tag_list -{ - id3_tag *tag; - struct _id3_tag_list *next; - struct _id3_tag_list *first; -} id3_tag_list; - - -/* - * The following structures are ment as low-level data holders. I strongly - * suggest you to use the appropriate generic functions below to access them. - */ - -/* V 1 */ - -/* ID3v1 tag structure */ -typedef struct _id3v1_tag -{ - char *title; - char *artist; - char *album; - char *year; - char *comment; - unsigned char track; /* track binary encoded */ - unsigned char genre; /* index on genre list - 0xFF for null */ -} id3v1_tag; - - -/* V 2 */ - -/* ID3v2 Frame structure */ -typedef struct _id3v2_frame -{ - char* frame_id; /* The frame id e.g. TALB */ - unsigned char status_flag; - unsigned char format_flag; - char *data; - unsigned int data_size; /* frame size excluding header, incl. enc.,lang.,etc. - (total frame size - 10) */ -} id3v2_frame; - -/* single linked list referencing a number of frames */ -typedef struct _id3v2_frame_list -{ - struct _id3v2_frame *data; - struct _id3v2_frame_list *next; - struct _id3v2_frame_list *start; -} id3v2_frame_list; - -/* ID3v2 Extended Header structure */ -typedef struct _id3v2_extended_header -{ - unsigned long size; - char *flag_bytes; - unsigned int no_flag_bytes; - unsigned int is_update; - unsigned int crc_data_present; - unsigned char crc_data_length; - unsigned char* crc_data; - unsigned int restrictions; - unsigned char restrictions_data_length; - unsigned char* restrictions_data; -} id3v2_extended_header; - -/* ID3v2 Header structure */ -typedef struct _id3v2_header -{ - /* Version 2.minor.revision */ - unsigned int version_minor; - unsigned int version_revision; - char flags; /* Flags - should only be set by mplib and does only contain - the following infos */ - unsigned int unsyncronization; - unsigned int has_extended_header; - unsigned int is_experimental; - unsigned int has_footer; - unsigned long total_tag_size; /* is size of all tag elements including - header and footer (each 10 bytes) */ - id3v2_extended_header *extended_header; /* Extended header */ -} id3v2_header; - - -/* ID3v2 tag structure */ -typedef struct _id3v2_tag -{ - id3v2_header *header; - id3v2_frame_list *frame_list; -} id3v2_tag; - -/* A fields content unparsed */ -typedef struct _id3_content -{ - unsigned int compressed; - unsigned int encrypted; - char *data; - unsigned int length; -} id3_content; - -typedef enum _id3_encoding -{ - iso_8859_1 = ISO_8859_1, - utf16 = UTF16, - utf16be = UTF16BE, - utf8 = UTF8 -} id3_encoding; - -typedef struct _id3_text_content -{ - id3_encoding encoding; - char *text; /* Null terminated text */ -} id3_text_content; - -typedef struct _id3_comment_content -{ - id3_encoding encoding; - char *language; /* ISO Language code */ - char *short_descr; /* Null term. content short description */ - char *text; /* Null terminated text */ -} id3_comment_content; - -/***************************************/ -/* Functions */ -/***************************************/ - -/* Allocates a MPEG header structure from a file - * Arg 1 - The filename - * Returns - A pointer to a new initialized header structure - NULL on IO Error - */ -extern mpeg_header *mp_get_mpeg_header_from_file __P((const char*)); - - -/* Gets the header structure from a file descriptor - * Arg 1 - The file descriptor - * Returns - A pointer to a new initialized header structure - NULL on IO Error - */ -extern mpeg_header *mp_get_mpeg_header_from_fd __P((int)); - - -/* Frees a mpeg header structure - * Arg 1 - The allocated mpeg header - */ -#define mp_free_mpeg_header(str) xfree(str) - - -/* Allocates a label with the appropriate header field value as a string */ -extern char *mp_get_str_version __P((const mpeg_header*)); -extern char *mp_get_str_layer __P((const mpeg_header*)); -extern char *mp_get_str_bitrate __P((const mpeg_header*)); -extern char *mp_get_str_samplingfreq __P((const mpeg_header*)); -extern char *mp_get_str_mode __P((const mpeg_header*)); - - -/* Allocates and fills a list of tags found in the given file. This list - * will contain at least one and at most two tags or is NULL if no tags - * have been found. - * Arg 1 - The files name/file descriptor to search for tags - * Returns - A pointer to a initialized list struct or null if no tags have - * been found - */ -extern id3_tag_list* mp_get_tag_list_from_file __P((const char*)); -extern id3_tag_list* mp_get_tag_list_from_fd __P((int)); - - -/* Frees a tag list beginning with the given element XXX */ -extern void mp_free_list __P((id3_tag_list*)); - - -/* Gets the first content found of a specified field in the given tag and - * allocates a struct. - * Arg 1 - The tag - * Arg 2 - The fields identifier - * - * Returns The new allocated content for the specified field or NULL - * On NULL: errno set to the following values - * MP_EERROR - General failure: may occure on wrong usage, but should never happen - * MP_EFNF - Field does not exists in tag /invalid identifier - * MP_EVERSION - Tag has a version set that is not supported by the library - */ -extern id3_content* mp_get_content __P((const id3_tag*, int)); - -/* It's posible that a tag has multiple ocurances of a field. - * Use this function to get a specified field by position. The first - * ocurance of the field in the tag is 0. - * e.g.: To get the third comment in an id3v2 tag use - * mp_get_content_at_pos(tag, MP_COMMENT, 2); - * Arg 1 - The tag - * Arg 2 - The fields identifier - * Arg 3 - The content position in the tag - * Returns - see mp_get_content - */ -extern id3_content* mp_get_content_at_pos __P((const id3_tag*, int, int)); - -/* Gets a custom fields content and allocates a struct. This function can - * only be applied to ID3v2 tags. It will lookup a by the given identifier - * and return its content. - * Arg 1 - The tag - * Arg 2 - The field names identifier e.g. ENCR - * Returns - see mp_get_content - */ -extern id3_content* mp_get_content_custom __P((const id3_tag*, const char*)); - -/* See mp_get_content_at_pos() and mp_get_content_custom() - * Arg 1 - The tag - * Arg 2 - The field names identifier e.g. ENCR - * Arg 3 - The content position in the tag - * Returns - see mp_get_content - */ -extern id3_content* mp_get_content_custom_at_pos __P((const id3_tag*, const char*, int)); - -/* Frees a content struct */ -extern void mp_free_content __P((id3_content*)); -extern void mp_free_text_content __P((id3_text_content*)); -extern void mp_free_comment_content __P((id3_comment_content*)); - - -/* Copys the value of a specified field into the given tag. The content - * argument may be freed after using this function. The way a content - * is represented in a tag depends from the tags version and kind of field. - * I.e. it may be nessecary to represent a track number as a binary value in a v1 - * tag or to embeded it into a frame for a v2 tag. The caller just needs to - * give the correct identifier with the value as a id3_content and to take - * care of freeing the id3_content value afterwards. - * Arg 1 - The tag to edit - * Arg 2 - The fields identifier - * Arg 3 - The fields new content - * Returns - 0 success or one of the following errors - * MP_EERROR - General failure: may occure on wrong usage, but should never happen - * MP_EFNF - Field does not exists in tag /invalid identifier - * MP_EVERSION - Function isn't able to handle a tag of this version - */ -extern int mp_set_content __P((id3_tag*, int, id3_content*)); -extern int mp_set_content_at_pos __P((id3_tag*, int, id3_content*, int)); - -/* Sets up a new custom field with the given value - * Arg 1 - The tag to edit - * Arg 2 - The new fields name - A four chars upper case identifier e.g. ENCR - * Arg 3 - The fields new content - * Returns - See mp_set_content - */ -extern int mp_set_custom_content __P((id3_tag*, char*, id3_content*)); -extern int mp_set_custom_content_at_pos __P((id3_tag*, char*, id3_content*, int)); - -/* Writes the tag to the specified file - * Arg 1 - The tag list to be added to file - may be NULL for deleting all tags - * Arg 2 - The files name/file descriptor - * Returns - 0 on success or one of the following errors - * MP_EERROR - General failure: may occure on wrong usage, but should never happen - * MP_EVERSION - Function isn't able to handle a tag of this version - */ -extern int mp_write_to_file __P((const id3_tag_list*, const char*)); -extern int mp_write_to_fd __P((const id3_tag_list*, int)); - -/* Deletes all tags in file - * Arg 1 - The filename of fd - * Return - 0 on success - */ -extern int mp_del_tags_from_file __P((const char*)); -extern int mp_del_tags_from_fd __P((int)); - -/* Deletes all tags in file with the specified version - * Arg 1 - The filename or fd - * Arg 2 - The version - */ -extern int mp_del_tags_by_ver_from_file __P((const char*, int)); -extern int mp_del_tags_by_ver_from_fd __P((int, int)); - -/* Converts a tag to id3v1 or id3v2 tag format - * Arg 1 - The tag to be converted - * Returns - 0 on success or one of the following errors - * MP_EVERSION - Function isn't able to handle a tag of this version - */ -extern int mp_convert_to_v1 __P((id3_tag*)); -extern int mp_convert_to_v2 __P((id3_tag*)); - -/* Checks wether the given value would be a valid v1 field - * Arg 1 - The field - * Arg 2 - The value - * Returns - 0 if test failed - */ -extern int mp_is_valid_v1_value __P((int, char*)); - -/* Parses a content field - * Arg 1 - the content to parse - * Returns - A pointer to a new initialized structure suitable for the content - * or NULL - * On NULL: errno set to the following values - * MP_EERROR - General failure: may occure on wrong usage, but should never happen - * MP_EFENCR - The value for this field has been encrypted and can thus not be retrieved - * MP_EFCOMPR - The value for this field has been compressed and can thus not be retrieved - */ -extern id3_text_content *mp_parse_artist __P((const id3_content*)); -extern id3_text_content *mp_parse_title __P((const id3_content*)); -extern id3_text_content *mp_parse_album __P((const id3_content*)); -extern id3_text_content *mp_parse_year __P((const id3_content*)); -extern id3_text_content *mp_parse_genre __P((const id3_content*)); -extern id3_text_content *mp_parse_track __P((const id3_content*)); -extern id3_text_content *mp_parse_text __P((const id3_content*)); -extern id3_comment_content *mp_parse_comment __P((const id3_content*)); - -/* Assembles content from a comont text content - * Arg 1 - the text - * Arg 2 - the texts encoding (NULL) - * Returns - A pointer to a new initialized content structure - */ -extern id3_content *mp_assemble_text_content __P((const char*, id3_encoding)); - -/* Assembles content from a comment - * Arg 1 - the text - * Arg 2 - a short describtion to the text (NULL) - * Arg 3 - the texts encoding - * Arg 4 - the comments language (NULL) - * Returns - A pointer to a new initialized content structure - */ -extern id3_content *mp_assemble_comment_content __P((const char*, const char*, id3_encoding, const char*)); - -/* Gets a new allocated tag */ -extern id3_tag* mp_alloc_tag __P((void)); -extern id3_tag* mp_alloc_tag_with_version __P((int)); - -/* Frees tag struct */ -extern void mp_free_tag __P((id3_tag *)); - -__END_DECLS - -#endif /* __MPLIB_H */ diff --git a/mplib/src/mplib_paas.c b/mplib/src/mplib_paas.c deleted file mode 100755 index 441e474..0000000 --- a/mplib/src/mplib_paas.c +++ /dev/null @@ -1,256 +0,0 @@ -/* - * mplib - a library that enables you to edit ID3 tags - * Copyright (C) 2001,2002 Stefan Podkowinski - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; version 2.1. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#if STDC_HEADERS -# include -# include -#elif HAVE_STRINGS_H -# include -#endif /*STDC_HEADERS*/ - -#if HAVE_UNISTD_H -# include -# include -#endif - -#include -#include -#include - -#include "mplib.h" -#include "xmalloc.h" - - - -/******************************************************************************************* - * Parse functions - *******************************************************************************************/ - - id3_text_content* - mp_parse_artist(const id3_content* content) - { - return mp_parse_text(content); - } - - id3_text_content* - mp_parse_title(const id3_content* content) - { - return mp_parse_text(content); - } - - id3_text_content* - mp_parse_album(const id3_content* content) - { - return mp_parse_text(content); - } - - id3_text_content* - mp_parse_year(const id3_content* content) - { - return mp_parse_text(content); - } - - id3_text_content* - mp_parse_genre(const id3_content* content) - { - return mp_parse_text(content); - } - - id3_text_content* - mp_parse_track(const id3_content* content) - { - return mp_parse_text(content); - } - - id3_comment_content* - mp_parse_comment(const id3_content* content) - { - id3_comment_content* cc; - int i, e; - - if(!content || !content->data) - { - errno = MP_EERROR; - return NULL; - } - - if(content->encrypted) - { - errno = MP_EFENCR; - return NULL; - } - if(content->compressed) - { - errno = MP_EFCOMPR; - return NULL; - } - - cc = XMALLOCD0(id3_comment_content, "mp_parse_comment:cc"); - - e = content->data[0]; - if(e >= ISO_8859_1 && e <= UTF8) cc->encoding = e; - else cc->encoding = 0; - - cc->language = xmallocd(4, "mp_parse_comment:cc->language"); - cc->language[0] = content->data[1]; - cc->language[1] = content->data[2]; - cc->language[2] = content->data[3]; - cc->language[3] = 0; - - if(content->data[4]) /* short descr. */ - { - i = strlen(content->data + 4) + 1; - cc->short_descr = xmallocd(i, "mp_parse_comment:cc->short_descr"); - strncpy(cc->short_descr, content->data + 4, i); - } - else - { - cc->short_descr = NULL; - i = 1; - } - - cc->text = xmallocd(content->length - 4 - i + 1, "mp_parse_comment:cc->text"); - memcpy(cc->text, content->data + 4 + i, content->length - 4 - i); - cc->text[content->length - 4 - i] = 0; - - return cc; - } - - id3_text_content* - mp_parse_text(const id3_content* content) - { - id3_text_content* tc; - int e; - - if(!content || !content->data) - { - errno = MP_EERROR; - return NULL; - } - - if(content->encrypted) - { - errno = MP_EFENCR; - return NULL; - } - if(content->compressed) - { - errno = MP_EFCOMPR; - return NULL; - } - - tc = XMALLOCD0(id3_text_content, "mp_parse_text:tc"); - tc->text = xmallocd(content->length, "mp_parse_text:tc->text"); - e = content->data[0]; - if(e >= ISO_8859_1 && e <= UTF8) tc->encoding = e; - else tc->encoding = 0; - - memcpy(tc->text, content->data + 1, content->length - 1); - tc->text[content->length - 1] = 0; - /* XXX multiple entries */ - return tc; - } - - /******************************************************************************************* - * Assemble functions - *******************************************************************************************/ - - id3_content* - mp_assemble_artist_content(const char* text, id3_encoding enc) - { - return mp_assemble_text_content(text, enc); - } - - id3_content* - mp_assemble_title_content(const char* text, id3_encoding enc) - { - return mp_assemble_text_content(text, enc); - } - - id3_content* - mp_assemble_album_content(const char* text, id3_encoding enc) - { - return mp_assemble_text_content(text, enc); - } - - id3_content* - mp_assemble_year_content(const char* text, id3_encoding enc) - { - return mp_assemble_text_content(text, enc); - } - - id3_content* - mp_assemble_genre_content(const char* text, id3_encoding enc) - { - return mp_assemble_text_content(text, enc); - } - - id3_content* - mp_assemble_text_content(const char* text, id3_encoding enc) - { - id3_content *ret; - - if(!text) return NULL; - - ret = XMALLOCD0(id3_content, "mp_assemble_text_content:ret"); - ret->length = strlen(text) + 1; - ret->data = xmallocd(ret->length, "mp_asseble_text_content:ret->data"); - ret->data[0] = enc; - strncpy(ret->data + 1, text, strlen(text)); - - return ret; - } - - id3_content* - mp_assemble_comment_content(const char* text, const char* short_descr, id3_encoding enc, const char* lang) - { - id3_content *ret; - - if(!text) return NULL; - - ret = XMALLOCD0(id3_content, "mp_assemble_comment_content:ret"); - ret->length = strlen(text) + 5; - if(short_descr) ret->length += strlen(short_descr); - - ret->data = xmallocd(ret->length, "mp_assemble_comment_content:ret->data"); - ret->data[0] = enc; - if(lang && strlen(lang) == 3) - { - ret->data[1] = lang[0]; - ret->data[2] = lang[1]; - ret->data[3] = lang[2]; - } - else - { - ret->data[1] = 'X'; - ret->data[2] = 'X'; - ret->data[3] = 'X'; - } - if(short_descr) strcpy(ret->data + 4, short_descr); - else ret->data[4] = 0; - - if(short_descr) strncpy(ret->data + 5 + strlen(short_descr), text, strlen(text)); - else strncpy(ret->data + 5, text, strlen(text)); - - return ret; - - } diff --git a/mplib/src/mplib_s.c b/mplib/src/mplib_s.c deleted file mode 100755 index 2c336b4..0000000 --- a/mplib/src/mplib_s.c +++ /dev/null @@ -1,1177 +0,0 @@ -/* - * mplib - a library that enables you to edit ID3 tags - * Copyright (C) 2001,2002 Stefan Podkowinski - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; version 2.1. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#if STDC_HEADERS -# include -# include -#elif HAVE_STRINGS_H -# include -#endif /*STDC_HEADERS*/ - -#if HAVE_UNISTD_H -# include -# include -#endif - - -#include -#include -#include -#include -#include - -#include "mplib_s.h" -#include "xmalloc.h" - - - -/******************************/ -/* Static functions */ -/******************************/ - -static id3v1_tag* -id3v1_get_tag(int fd) -{ - id3v1_tag *tag; - char *c; - - tag = XMALLOCD0(id3v1_tag, "id3v1_get_tag:tag"); - - c = (char *)xmallocd(3, "id3v1_get_tag:c"); - - if(lseek(fd, -128L, SEEK_END) == -1) goto exit_on_error; - if(read(fd, c, 3) < 3) goto exit_on_error; - if(strncmp(c, "TAG", 3) != 0) goto exit_on_error; - - tag->title = (char *)xmallocd(31, "id3v1_get_tag:tag->title"); - if(read(fd, tag->title, 30) < 30) goto exit_on_error; - if(tag->title[0] == 0 || id3_is_only_space(tag->title, 30)) { - xfree(tag->title); - tag->title = NULL; - } else tag->title[30] = 0; - - tag->artist = (char*)xmallocd(31, "id3v1_get_tag:tag->artist"); - if(read(fd, tag->artist, 30) < 30) goto exit_on_error; - if(tag->artist[0] == 0 || id3_is_only_space(tag->artist, 30)) { - xfree(tag->artist); - tag->artist = NULL; - } else tag->artist[30] = 0; - - tag->album = (char*)xmallocd(31, "id3v1_get_tag:tag->album"); - if(read(fd, tag->album, 30) < 30) goto exit_on_error; - if(tag->album[0] == 0 || id3_is_only_space(tag->album, 30)) { - xfree(tag->album); - tag->album = NULL; - } else tag->album[30] = 0; - - tag->year = (char*)xmallocd(5, "id3v1_get_tag:tag->year"); - if(read(fd, tag->year, 4) < 4) goto exit_on_error; - if(tag->year[0] == 0 || id3_is_only_space(tag->year, 4)) { - xfree(tag->year); - tag->year = NULL; - } else tag->year[4] = 0; - - tag->comment = (char*)xmallocd(31, "id3v1_get_tag:tag->comment"); - if(read(fd, tag->comment, 30) < 30) goto exit_on_error; - tag->comment[30] = 0; - - if(read(fd, &(tag->genre), 1) < 1) goto exit_on_error; - - /* Looking for v1.1 track info */ - if(tag->comment && tag->comment[28] == 0 && tag->comment[29] != 0) - { - tag->track = tag->comment[29]; - tag->comment[29] = 0; - } - else - { - tag->track = 0; - } - - /* Set comment to NULL if not set - this happens at this point because */ - /* there maybe a track info anyway */ - if(tag->comment[0] == 0 || id3_is_only_space(tag->comment, 28)) { - xfree(tag->comment); - tag->comment = NULL; - } - - xfree(c); - return tag; - - exit_on_error: - - xfree(c); - id3v1_free_tag(tag); - return NULL; -} - -static int -id3v1_add_tag(int fd, id3v1_tag *tag) -{ - int i, j; - void *blank, *set; - char *b_tag, *b_tag_start; - - blank = xmallocd0(30, "id3v1_add_tag:blank"); - set = xmallocd(30, "id3v1_add_tag:set"); - memset(set, 0xFF, 30); - b_tag = b_tag_start = (char *)xmallocd0(128, "id3v1_add_tag:b_tag"); - - strncpy(b_tag, "TAG", 3); b_tag += 3; - - if(tag->title) - { - j = strlen(tag->title); - strncpy(b_tag, tag->title, j); b_tag += j; - i = 30 - j; - if(i > 0) - { - strncpy(b_tag, blank, i); b_tag += i; - } - } - else - { - strncpy(b_tag, blank, 30); b_tag += 30; - } - - if(tag->artist) - { - j = strlen(tag->artist); - strncpy(b_tag, tag->artist, j); b_tag += j; - i = 30 - j; - if(i > 0) - { - strncpy(b_tag, blank, i); b_tag += i; - } - } - else - { - strncpy(b_tag, blank, 30); b_tag += 30; - } - - if(tag->album) - { - j = strlen(tag->album); - strncpy(b_tag, tag->album, j); b_tag += j; - i = 30 - j; - if(i > 0) - { - strncpy(b_tag, blank, i); b_tag += i; - } - } - else - { - strncpy(b_tag, blank, 30); b_tag += 30; - } - - if(tag->year) - { - j = strlen(tag->year); - strncpy(b_tag, tag->year, j); b_tag += j; - i = 4 - j; - if(i > 0) - { - strncpy(b_tag, blank, i); b_tag += i; - } - } - else - { - strncpy(b_tag, blank, 4); b_tag += 4; - } - - if(tag->comment) - { - int hastrack = 0; - j = strlen(tag->comment); - if(tag->track > 0) hastrack = 1; - if(hastrack && j > 28) - { - strncpy(b_tag, tag->comment, 28); b_tag += 28; - } - else - { - strncpy(b_tag, tag->comment, j); b_tag += j; - i = ((tag->track > 0) ? 28 : 30) - j; - } - if(i > 0) - { - strncpy(b_tag, blank, i); b_tag += i; - } - } - else - { - strncpy(b_tag, blank, (tag->track > 0) ? 28 : 30); - b_tag += (tag->track > 0) ? 28 : 30; - } - - if(tag->track > 0) - { - strncpy(b_tag, blank, 1); b_tag += 1; - strncpy(b_tag, &(tag->track), 1); b_tag += 1; - } - if(tag->genre != 0xFF) - { - strncpy(b_tag, &(tag->genre), 1); b_tag += 1; - } - else - { - strncpy(b_tag, set, 1); b_tag += 1; - } - - j = 0; - - if(lseek(fd, 0L, SEEK_END) != -1) - { - if(write(fd, b_tag - 128, 128) < 128) j = 1; - } - else j = 1; - - xfree(b_tag_start); - xfree(blank); - xfree(set); - - return j; -} - -static int -id3v2_add_tag(int fd, id3v2_tag *tag, id3v2_tag *old) -{ - unsigned char *btag, *btag_start; - unsigned char flag = 0; - int i, j; - char *b_tag, *b_tag_start, *d; - id3v2_frame_list *frame_list; - id3v2_frame *frame; - - /* at first we are going to write the tags raw data into - the btag byte array */ - btag = btag_start = xmallocd0(tag->header->total_tag_size, - "id3v2_add_tag:btag"); - strncpy(btag, "ID3", 3); btag += 3; - *btag = (char)tag->header->version_minor; btag += 1; - *btag = (char)tag->header->version_revision; btag += 1; - flag |= ((tag->header->unsyncronization & 1) << 7); - flag |= ((tag->header->has_extended_header & 1) << 6); - flag |= ((tag->header->is_experimental & 1) << 5); - flag |= ((tag->header->has_footer & 1) << 4); - memcpy(btag, &flag, 1); btag += 1; - - if(old) - { - i = old->header->total_tag_size - 10; - if(old->header->has_footer) i -= 10; - } - else - { - i = tag->header->total_tag_size - 10; - if(tag->header->has_footer) i -= 10; - /* add padding to total size we mean to store on disk */ - /* mplib does not use any kind of padding internaly */ -/* i += 1024; */ /* no padding needed for MPIO use */ - } - - d = id3_sync32(i); - btag[0] = d[0]; - btag[1] = d[1]; - btag[2] = d[2]; - btag[3] = d[3]; - xfree(d); - btag += 4; - - if(tag->header->has_extended_header) - { - d = id3_sync32(tag->header->extended_header->size); - btag[0] = d[0]; - btag[1] = d[1]; - btag[2] = d[2]; - btag[3] = d[3]; - xfree(d); - btag += 4; - - *btag = (char)tag->header->extended_header->no_flag_bytes; btag += 1; - flag = ((tag->header->extended_header->is_update & 1) << 6); - flag |= ((tag->header->extended_header->crc_data_present & 1) << 5); - flag |= ((tag->header->extended_header->restrictions & 1) << 4); - memcpy(btag, &flag, 1); btag += 1; - if(tag->header->extended_header->is_update) - { - btag[0] = 0; btag += 1; - } - if(tag->header->extended_header->crc_data_present) - { - int length = tag->header->extended_header->crc_data_length ? tag->header->extended_header->crc_data_length : 5; - *btag = (char)length; btag += 1; - memcpy(btag, tag->header->extended_header->crc_data, length); btag += 1; - } - if(tag->header->extended_header->restrictions) - { - int length = tag->header->extended_header->restrictions_data_length ? tag->header->extended_header->restrictions_data_length : 5; - *btag = (char)length; btag += 1; - memcpy(btag, tag->header->extended_header->restrictions_data, length); btag += 1; - } - } - - frame_list = tag->frame_list; - while(frame_list) { - int j; - frame = frame_list->data; - - strncpy(btag, frame->frame_id, 4); btag += 4; - d = id3_sync32(frame->data_size); - btag[0] = d[0]; - btag[1] = d[1]; - btag[2] = d[2]; - btag[3] = d[3]; - xfree(d); - btag += 4; - memcpy(btag, &frame->status_flag, 1); btag += 1; - memcpy(btag, &frame->format_flag, 1); btag += 1; - - memcpy(btag, frame->data, frame->data_size); btag += frame->data_size; - - frame_list = frame_list->next; - } - - /* XXX footer not supported yet */ - - /* if an old tag was provided it is desired to overwrite it */ - /* else this is a brand new tag */ - if(old) { - FILE *file; - void *ptr = xmallocd0(old->header->total_tag_size - tag->header->total_tag_size, "id3v2_add_tag:ptr"); - if(!(file = fdopen(fd, "r+b"))) - { - xfree(ptr); - goto exit_on_error; - } - - fseek(file, 0, SEEK_SET); - if(fwrite(btag_start, tag->header->total_tag_size, 1, file) < 1) - { - xfree(ptr); - goto exit_on_error; - } - - /* write padding till end of old tag */ - if(fwrite(ptr, old->header->total_tag_size - tag->header->total_tag_size, 1, file) < 1) { - xfree(ptr); - goto exit_on_error; - } - - fflush(file); - xfree(ptr); - - } else { - FILE *file, *tmp; - int read; - void *ptr, *blank; - unsigned char *c; - - ptr = xmallocd(4096, "id3v2_add_tag:ptr"); - blank = xmallocd0(1024, "id3v2_add_tag:blank"); - - file = fdopen(fd, "r+b"); - tmp = tmpfile(); - if(!(file && tmp)) - { - fflush(file); - fclose(tmp); - xfree(ptr); - xfree(blank); - goto exit_on_error; - } - - fseek(file, 0, SEEK_SET); - fseek(tmp, 0, SEEK_SET); - - /* write tag in tmp file */ - fwrite(btag_start, tag->header->total_tag_size, 1, tmp); - - /* Write 1024b padding */ - /* no padding needed for MPIO use */ -/* fwrite(blank, 1024, 1, tmp); */ - - /* write rest of file */ - while(!feof(file)) - { - read = fread(ptr, 1, 4096, file); - if(fwrite(ptr, 1, read, tmp) != read && !feof(file)) - { - fflush(file); - fclose(tmp); - xfree(ptr); - xfree(blank); - goto exit_on_error; - } - } - - fflush(tmp); - - fseek(file, 0, SEEK_SET); - fseek(tmp, 0, SEEK_SET); - while(!feof(tmp)) - { - read = fread(ptr, 1, 4096, tmp); - if(fwrite(ptr, 1, read, file) != read && !feof(tmp)) - { - fflush(file); - fclose(tmp); - xfree(ptr); - xfree(blank); - goto exit_on_error; - } - } - - fflush(file); - fclose(tmp); - - xfree(ptr); - xfree(blank); - } - - xfree(btag_start); - return 0; - - exit_on_error: - xfree(btag_start); - return MP_EERROR; -} - -static int -id3v1_del_tag(int fd) -{ - int nlength; - unsigned char *c; - struct stat fs; - - if(fstat(fd, &fs)) return 1; - - if(fs.st_size < 128) return 1; /* Hardly a valid mpeg file.. */ - - c = (char *)xmallocd(3, "id3v1_del_tag:c"); - if(lseek(fd, -128L, SEEK_END) == -1) goto exit_on_error; - if(read(fd, c, 3) < 3) goto exit_on_error; - if(strncmp(c, "TAG", 3)) goto exit_on_error; - xfree(c); - - nlength = fs.st_size - 128; - - if(ftruncate(fd, nlength)) return 1; - - return 0; - - exit_on_error: - xfree(c); - return 1; -} - - -static int -id3v2_del_tag(int fd, id3v2_tag *t) -{ - unsigned char *c; - long tag_len, file_len; - FILE *file, *tmp; - int read; - void *ptr; - id3v2_tag *tfound = NULL;; - - if(!t) - { - t = id3v2_get_tag(fd); - if(!t) return 0; - else tfound = t; - } - - ptr = xmallocd(4096, "id3v2_del_tag:ptr"); - - tag_len = t->header->total_tag_size; - file_len = lseek(fd, 0, SEEK_END); - if(file_len < 1 || tag_len < 1) goto exit_on_error; - - /* use os system buffering */ - file = fdopen(fd, "r+b"); - tmp = tmpfile(); - if(!(file && tmp)) goto exit_on_error; - - fseek(file, tag_len, SEEK_SET); - fseek(tmp, 0, SEEK_SET); - while(!feof(file)) - { - read = fread(ptr, 1, 4096, file); - if(fwrite(ptr, 1, read, tmp) != read && !feof(file)) - goto exit_on_error; - } - - fflush(tmp); - - fseek(file, 0, SEEK_SET); - fseek(tmp, 0, SEEK_SET); - while(!feof(tmp)) - { - read = fread(ptr, 1, 4096, tmp); - if(fwrite(ptr, 1, read, file) != read && !feof(tmp)) - goto exit_on_error; - } - - fclose(tmp); - xfree(ptr); - if(tfound) id3v2_free_tag(tfound); - return 0; - - exit_on_error: - fclose(tmp); - xfree(ptr); - if(tfound) id3v2_free_tag(tfound); - return 1; -} - - -static int -id3v1_truncate_tag(id3v1_tag *tag) -{ - int notrunc = 0; - int len = 0; - void *ptr; - - if(tag->title && (len = strlen(tag->title)) > 30) - { - realloc(tag->title, 31); - tag->title[30] = 0; - } - - if(tag->artist && (len = strlen(tag->artist)) > 30) - { - realloc(tag->artist, 31); - tag->artist[30] = 0; - } - - if(tag->album && (len = strlen(tag->album)) > 30) - { - realloc(tag->album, 31); - tag->album[30] = 0; - } - - if(tag->year && (len = strlen(tag->year)) > 4) - { - realloc(tag->title, 5); - tag->title[4] = 0; - } - - if(tag->comment) - { - int max = (tag->track > 0) ? 28 : 30; - if((len = strlen(tag->comment)) > max) - { - realloc(tag->comment, max + 1); - tag->comment[max] = 0; - } - } - - return notrunc; -} - -static int -id3_is_only_space(char *str, int strlen) -{ - int i = 0; - - while(i < strlen) - { - if(str[i] != 0x20) return 0; - i++; - } - - return 1; -} - -static id3v2_tag* -id3v2_get_tag(int fd) -{ - unsigned char *c; - id3v2_header *header; - id3v2_frame_list *frame_list; - id3v2_frame *frame; - id3v2_tag *tag = NULL; - int i; - - if(lseek(fd, 0L, SEEK_SET) == -1) return NULL; - - c = (unsigned char*)xmallocd0(1024, "id3v2_get_tag:c"); - - if(read(fd, c, 10) < 10) goto exit_on_error; - - c[10] = 0; - - if(strncmp(c, "ID3", 3)) goto exit_on_error; - - header = XMALLOCD0(id3v2_header, "id3v2_get_tag:header"); - header->version_minor = c[3]; - header->version_revision = c[4]; - header->flags = c[5]; - header->unsyncronization = (c[5] & 128) >> 7; - header->has_extended_header = (c[5] & 64) >> 6; - header->is_experimental = (c[5] & 32) >> 5; - header->has_footer = (c[5] & 16) >> 4; - - header->total_tag_size = id3_unsync32(c, 6) + 10; - if(header->has_footer) header->total_tag_size += 10; - - tag = XMALLOCD0(id3v2_tag, "id3v2_get_tag:tag"); - - /* check if version is supported */ - if(c[3] != 3 && c[3] != 4) - { - xfree(c); - tag->header = header; - tag->frame_list = NULL; - return tag; - } - - frame_list = XMALLOCD0(id3v2_frame_list, "id3v2_get_tag:frame_list"); - frame_list->start = frame_list; - - /* assigning header and frame list to tag */ - tag->header = header; - tag->frame_list = frame_list; - - if(header->has_extended_header) - { - id3v2_extended_header *xt_header = XMALLOCD0(id3v2_extended_header, - "id3v2_get_tag:id3v2_extended_header"); - - header->extended_header = xt_header; - - read(fd, c, 4); /* get length of extended header */ - xt_header->size = id3_unsync32(c, 0); - - read(fd, c, 1); /* get number of flags */ - xt_header->no_flag_bytes = (c[0] > 0) ? c[0] : 1; - - read(fd, c, xt_header->no_flag_bytes); /* get flag bytes */ - xt_header->is_update = (c[0] & 64) >> 6; - xt_header->crc_data_present = (c[0] & 32) >> 5; - xt_header->restrictions = (c[0] & 16) >> 4; - - /* Flag data */ - if(xt_header->is_update) read(fd, c, 1); /* Data length ind. is 0 -skip */ - if(xt_header->crc_data_present) { - read(fd, c, 1); /* data length - shoud be 5 */ - if(*c != 5) goto exit_on_error; /* else things might - break badly */ - xt_header->crc_data_length = *c; - xt_header->crc_data = xmallocd0(*c, "id3v2_get_tag:xt_header->crc_data"); - read(fd, xt_header->crc_data, *c); - } - if(xt_header->restrictions) { - read(fd, c, 1); /* data length - shoud be 1 */ - if(*c != 1) goto exit_on_error; - xt_header->restrictions_data_length = *c; - xt_header->restrictions_data = xmallocd0(*c, - "id3v2_get_tag:xt_header->restrictions_data"); - read(fd, xt_header->restrictions_data, *c); - } - } - - /* Read frames */ - while(lseek(fd, 0L, SEEK_CUR) < header->total_tag_size) - { - int hasEnc = 0, hasLang = 0, d; - - read(fd, c, 10); /* Read header */ - - /* break if padding is reached - this should never happen here.. */ - if(c[0] == 0 && c[1] == 0 && c[2] == 0 && c[3] == 0) break; - - /* Check if possible id is alpha numeric */ - if(!isalnum(c[0]) || !isalnum(c[1]) || !isalnum(c[2]) || !isalnum(c[3])) break; - - frame = XMALLOCD(id3v2_frame, "id3v2_get_tag:frame"); - frame->frame_id = xmallocd(4, "id3v2_get_tag:frame->frame_id"); - strncpy(frame->frame_id, c, 4); - frame->data_size = id3_unsync32(c, 4); - frame->status_flag = c[8]; - frame->format_flag = c[9]; - - /* Getting frame content */ - frame->data = xmallocd(frame->data_size, "id3v2_get_tag:frame->data_size"); - read(fd, frame->data, frame->data_size); - - /* Add frame to list */ - if(frame_list->data) - { - frame_list->next = XMALLOCD(id3v2_frame_list, "id3v2_get_tag:frame_list->next"); - frame_list->next->start = frame_list->start; - frame_list = frame_list->next; - frame_list->next = NULL; - } - frame_list->data = frame; - } - - xfree(c); - return tag; - - exit_on_error: - - xfree(c); - id3v2_free_tag(tag); - return NULL; -} - -static char ** -id3v2_get_names(id3v2_tag *tag) -{ - id3v2_frame *frame; - id3v2_frame_list *frame_list; - char **clist; - int i; - - if(!tag->frame_list) return NULL; - - frame_list = tag->frame_list; - - i = id3_get_no_frames(tag); - clist = xmallocd(sizeof(char*) * i+1, "id3v2_get_names:clist"); - clist[i] = 0; - - for(i = 0; frame_list; i++) - { - if(!frame_list->data) continue; - frame = frame_list->data; - - if(!frame->frame_id) continue; - clist[i] = xmallocd(5, "id3v2_get_names:clist[i]"); - strncpy(clist[i], frame->frame_id, 4); - clist[i][4] = 0; - frame_list = frame_list->next; - } - return clist; -} - - -static id3_content* -id3v1_get_content(id3v1_tag *tag, int field) -{ - int i; - char *c; - id3_content *ret; - - switch(field) - { - case MP_ARTIST: - if(!tag->artist) - { - errno = MP_EFNF; - return NULL; - } - return mp_assemble_text_content(tag->artist, ISO_8859_1); - - case MP_TITLE: - if(!tag->title) - { - errno = MP_EFNF; - return NULL; - } - return mp_assemble_text_content(tag->title, ISO_8859_1); - - case MP_ALBUM: - if(!tag->album) - { - errno = MP_EFNF; - return NULL; - } - return mp_assemble_text_content(tag->album, ISO_8859_1); - - case MP_YEAR: - if(!tag->year) - { - errno = MP_EFNF; - return NULL; - } - return mp_assemble_text_content(tag->year, ISO_8859_1); - - case MP_COMMENT: - if(!tag->comment) - { - errno = MP_EFNF; - return NULL; - } - return mp_assemble_comment_content(tag->comment, NULL, ISO_8859_1, NULL); - - case MP_GENRE: - if(tag->genre < GLL) - { - return mp_assemble_text_content(genre_list[tag->genre], ISO_8859_1); - } - else - { - errno = MP_EFNF; - return NULL; - } - - case MP_TRACK: - if(!tag->track) - { - errno = MP_EFNF; - return NULL; - } - - if(tag->track < 10) i = 2; - else if(tag->track < 100) i = 3; - else i = 4; - c = xmallocd(i, "id3v1_get_content:c"); - snprintf(c, i, "%d", tag->track); - ret = mp_assemble_text_content(c, ISO_8859_1); - xfree(c); - return ret; - - default: - errno = MP_EFNF; - return NULL; - } -} - -static id3_content* -id3v2_get_content_at_pos(id3v2_tag *tag, const char *field, int pos) -{ - id3v2_frame_list *frame_list; - id3v2_frame *frame; - int i, found, j; - - if(!tag->frame_list || !field) - { - errno = MP_EERROR; - return NULL; - } - - frame_list = tag->frame_list; - - for(i = 0, found = 0; frame_list; i++, frame_list = frame_list->next) - { - if(!frame_list->data) continue; - frame = frame_list->data; - - if(!frame->frame_id || !frame->data) continue; - if(strncmp(frame->frame_id, field, 4)) continue; - - if(found == pos) - { - id3_content *ret = XMALLOCD0(id3_content, - "id3v2_get_content_at_pos:ret"); - if(frame_is_compressed(frame)) ret->compressed = 1; - else ret->compressed = 0; - - if(frame_is_encrypted(frame)) ret->encrypted = 1; - else ret->encrypted = 0; - - ret->length = frame->data_size; - ret->data = xmallocd(frame->data_size, "id3v2_get_content_at_pos:ret->data"); - ret->data = memcpy(ret->data, frame->data, frame->data_size); - - return ret; - } - - found++; - } - - errno = MP_EFNF; - return NULL; -} - -static long -id3_sync(unsigned char* data, long length) -{ - int i; - - for(i = 0; i < length - 1; i++) - { - if(((data[i] & 0xFF) == 0xFF && (data[i+1] & 0xE0) == 0xE0) || - (i+2 < length && (data[i] & 0xFF) == 0xFF && data[i+1] == 0 && data[i+2] != 0)) - { - - realloc(data, length + 1); length++; - memmove(data + i+2, data + i+1, length - i - 2); - memset(data + i+1, 0, 1); - } - } - - return length; -} - -static long -id3_unsync(unsigned char* data, long length) -{ - /* TODO */ - /* this function is supposed to make syncsafe values normal again */ - /* we don't need this yet, because there are no fields supported that will */ - /* have the unsynchronization scheme applied */ - - -} - -static unsigned int -id3_unsync32(unsigned char* c, int start) -{ - return c[start+3] + (c[start+2] << 7) + (c[start+1] << 14) + (c[start] << 21); -} - -int -id3_get_no_frames(id3v2_tag *tag) -{ - int i; - id3v2_frame_list *frame_list = tag->frame_list; - - for(i = 0; frame_list; i++) - frame_list = frame_list->next; - - return i; -} - -static unsigned char * -id3_sync32(unsigned int i) -{ - unsigned char *c = (unsigned char *)xmallocd0(4, "id3_sync32:c"); - - c[3] = (i & 0x7f); - c[2] = ((i & 0x80) >> 7) | (((i & 0x7f00) >> 8) << 1); - c[1] = ((i & 0x8000) >> 15) | (((i & 0x7f0000) >> 16) << 1); - c[0] = ((i & 0x800000) >> 23) | (((i & 0x7f000000) >> 24) << 1); - - return c; -} - -id3v2_frame* -id3_lookup_frame(id3v2_frame_list *list, const char *field, const int pos) -{ - int cur = 0; - - if(!list || !field) return NULL; - - do - { - if(!strcmp(list->data->frame_id, field)) - { - if(cur == pos) return list->data; - cur++; - } - } while((list = list->next)); - - return NULL; -} - -int -id3_remove_frame(id3v2_frame_list *list, id3v2_frame *frame) -{ - if(!list || !frame) return MP_EERROR; - - /* Frame is first element in list */ - if(list->data == frame) - { - xfree(list->data); - list->next->start = list->next; - xfree(list); - return 0; - } - - /* Iterate through others */ - do - { - if(list->next->data == frame) - { - list->next = list->next->next; - xfree(frame); - return 0; - } - } while((list = list->next)); - - return 1; -} - - -int -id3_add_frame(id3v2_frame_list *list, char *field, char *new_value, int len) -{ - id3v2_frame *frame; - char *new_valuecp; - long len_sync; - - if(!list || !new_value || !field || strlen(field) != 4) return MP_EERROR; - - // make a copy of the given value to include it in the frame - new_valuecp = xmallocd(len, - "id3_add_frame:new_valuecp"); - memcpy(new_valuecp, new_value, len); - new_value = new_valuecp; - - /* make sync safe */ -/* len_sync = id3_sync(new_value, len); */ - len_sync = len; /* disabled sync for MPIO use */ - - frame = XMALLOCD(id3v2_frame, "id3_add_frame:frame"); - frame->frame_id = xmallocd(4, "id3_add_frame:frame->frame_id"); - strncpy(frame->frame_id, field, 4); - frame->data = new_value; - frame->status_flag = 0; - - if(len != len_sync) frame->format_flag = 64; - else frame->format_flag = 0; - frame->data_size = len_sync; - - /* Empty list */ - if(!list->data) - { - list->data = frame; - return 0; - } - - /* iterate to last element */ - while(list->next) list = list->next; - - list->next = XMALLOCD(id3v2_frame_list, "id3_add_frame:list->next"); - list->next->start = list->start; - list = list->next; - list->next = NULL; - list->data = frame; - - return 0; -} - - -#define BUF_SIZE 4096 - -static int -id3_lseek_syncword(int fd) -{ - unsigned char *data = (unsigned char*) xmallocd(BUF_SIZE, "id3_lseek_syncword:data"); - int ret; - - // Reset the reading offset of the fd - lseek(fd, SEEK_SET, 0); - - if(read(fd, data, BUF_SIZE) < 1) - { - xfree(data); - return 0; /* return false on EOF */ - } - - ret = id3_lseek_syncword_r(fd, data, 0); - xfree(data); - return ret; -} - -static int -id3_lseek_syncword_r(int fd, unsigned char *data, int checked) -{ - unsigned char lastchar; - int i; - - for(i = 0; i + 1 < BUF_SIZE; i++) - { - if(((data[i] & 0xFF)== 0xFF) && ((data[i+1] & 0xE0)== 0xE0)) - { - lseek(fd, checked + i, SEEK_SET); - return 0; - } - } - - lastchar = data[BUF_SIZE - 1]; - - if(read(fd, data, BUF_SIZE) < 1) return 0; /* return false on EOF */ - - if(((lastchar & 0xFF)== 0xFF) && ((data[0] & 0xE0)== 0xE0)) - { - lseek(fd, checked + BUF_SIZE - 1, SEEK_SET); - return 0; - } - - return id3_lseek_syncword_r(fd, data, checked + BUF_SIZE); -} - -static id3_tag* -id3v1_alloc_tag(void) -{ - id3_tag *tag = XMALLOCD(id3_tag, "id3v1_alloc_tag:tag"); - id3v1_tag *v1 = XMALLOCD0(id3v1_tag, "id3v1_alloc_tag:v1"); - - tag->tag = v1; - tag->version = 1; - - v1->genre = 0xFF; - - return tag; -} - -static id3_tag* -id3v2_alloc_tag(void) -{ - id3_tag *tag = XMALLOCD(id3_tag, "id3v2_alloc_tag:tag"); - id3v2_tag *v2 = XMALLOCD0(id3v2_tag, "id3v2_alloc_tag:v2"); - - tag->tag = v2; - tag->version = 2; - - return tag; -} - -static void -id3v1_free_tag(id3v1_tag* v1) -{ - xfree(v1->artist); - xfree(v1->album); - xfree(v1->title); - xfree(v1->year); - xfree(v1->comment); - xfree(v1); -} - -static void -id3v2_free_tag(id3v2_tag* v2) -{ - id3v2_frame_list* doomed; - id3v2_frame *frame; - - if(!v2) return; - - xfree(v2->header->extended_header); - xfree(v2->header); - - if(!v2->frame_list) - { - xfree(v2); - return; - } - - /* Freeing frames */ - do - { - frame = (id3v2_frame*)v2->frame_list->data; - if(frame->frame_id) xfree(frame->frame_id); - if(frame->data) xfree(frame->data); - xfree(v2->frame_list->data); - - doomed = v2->frame_list->next; - xfree(v2->frame_list); - - } while((v2->frame_list = doomed)); - - xfree(v2); -} diff --git a/mplib/src/mplib_s.h b/mplib/src/mplib_s.h deleted file mode 100755 index 7803a5e..0000000 --- a/mplib/src/mplib_s.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - * mplib - a library that enables you to edit ID3 tags - * Copyright (C) 2001,2002 Stefan Podkowinski - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; version 2.1. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "mplib.h" - -#ifndef __MPLIB_S_H -#define __MPLIB_S_H - -#undef __BEGIN_DECLS -#undef __END_DECLS -#ifdef __cplusplus -# define __BEGIN_DECLS extern "C" { -# define __END_DECLS } -#else -# define __BEGIN_DECLS /* empty */ -# define __END_DECLS /* empty */ -#endif - - -__BEGIN_DECLS - - -/************************************/ -/* Members */ -/************************************/ - -/* Bitrates br_[version]_[layer] ) */ -const static int br_1_1[16] = { -1, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 }; -const static int br_1_2[16] = { -1, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 }; -const static int br_1_3[16] = { -1, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 }; -const static int br_2_1[16] = { -1, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 }; -const static int br_2_2[16] = { -1, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 }; -const static int br_2_3[16] = { -1, 8, 16, 24, 32, 64, 80, 56, 64, 128, 160, 112, 128, 256, 320, 0 }; - -#define GLL 148 -const static char *genre_list[GLL] = -{ "Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", "Hip-Hop", "Jazz", - "Metal", "New Age", "Oldies", "Other", "Pop", "R&B", "Rap", "Reggae", "Rock", "Techno", - "Industrial", "Alternative", "Ska", "Death Metal", "Pranks", "Soundtrack", "Euro-Techno", - "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk", "Fusion", "Trance", "Classical", "Instrumental", - "Acid", "House", "Game", "Sound Clip", "Gospel", "Noise", "Alternative Rock", "Bass", "Soul", "Punk", - "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", "Ethnic", "Gothic", "Darkwave", - "Techno-Industrial", "Electronic", "Pop-Folk", "Eurodance", "Dream", "Southern Rock", "Comedy", - "Cult", "Gangsta Rap", "Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native American", "Cabaret", - "New Wave", "Psychedelic", "Rave", "Showtunes", "Trailer", "Lo-Fi", "Tribal", "Acid Punk", - "Acid Jazz", "Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock", "Folk", "Folk/Rock", - "National Folk", "Swing", "Fast-Fusion", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass", - "Avantgarde", "Gothic Rock", "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", - "Big Band", "Chorus", "Easy Listening", "Acoustic", "Humour", "Speech", "Chanson", "Opera", - "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus", "Porn Groove", "Satire", "Slow Jam", - "Club", "Tango", "Samba", "Folklore", "Ballad", "Power Ballad", "Rythmic Soul", "Freestyle", - "Duet", "Punk Rock", "Drum Solo", "A Cappella", "Euro-House", "Dance Hall", "Goa", "Drum & Bass", - "Club-House", "Hardcore", "Terror", "Indie", "BritPop", "Negerpunk", "Polsk Punk", "Beat", - "Christian Gangsta Rap", "Heavy Metal", "Black Metal", "Crossover", "Contemporary Christian", - "Christian Rock", "Merengue", "Salsa", "Trash Metal", "Anime", "JPop", "Synthpop" }; - - -/************************************/ -/* Macros */ -/************************************/ - -#define frame_is_read_only(id3v2_frame__) ((id3v2_frame__->status_flag >> 4) & 1) -#define frame_preserve_on_tag_altered(id3v2_frame__) ((id3v2_frame__->status_flag >> 6) & 1) -#define frame_preserve_on_file_altered(id3v2_frame__) ((id3v2_frame__->status_flag >> 5) & 1) - -#define frame_has_group_information(id3v2_frame__) ((id3v2_frame__->format_flag >> 6) & 1) -#define frame_is_compressed(id3v2_frame__) ((id3v2_frame__->format_flag >> 3) & 1) -#define frame_is_encrypted(id3v2_frame__) ((id3v2_frame__->format_flag >> 2) & 1) -#define frame_is_unsynchronised(id3v2_frame__) ((id3v2_frame__->format_flag >> 1) & 1) -#define frame_has_data_length_indicator(id3v2_frame__) (id3v2_frame__->format_flag & 1) - - -/************************************/ -/* Static functions */ -/************************************/ - - -/* Gets the v1/v2 tag from a file */ -static id3v1_tag *id3v1_get_tag(int); -static id3v2_tag *id3v2_get_tag(int); - -/* Adds v1/v2 Tag to file */ -static int id3v1_add_tag(int, id3v1_tag*); -static int id3v2_add_tag(int, id3v2_tag*, id3v2_tag*); - -/* Removes v1/v2 Tag from file */ -static int id3v1_del_tag(int); -static int id3v2_del_tag(int, id3v2_tag*); - -/* Truncates the fields of the tag to the proper lengths */ -static int id3v1_truncate_tag(id3v1_tag*); - -/* Returns 1 or 0 whether arg 1 is just filled up with space (0x20) or not */ -static int id3_is_only_space(char*, int); - -/* Gets all frame names available in the tag */ -static char **id3v2_get_names(id3v2_tag*); - -/* Gets the content of the given field in the tag on the specified position. */ -static id3_content* id3v2_get_content_at_pos(id3v2_tag*, const char*, int); -static id3_content* id3v1_get_content(id3v1_tag*, int); - -/* Gets the number of available frames */ -static int id3_get_no_frames(id3v2_tag*); - -/* Returns string of the frames content */ -/* static char* extract_frame_data(char *, int); */ - -/* Removes a frame from the frame list */ -static int id3_remove_frame(id3v2_frame_list *, id3v2_frame *); - -/* Adds a new frame to the list */ -static int id3_add_frame(id3v2_frame_list *, char *, char *, int); - -/* Lookups a frame by his identifier on the given position */ -static id3v2_frame* id3_lookup_frame(id3v2_frame_list *, const char *, const int); - -/* Sync functions */ -static long id3_unsync(unsigned char*, long); -static long id3_sync(unsigned char*, long); -static unsigned int id3_unsync32(unsigned char*, int); -static unsigned char* id3_sync32(unsigned int); - -static int id3_lseek_syncword(int); -static int id3_lseek_syncword_r(int, unsigned char *, int); - -/* Gets a new allocated v1 or v2 tag */ -static id3_tag* id3v1_alloc_tag(void); -static id3_tag* id3v2_alloc_tag(void); - -/* free functions */ -static void id3v1_free_tag(id3v1_tag*); -static void id3v2_free_tag(id3v2_tag*); - - -__END_DECLS - -#endif /* __MPLIB_S_H */ diff --git a/mplib/src/xmalloc.c b/mplib/src/xmalloc.c deleted file mode 100755 index a66be63..0000000 --- a/mplib/src/xmalloc.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * mplib - a library that enables you to edit ID3 tags - * Copyright (C) 2001,2002 Stefan Podkowinski - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; version 2.1. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include -#include -/* define XMALLOC_CHECK 1 */ -#include "xmalloc.h" -#ifdef USE_GC -# include -# define malloc(str) GC_MALLOC(str) -#endif - -#ifdef XMALLOC_CHECK -typedef struct _xdelem { - void* alloced; - void* freed; - char* descrl; - struct _xdelem* next; -} xdelem; - -xdelem* first = NULL; -#endif - -#define errmsg "mplib: Memory exhausted: Could not allocate %d bytes\n" - -void * -xmalloc(size_t s) -{ - return xmallocd(s, NULL); -} - -void * -xmallocd(size_t s, char* descrl) -{ - void *new = (void*)malloc(s); -#ifdef XMALLOC_CHECK - xdelem* cur = (xdelem*)malloc(sizeof(xdelem)); - cur->next = NULL; - cur->freed = NULL; - cur->descrl = descrl; -#endif - if(!new) fprintf(stderr, errmsg, s); - -#ifdef XMALLOC_CHECK - cur->alloced = new; - exists: - if(!first) first = cur; - else { - xdelem* last = first; - do { - if(last->alloced == cur->alloced) { - last->freed = NULL; - last->descrl = descrl; - free(cur); - goto exists; - } - } while(last->next && (last = last->next)); - last->next = cur; - } -#endif - - return new; -} - -void * -xmallocd0(size_t s, char* descr) -{ -#ifdef XMALLOC_CHECK - void *new = (void*)xmallocd(s, descr); -#else - void *new = (void*)malloc(s); -#endif - if(!new) fprintf(stderr, errmsg, s); - else memset(new, 0, s); - return new; -} - -void * -xmalloc0(size_t s) -{ -#ifdef XMALLOC_CHECK - void *new = (void*)xmalloc(s); -#else - void *new = (void*)malloc(s); -#endif - if(!new) fprintf(stderr, errmsg, s); - else memset(new, 0, s); - return new; -} - -void * -xrealloc(void * ptr, size_t s) -{ - void *new; - - if(!ptr) return xmalloc(s); - - new = (void*)realloc(ptr, s); - if(!new) fprintf(stderr, errmsg, s); - return new; -} - -void -xfree(void* ptr) { - if(!ptr) return; -#ifdef XMALLOC_CHECK - if(first) { - xdelem* el = first; - do { - if(el->freed == ptr) { - if(el->descrl) - printf("XMALLOC: (%s) memory allready freed\n", el->descrl); - else - printf("XMALLOC: memory allready freed at %h\n", ptr); - break; - } - if(el->alloced == ptr) { - el->freed = ptr; - break; - } - } while(el->next && (el = el->next)); - } -#endif - free(ptr); -} - - -#ifdef XMALLOC_CHECK -void -xprint_malloc_stat(void) { - long kb_alloc = 0; - long kb_freed = 0; - long kb_used = 0; - int count_used = 0; - xdelem* el = first; - - if(!first) { - puts("XMALLOC: No statistic available"); - } - puts("xmalloc statistic:"); - do { - if(!el->freed) { - if(el->descrl && !strstr(el->descrl, "ignore")) - printf("%s (not freed)\n", el->descrl); - else if(!el->descrl) printf("%p (not freed)\n", el->alloced); - } else { - //if(el->descrl) printf("%s (freed)\n", el->descrl); - //else printf("%p (freed)\n", el->alloced); - } - } while(el->next && (el = el->next)); -} -#endif diff --git a/mplib/src/xmalloc.h b/mplib/src/xmalloc.h deleted file mode 100755 index ecdf1b6..0000000 --- a/mplib/src/xmalloc.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * mplib - a library that enables you to edit ID3 tags - * Copyright (C) 2001,2002 Stefan Podkowinski - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; version 2.1. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __XMALLOC_H -#define __XMALLOC_H - -/* __BEGIN_DECLS should be used at the beginning of your declarations, - so that C++ compilers don't mangle their names. Use __END_DECLS at - the end of C declarations. */ -#undef __BEGIN_DECLS -#undef __END_DECLS -#ifdef __cplusplus -# define __BEGIN_DECLS extern "C" { -# define __END_DECLS } -#else -# define __BEGIN_DECLS /* empty */ -# define __END_DECLS /* empty */ -#endif - - -#define XMALLOC(type) ((type *) xmalloc(sizeof(type))) -#define XMALLOCD(type,descr) ((type *) xmallocd(sizeof(type),descr)) -#define XMALLOC0(type) ((type *) xmalloc0(sizeof(type))) -#define XMALLOCD0(type,descr) ((type *) xmallocd0(sizeof(type),descr)) - -__BEGIN_DECLS - -/* define XMALLOC_CHECK 1 */ - -void *xmalloc(size_t); -void *xmallocd(size_t, char*); -void *xmalloc0(size_t); -void *xmallocd0(size_t, char*); -void *xrealloc(void *, size_t); -void *xcalloc(size_t, size_t); -void xfree(void*); -#ifdef XMALLOC_CHECK -void xprint_malloc_stat(void); -#endif - -__END_DECLS - -#endif /* __XMALLOC_H */ diff --git a/mplib/stamp-h.in b/mplib/stamp-h.in deleted file mode 100644 index 9788f70..0000000 --- a/mplib/stamp-h.in +++ /dev/null @@ -1 +0,0 @@ -timestamp -- cgit v1.2.3